bootstrap 5.0.0.alpha2 → 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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/README.md +7 -4
  4. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  5. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  6. data/assets/javascripts/bootstrap-sprockets.js +10 -7
  7. data/assets/javascripts/bootstrap.js +2554 -2564
  8. data/assets/javascripts/bootstrap.min.js +3 -3
  9. data/assets/javascripts/bootstrap/alert.js +119 -115
  10. data/assets/javascripts/bootstrap/base-component.js +63 -0
  11. data/assets/javascripts/bootstrap/button.js +67 -69
  12. data/assets/javascripts/bootstrap/carousel.js +340 -331
  13. data/assets/javascripts/bootstrap/collapse.js +214 -209
  14. data/assets/javascripts/bootstrap/dom/data.js +35 -48
  15. data/assets/javascripts/bootstrap/dom/event-handler.js +105 -98
  16. data/assets/javascripts/bootstrap/dom/manipulator.js +26 -34
  17. data/assets/javascripts/bootstrap/dom/selector-engine.js +28 -41
  18. data/assets/javascripts/bootstrap/dropdown.js +392 -325
  19. data/assets/javascripts/bootstrap/modal.js +492 -434
  20. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  21. data/assets/javascripts/bootstrap/popover.js +114 -132
  22. data/assets/javascripts/bootstrap/scrollspy.js +172 -180
  23. data/assets/javascripts/bootstrap/tab.js +168 -144
  24. data/assets/javascripts/bootstrap/toast.js +141 -150
  25. data/assets/javascripts/bootstrap/tooltip.js +466 -452
  26. data/assets/stylesheets/_bootstrap-grid.scss +9 -9
  27. data/assets/stylesheets/_bootstrap-reboot.scss +3 -3
  28. data/assets/stylesheets/_bootstrap.scss +5 -3
  29. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  30. data/assets/stylesheets/bootstrap/_alert.scss +10 -3
  31. data/assets/stylesheets/bootstrap/_breadcrumb.scss +2 -4
  32. data/assets/stylesheets/bootstrap/_button-group.scss +5 -7
  33. data/assets/stylesheets/bootstrap/_buttons.scss +2 -15
  34. data/assets/stylesheets/bootstrap/_card.scss +2 -29
  35. data/assets/stylesheets/bootstrap/_carousel.scss +35 -18
  36. data/assets/stylesheets/bootstrap/_close.scss +2 -3
  37. data/assets/stylesheets/bootstrap/_dropdown.scss +33 -29
  38. data/assets/stylesheets/bootstrap/_forms.scss +1 -1
  39. data/assets/stylesheets/bootstrap/_functions.scss +11 -12
  40. data/assets/stylesheets/bootstrap/_list-group.scss +23 -6
  41. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  42. data/assets/stylesheets/bootstrap/_modal.scss +2 -9
  43. data/assets/stylesheets/bootstrap/_nav.scss +12 -0
  44. data/assets/stylesheets/bootstrap/_navbar.scss +15 -2
  45. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  46. data/assets/stylesheets/bootstrap/_pagination.scss +3 -3
  47. data/assets/stylesheets/bootstrap/_popover.scss +10 -22
  48. data/assets/stylesheets/bootstrap/_progress.scss +4 -1
  49. data/assets/stylesheets/bootstrap/_reboot.scss +48 -44
  50. data/assets/stylesheets/bootstrap/_root.scss +5 -5
  51. data/assets/stylesheets/bootstrap/_spinners.scss +18 -5
  52. data/assets/stylesheets/bootstrap/_tables.scss +15 -16
  53. data/assets/stylesheets/bootstrap/_toasts.scss +15 -12
  54. data/assets/stylesheets/bootstrap/_tooltip.scss +12 -12
  55. data/assets/stylesheets/bootstrap/_transitions.scss +2 -0
  56. data/assets/stylesheets/bootstrap/_utilities.scss +133 -70
  57. data/assets/stylesheets/bootstrap/_variables.scss +363 -207
  58. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +5 -5
  59. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  60. data/assets/stylesheets/bootstrap/forms/_form-check.scss +21 -11
  61. data/assets/stylesheets/bootstrap/forms/_form-control.scss +112 -9
  62. data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -46
  63. data/assets/stylesheets/bootstrap/forms/_form-select.scss +1 -16
  64. data/assets/stylesheets/bootstrap/forms/_input-group.scss +21 -40
  65. data/assets/stylesheets/bootstrap/forms/_validation.scss +1 -1
  66. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
  67. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
  68. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +1 -1
  69. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -1
  70. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +8 -6
  71. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +10 -5
  72. data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -6
  73. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  74. data/assets/stylesheets/bootstrap/mixins/_container.scss +2 -4
  75. data/assets/stylesheets/bootstrap/mixins/_forms.scss +26 -22
  76. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +5 -1
  77. data/assets/stylesheets/bootstrap/mixins/_grid.scss +18 -13
  78. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +3 -1
  79. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +5 -3
  80. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +7 -7
  81. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +19 -0
  82. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +3 -2
  83. data/assets/stylesheets/bootstrap/utilities/_api.scss +1 -1
  84. data/bootstrap.gemspec +1 -3
  85. data/lib/bootstrap/version.rb +2 -2
  86. data/tasks/updater/js.rb +20 -5
  87. data/tasks/updater/network.rb +7 -1
  88. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  89. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  90. data/test/dummy_rails/app/views/pages/root.html +89 -0
  91. data/test/dummy_rails/config/application.rb +0 -3
  92. data/test/gemfiles/rails_6_1.gemfile +7 -0
  93. metadata +20 -40
  94. data/assets/javascripts/bootstrap/dom/polyfill.js +0 -110
  95. data/assets/stylesheets/bootstrap/forms/_form-file.scss +0 -91
  96. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Bootstrap manipulator.js v5.0.0-alpha2 (https://getbootstrap.com/)
3
- * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap manipulator.js v5.0.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
@@ -9,11 +9,9 @@
9
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Manipulator = factory());
10
10
  }(this, (function () { 'use strict';
11
11
 
12
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
13
-
14
12
  /**
15
13
  * --------------------------------------------------------------------------
16
- * Bootstrap (v5.0.0-alpha2): dom/manipulator.js
14
+ * Bootstrap (v5.0.0): dom/manipulator.js
17
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
18
16
  * --------------------------------------------------------------------------
19
17
  */
@@ -38,57 +36,51 @@
38
36
  }
39
37
 
40
38
  function normalizeDataKey(key) {
41
- return key.replace(/[A-Z]/g, function (chr) {
42
- return "-" + chr.toLowerCase();
43
- });
39
+ return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
44
40
  }
45
41
 
46
- var Manipulator = {
47
- setDataAttribute: function setDataAttribute(element, key, value) {
48
- element.setAttribute("data-" + normalizeDataKey(key), value);
42
+ const Manipulator = {
43
+ setDataAttribute(element, key, value) {
44
+ element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
49
45
  },
50
- removeDataAttribute: function removeDataAttribute(element, key) {
51
- element.removeAttribute("data-" + normalizeDataKey(key));
46
+
47
+ removeDataAttribute(element, key) {
48
+ element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
52
49
  },
53
- getDataAttributes: function getDataAttributes(element) {
50
+
51
+ getDataAttributes(element) {
54
52
  if (!element) {
55
53
  return {};
56
54
  }
57
55
 
58
- var attributes = _extends({}, element.dataset);
59
-
60
- Object.keys(attributes).forEach(function (key) {
61
- attributes[key] = normalizeData(attributes[key]);
56
+ const attributes = {};
57
+ Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
58
+ let pureKey = key.replace(/^bs/, '');
59
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
60
+ attributes[pureKey] = normalizeData(element.dataset[key]);
62
61
  });
63
62
  return attributes;
64
63
  },
65
- getDataAttribute: function getDataAttribute(element, key) {
66
- return normalizeData(element.getAttribute("data-" + normalizeDataKey(key)));
64
+
65
+ getDataAttribute(element, key) {
66
+ return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
67
67
  },
68
- offset: function offset(element) {
69
- var rect = element.getBoundingClientRect();
68
+
69
+ offset(element) {
70
+ const rect = element.getBoundingClientRect();
70
71
  return {
71
72
  top: rect.top + document.body.scrollTop,
72
73
  left: rect.left + document.body.scrollLeft
73
74
  };
74
75
  },
75
- position: function position(element) {
76
+
77
+ position(element) {
76
78
  return {
77
79
  top: element.offsetTop,
78
80
  left: element.offsetLeft
79
81
  };
80
- },
81
- toggleClass: function toggleClass(element, className) {
82
- if (!element) {
83
- return;
84
- }
85
-
86
- if (element.classList.contains(className)) {
87
- element.classList.remove(className);
88
- } else {
89
- element.classList.add(className);
90
- }
91
82
  }
83
+
92
84
  };
93
85
 
94
86
  return Manipulator;
@@ -1,62 +1,46 @@
1
1
  /*!
2
- * Bootstrap selector-engine.js v5.0.0-alpha2 (https://getbootstrap.com/)
3
- * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap selector-engine.js v5.0.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./polyfill.js')) :
8
- typeof define === 'function' && define.amd ? define(['./polyfill.js'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(global.Polyfill));
10
- }(this, (function (polyfill_js) { 'use strict';
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
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.0.0-alpha2): dom/selector-engine.js
14
+ * Bootstrap (v5.0.0): dom/selector-engine.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
+
18
19
  /**
19
20
  * ------------------------------------------------------------------------
20
21
  * Constants
21
22
  * ------------------------------------------------------------------------
22
23
  */
23
-
24
- var NODE_TEXT = 3;
25
- var SelectorEngine = {
26
- matches: function matches(element, selector) {
27
- return element.matches(selector);
24
+ const NODE_TEXT = 3;
25
+ const SelectorEngine = {
26
+ find(selector, element = document.documentElement) {
27
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
28
28
  },
29
- find: function find(selector, element) {
30
- var _ref;
31
29
 
32
- if (element === void 0) {
33
- element = document.documentElement;
34
- }
35
-
36
- return (_ref = []).concat.apply(_ref, polyfill_js.find.call(element, selector));
30
+ findOne(selector, element = document.documentElement) {
31
+ return Element.prototype.querySelector.call(element, selector);
37
32
  },
38
- findOne: function findOne(selector, element) {
39
- if (element === void 0) {
40
- element = document.documentElement;
41
- }
42
33
 
43
- return polyfill_js.findOne.call(element, selector);
34
+ children(element, selector) {
35
+ return [].concat(...element.children).filter(child => child.matches(selector));
44
36
  },
45
- children: function children(element, selector) {
46
- var _ref2;
47
37
 
48
- var children = (_ref2 = []).concat.apply(_ref2, element.children);
49
-
50
- return children.filter(function (child) {
51
- return child.matches(selector);
52
- });
53
- },
54
- parents: function parents(element, selector) {
55
- var parents = [];
56
- var ancestor = element.parentNode;
38
+ parents(element, selector) {
39
+ const parents = [];
40
+ let ancestor = element.parentNode;
57
41
 
58
42
  while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
59
- if (this.matches(ancestor, selector)) {
43
+ if (ancestor.matches(selector)) {
60
44
  parents.push(ancestor);
61
45
  }
62
46
 
@@ -65,8 +49,9 @@
65
49
 
66
50
  return parents;
67
51
  },
68
- prev: function prev(element, selector) {
69
- var previous = element.previousElementSibling;
52
+
53
+ prev(element, selector) {
54
+ let previous = element.previousElementSibling;
70
55
 
71
56
  while (previous) {
72
57
  if (previous.matches(selector)) {
@@ -78,11 +63,12 @@
78
63
 
79
64
  return [];
80
65
  },
81
- next: function next(element, selector) {
82
- var next = element.nextElementSibling;
66
+
67
+ next(element, selector) {
68
+ let next = element.nextElementSibling;
83
69
 
84
70
  while (next) {
85
- if (this.matches(next, selector)) {
71
+ if (next.matches(selector)) {
86
72
  return [next];
87
73
  }
88
74
 
@@ -91,6 +77,7 @@
91
77
 
92
78
  return [];
93
79
  }
80
+
94
81
  };
95
82
 
96
83
  return SelectorEngine;
@@ -1,164 +1,235 @@
1
1
  /*!
2
- * Bootstrap dropdown.js v5.0.0-alpha2 (https://getbootstrap.com/)
3
- * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
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
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('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('popper.js'), require('./dom/selector-engine.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/event-handler.js', './dom/manipulator.js', 'popper.js', './dom/selector-engine.js'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Data, global.EventHandler, global.Manipulator, global.Popper, global.SelectorEngine));
10
- }(this, (function (Data, EventHandler, Manipulator, Popper, SelectorEngine) { 'use strict';
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
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
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
+ });
29
+ }
30
+ n['default'] = e;
31
+ return Object.freeze(n);
32
+ }
33
+
34
+ var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
14
35
  var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
15
36
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
37
  var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
17
- var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
18
38
  var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
39
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
19
40
 
20
41
  /**
21
42
  * --------------------------------------------------------------------------
22
- * Bootstrap (v5.0.0-alpha2): util/index.js
43
+ * Bootstrap (v5.0.0): util/index.js
23
44
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
24
45
  * --------------------------------------------------------------------------
25
46
  */
26
47
 
27
- var toType = function toType(obj) {
48
+ const toType = obj => {
28
49
  if (obj === null || obj === undefined) {
29
- return "" + obj;
50
+ return `${obj}`;
30
51
  }
31
52
 
32
53
  return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
33
54
  };
34
55
 
35
- var getSelector = function getSelector(element) {
36
- var selector = element.getAttribute('data-target');
56
+ const getSelector = element => {
57
+ let selector = element.getAttribute('data-bs-target');
37
58
 
38
59
  if (!selector || selector === '#') {
39
- var hrefAttr = element.getAttribute('href');
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
64
+
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]}`;
72
+ }
73
+
40
74
  selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
41
75
  }
42
76
 
43
77
  return selector;
44
78
  };
45
79
 
46
- var getElementFromSelector = function getElementFromSelector(element) {
47
- var selector = getSelector(element);
80
+ const getElementFromSelector = element => {
81
+ const selector = getSelector(element);
48
82
  return selector ? document.querySelector(selector) : null;
49
83
  };
50
84
 
51
- var isElement = function isElement(obj) {
52
- return (obj[0] || obj).nodeType;
53
- };
85
+ const isElement = obj => (obj[0] || obj).nodeType;
54
86
 
55
- var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) {
56
- Object.keys(configTypes).forEach(function (property) {
57
- var expectedTypes = configTypes[property];
58
- var value = config[property];
59
- var valueType = value && isElement(value) ? 'element' : toType(value);
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);
60
92
 
61
93
  if (!new RegExp(expectedTypes).test(valueType)) {
62
- throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
94
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
63
95
  }
64
96
  });
65
97
  };
66
98
 
67
- var isVisible = function isVisible(element) {
99
+ const isVisible = element => {
68
100
  if (!element) {
69
101
  return false;
70
102
  }
71
103
 
72
104
  if (element.style && element.parentNode && element.parentNode.style) {
73
- var elementStyle = getComputedStyle(element);
74
- var parentNodeStyle = getComputedStyle(element.parentNode);
105
+ const elementStyle = getComputedStyle(element);
106
+ const parentNodeStyle = getComputedStyle(element.parentNode);
75
107
  return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
76
108
  }
77
109
 
78
110
  return false;
79
111
  };
80
112
 
81
- var noop = function noop() {
82
- return function () {};
113
+ const isDisabled = element => {
114
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
115
+ return true;
116
+ }
117
+
118
+ if (element.classList.contains('disabled')) {
119
+ return true;
120
+ }
121
+
122
+ if (typeof element.disabled !== 'undefined') {
123
+ return element.disabled;
124
+ }
125
+
126
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
83
127
  };
84
128
 
85
- var getjQuery = function getjQuery() {
86
- var _window = window,
87
- jQuery = _window.jQuery;
129
+ const noop = () => {};
130
+
131
+ const getjQuery = () => {
132
+ const {
133
+ jQuery
134
+ } = window;
88
135
 
89
- if (jQuery && !document.body.hasAttribute('data-no-jquery')) {
136
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
90
137
  return jQuery;
91
138
  }
92
139
 
93
140
  return null;
94
141
  };
95
142
 
96
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
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';
97
152
 
98
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
153
+ const defineJQueryPlugin = (name, plugin) => {
154
+ onDOMContentLoaded(() => {
155
+ const $ = getjQuery();
156
+ /* istanbul ignore if */
99
157
 
100
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
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;
166
+ };
167
+ }
168
+ });
169
+ };
170
+
171
+ /**
172
+ * --------------------------------------------------------------------------
173
+ * Bootstrap (v5.0.0): dropdown.js
174
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
175
+ * --------------------------------------------------------------------------
176
+ */
101
177
  /**
102
178
  * ------------------------------------------------------------------------
103
179
  * Constants
104
180
  * ------------------------------------------------------------------------
105
181
  */
106
182
 
107
- var NAME = 'dropdown';
108
- var VERSION = '5.0.0-alpha2';
109
- var DATA_KEY = 'bs.dropdown';
110
- var EVENT_KEY = "." + DATA_KEY;
111
- var DATA_API_KEY = '.data-api';
112
- var ESCAPE_KEY = 'Escape';
113
- var SPACE_KEY = 'Space';
114
- var TAB_KEY = 'Tab';
115
- var ARROW_UP_KEY = 'ArrowUp';
116
- var ARROW_DOWN_KEY = 'ArrowDown';
117
- var RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
118
-
119
- var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEY + "|" + ARROW_DOWN_KEY + "|" + ESCAPE_KEY);
120
- var EVENT_HIDE = "hide" + EVENT_KEY;
121
- var EVENT_HIDDEN = "hidden" + EVENT_KEY;
122
- var EVENT_SHOW = "show" + EVENT_KEY;
123
- var EVENT_SHOWN = "shown" + EVENT_KEY;
124
- var EVENT_CLICK = "click" + EVENT_KEY;
125
- var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
126
- var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY;
127
- var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY;
128
- var CLASS_NAME_DISABLED = 'disabled';
129
- var CLASS_NAME_SHOW = 'show';
130
- var CLASS_NAME_DROPUP = 'dropup';
131
- var CLASS_NAME_DROPRIGHT = 'dropright';
132
- var CLASS_NAME_DROPLEFT = 'dropleft';
133
- var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
134
- var CLASS_NAME_NAVBAR = 'navbar';
135
- var CLASS_NAME_POSITION_STATIC = 'position-static';
136
- var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]';
137
- var SELECTOR_FORM_CHILD = '.dropdown form';
138
- var SELECTOR_MENU = '.dropdown-menu';
139
- var SELECTOR_NAVBAR_NAV = '.navbar-nav';
140
- var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
141
- var PLACEMENT_TOP = 'top-start';
142
- var PLACEMENT_TOPEND = 'top-end';
143
- var PLACEMENT_BOTTOM = 'bottom-start';
144
- var PLACEMENT_BOTTOMEND = 'bottom-end';
145
- var PLACEMENT_RIGHT = 'right-start';
146
- var PLACEMENT_LEFT = 'left-start';
147
- var Default = {
148
- offset: 0,
149
- flip: true,
150
- boundary: 'scrollParent',
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',
151
221
  reference: 'toggle',
152
222
  display: 'dynamic',
153
- popperConfig: null
223
+ popperConfig: null,
224
+ autoClose: true
154
225
  };
155
- var DefaultType = {
156
- offset: '(number|string|function)',
157
- flip: 'boolean',
226
+ const DefaultType = {
227
+ offset: '(array|string|function)',
158
228
  boundary: '(string|element)',
159
- reference: '(string|element)',
229
+ reference: '(string|element|object)',
160
230
  display: 'string',
161
- popperConfig: '(null|object)'
231
+ popperConfig: '(null|object|function)',
232
+ autoClose: '(boolean|string)'
162
233
  };
163
234
  /**
164
235
  * ------------------------------------------------------------------------
@@ -166,61 +237,70 @@
166
237
  * ------------------------------------------------------------------------
167
238
  */
168
239
 
169
- var Dropdown = /*#__PURE__*/function () {
170
- function Dropdown(element, config) {
171
- this._element = element;
240
+ class Dropdown extends BaseComponent__default['default'] {
241
+ constructor(element, config) {
242
+ super(element);
172
243
  this._popper = null;
173
244
  this._config = this._getConfig(config);
174
245
  this._menu = this._getMenuElement();
175
246
  this._inNavbar = this._detectNavbar();
176
247
 
177
248
  this._addEventListeners();
178
-
179
- Data__default['default'].setData(element, DATA_KEY, this);
180
249
  } // Getters
181
250
 
182
251
 
183
- var _proto = Dropdown.prototype;
252
+ static get Default() {
253
+ return Default;
254
+ }
255
+
256
+ static get DefaultType() {
257
+ return DefaultType;
258
+ }
259
+
260
+ static get DATA_KEY() {
261
+ return DATA_KEY;
262
+ } // Public
263
+
184
264
 
185
- // Public
186
- _proto.toggle = function toggle() {
187
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
265
+ toggle() {
266
+ if (isDisabled(this._element)) {
188
267
  return;
189
268
  }
190
269
 
191
- var isActive = this._element.classList.contains(CLASS_NAME_SHOW);
192
-
193
- Dropdown.clearMenus();
270
+ const isActive = this._element.classList.contains(CLASS_NAME_SHOW);
194
271
 
195
272
  if (isActive) {
273
+ this.hide();
196
274
  return;
197
275
  }
198
276
 
199
277
  this.show();
200
- };
278
+ }
201
279
 
202
- _proto.show = function show() {
203
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
280
+ show() {
281
+ if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
204
282
  return;
205
283
  }
206
284
 
207
- var parent = Dropdown.getParentFromElement(this._element);
208
- var relatedTarget = {
285
+ const parent = Dropdown.getParentFromElement(this._element);
286
+ const relatedTarget = {
209
287
  relatedTarget: this._element
210
288
  };
211
- var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
289
+ const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
212
290
 
213
291
  if (showEvent.defaultPrevented) {
214
292
  return;
215
- } // Disable totally Popper.js for Dropdown in Navbar
293
+ } // Totally disable Popper for Dropdowns in Navbar
216
294
 
217
295
 
218
- if (!this._inNavbar) {
219
- if (typeof Popper__default['default'] === 'undefined') {
220
- throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org)');
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)');
221
301
  }
222
302
 
223
- var referenceElement = this._element;
303
+ let referenceElement = this._element;
224
304
 
225
305
  if (this._config.reference === 'parent') {
226
306
  referenceElement = parent;
@@ -230,16 +310,18 @@
230
310
  if (typeof this._config.reference.jquery !== 'undefined') {
231
311
  referenceElement = this._config.reference[0];
232
312
  }
233
- } // If boundary is not `scrollParent`, then set position to `static`
234
- // to allow the menu to "escape" the scroll parent's boundaries
235
- // https://github.com/twbs/bootstrap/issues/24251
313
+ } else if (typeof this._config.reference === 'object') {
314
+ referenceElement = this._config.reference;
315
+ }
236
316
 
317
+ const popperConfig = this._getPopperConfig();
237
318
 
238
- if (this._config.boundary !== 'scrollParent') {
239
- parent.classList.add(CLASS_NAME_POSITION_STATIC);
240
- }
319
+ const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
320
+ this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
241
321
 
242
- this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig());
322
+ if (isDisplayStatic) {
323
+ Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
324
+ }
243
325
  } // If this is a touch-enabled device we add extra
244
326
  // empty mouseover listeners to the body's immediate children;
245
327
  // only needed because of broken event delegation on iOS
@@ -247,50 +329,33 @@
247
329
 
248
330
 
249
331
  if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
250
- var _ref;
251
-
252
- (_ref = []).concat.apply(_ref, document.body.children).forEach(function (elem) {
253
- return EventHandler__default['default'].on(elem, 'mouseover', null, noop());
254
- });
332
+ [].concat(...document.body.children).forEach(elem => EventHandler__default['default'].on(elem, 'mouseover', noop));
255
333
  }
256
334
 
257
335
  this._element.focus();
258
336
 
259
337
  this._element.setAttribute('aria-expanded', true);
260
338
 
261
- Manipulator__default['default'].toggleClass(this._menu, CLASS_NAME_SHOW);
262
- Manipulator__default['default'].toggleClass(this._element, CLASS_NAME_SHOW);
263
- EventHandler__default['default'].trigger(parent, EVENT_SHOWN, relatedTarget);
264
- };
339
+ this._menu.classList.toggle(CLASS_NAME_SHOW);
265
340
 
266
- _proto.hide = function hide() {
267
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
268
- return;
269
- }
341
+ this._element.classList.toggle(CLASS_NAME_SHOW);
270
342
 
271
- var parent = Dropdown.getParentFromElement(this._element);
272
- var relatedTarget = {
273
- relatedTarget: this._element
274
- };
275
- var hideEvent = EventHandler__default['default'].trigger(parent, EVENT_HIDE, relatedTarget);
343
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
344
+ }
276
345
 
277
- if (hideEvent.defaultPrevented) {
346
+ hide() {
347
+ if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
278
348
  return;
279
349
  }
280
350
 
281
- if (this._popper) {
282
- this._popper.destroy();
283
- }
351
+ const relatedTarget = {
352
+ relatedTarget: this._element
353
+ };
284
354
 
285
- Manipulator__default['default'].toggleClass(this._menu, CLASS_NAME_SHOW);
286
- Manipulator__default['default'].toggleClass(this._element, CLASS_NAME_SHOW);
287
- EventHandler__default['default'].trigger(parent, EVENT_HIDDEN, relatedTarget);
288
- };
355
+ this._completeHide(relatedTarget);
356
+ }
289
357
 
290
- _proto.dispose = function dispose() {
291
- Data__default['default'].removeData(this._element, DATA_KEY);
292
- EventHandler__default['default'].off(this._element, EVENT_KEY);
293
- this._element = null;
358
+ dispose() {
294
359
  this._menu = null;
295
360
 
296
361
  if (this._popper) {
@@ -298,108 +363,169 @@
298
363
 
299
364
  this._popper = null;
300
365
  }
301
- };
302
366
 
303
- _proto.update = function update() {
367
+ super.dispose();
368
+ }
369
+
370
+ update() {
304
371
  this._inNavbar = this._detectNavbar();
305
372
 
306
373
  if (this._popper) {
307
- this._popper.scheduleUpdate();
374
+ this._popper.update();
308
375
  }
309
376
  } // Private
310
- ;
311
377
 
312
- _proto._addEventListeners = function _addEventListeners() {
313
- var _this = this;
314
378
 
315
- EventHandler__default['default'].on(this._element, EVENT_CLICK, function (event) {
379
+ _addEventListeners() {
380
+ EventHandler__default['default'].on(this._element, EVENT_CLICK, event => {
316
381
  event.preventDefault();
317
- event.stopPropagation();
318
-
319
- _this.toggle();
382
+ this.toggle();
320
383
  });
321
- };
384
+ }
385
+
386
+ _completeHide(relatedTarget) {
387
+ const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
388
+
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
322
393
 
323
- _proto._getConfig = function _getConfig(config) {
324
- config = _extends({}, this.constructor.Default, Manipulator__default['default'].getDataAttributes(this._element), config);
394
+
395
+ if ('ontouchstart' in document.documentElement) {
396
+ [].concat(...document.body.children).forEach(elem => EventHandler__default['default'].off(elem, 'mouseover', noop));
397
+ }
398
+
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
417
+ };
325
418
  typeCheckConfig(NAME, config, this.constructor.DefaultType);
419
+
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
+ }
424
+
326
425
  return config;
327
- };
426
+ }
328
427
 
329
- _proto._getMenuElement = function _getMenuElement() {
428
+ _getMenuElement() {
330
429
  return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
331
- };
430
+ }
332
431
 
333
- _proto._getPlacement = function _getPlacement() {
334
- var parentDropdown = this._element.parentNode;
335
- var placement = PLACEMENT_BOTTOM; // Handle dropup
432
+ _getPlacement() {
433
+ const parentDropdown = this._element.parentNode;
336
434
 
337
- if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
338
- placement = PLACEMENT_TOP;
435
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
436
+ return PLACEMENT_RIGHT;
437
+ }
339
438
 
340
- if (this._menu.classList.contains(CLASS_NAME_MENURIGHT)) {
341
- placement = PLACEMENT_TOPEND;
342
- }
343
- } else if (parentDropdown.classList.contains(CLASS_NAME_DROPRIGHT)) {
344
- placement = PLACEMENT_RIGHT;
345
- } else if (parentDropdown.classList.contains(CLASS_NAME_DROPLEFT)) {
346
- placement = PLACEMENT_LEFT;
347
- } else if (this._menu.classList.contains(CLASS_NAME_MENURIGHT)) {
348
- placement = PLACEMENT_BOTTOMEND;
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
442
+
443
+
444
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
445
+
446
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
447
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
349
448
  }
350
449
 
351
- return placement;
352
- };
450
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
451
+ }
353
452
 
354
- _proto._detectNavbar = function _detectNavbar() {
355
- return Boolean(this._element.closest("." + CLASS_NAME_NAVBAR));
356
- };
453
+ _detectNavbar() {
454
+ return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
455
+ }
357
456
 
358
- _proto._getOffset = function _getOffset() {
359
- var _this2 = this;
457
+ _getOffset() {
458
+ const {
459
+ offset
460
+ } = this._config;
360
461
 
361
- var offset = {};
462
+ if (typeof offset === 'string') {
463
+ return offset.split(',').map(val => Number.parseInt(val, 10));
464
+ }
362
465
 
363
- if (typeof this._config.offset === 'function') {
364
- offset.fn = function (data) {
365
- data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
366
- return data;
367
- };
368
- } else {
369
- offset.offset = this._config.offset;
466
+ if (typeof offset === 'function') {
467
+ return popperData => offset(popperData, this._element);
370
468
  }
371
469
 
372
470
  return offset;
373
- };
471
+ }
374
472
 
375
- _proto._getPopperConfig = function _getPopperConfig() {
376
- var popperConfig = {
473
+ _getPopperConfig() {
474
+ const defaultBsPopperConfig = {
377
475
  placement: this._getPlacement(),
378
- modifiers: {
379
- offset: this._getOffset(),
380
- flip: {
381
- enabled: this._config.flip
382
- },
383
- preventOverflow: {
384
- boundariesElement: this._config.boundary
476
+ modifiers: [{
477
+ name: 'preventOverflow',
478
+ options: {
479
+ boundary: this._config.boundary
385
480
  }
386
- }
387
- }; // Disable Popper.js if we have a static display
481
+ }, {
482
+ name: 'offset',
483
+ options: {
484
+ offset: this._getOffset()
485
+ }
486
+ }]
487
+ }; // Disable Popper if we have a static display
388
488
 
389
489
  if (this._config.display === 'static') {
390
- popperConfig.modifiers.applyStyle = {
490
+ defaultBsPopperConfig.modifiers = [{
491
+ name: 'applyStyles',
391
492
  enabled: false
392
- };
493
+ }];
393
494
  }
394
495
 
395
- return _extends({}, popperConfig, this._config.popperConfig);
496
+ return { ...defaultBsPopperConfig,
497
+ ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
498
+ };
499
+ }
500
+
501
+ _selectMenuItem(event) {
502
+ const items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
503
+
504
+ if (!items.length) {
505
+ return;
506
+ }
507
+
508
+ let index = items.indexOf(event.target); // Up
509
+
510
+ if (event.key === ARROW_UP_KEY && index > 0) {
511
+ index--;
512
+ } // Down
513
+
514
+
515
+ if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
516
+ index++;
517
+ } // index is -1 if the first keydown is an ArrowUp
518
+
519
+
520
+ index = index === -1 ? 0 : index;
521
+ items[index].focus();
396
522
  } // Static
397
- ;
398
523
 
399
- Dropdown.dropdownInterface = function dropdownInterface(element, config) {
400
- var data = Data__default['default'].getData(element, DATA_KEY);
401
524
 
402
- var _config = typeof config === 'object' ? config : null;
525
+ static dropdownInterface(element, config) {
526
+ let data = Data__default['default'].get(element, DATA_KEY);
527
+
528
+ const _config = typeof config === 'object' ? config : null;
403
529
 
404
530
  if (!data) {
405
531
  data = new Dropdown(element, _config);
@@ -407,84 +533,74 @@
407
533
 
408
534
  if (typeof config === 'string') {
409
535
  if (typeof data[config] === 'undefined') {
410
- throw new TypeError("No method named \"" + config + "\"");
536
+ throw new TypeError(`No method named "${config}"`);
411
537
  }
412
538
 
413
539
  data[config]();
414
540
  }
415
- };
541
+ }
416
542
 
417
- Dropdown.jQueryInterface = function jQueryInterface(config) {
543
+ static jQueryInterface(config) {
418
544
  return this.each(function () {
419
545
  Dropdown.dropdownInterface(this, config);
420
546
  });
421
- };
422
-
423
- Dropdown.clearMenus = function clearMenus(event) {
424
- if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
425
- return;
426
- }
427
-
428
- var toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
429
-
430
- for (var i = 0, len = toggles.length; i < len; i++) {
431
- var parent = Dropdown.getParentFromElement(toggles[i]);
432
- var context = Data__default['default'].getData(toggles[i], DATA_KEY);
433
- var relatedTarget = {
434
- relatedTarget: toggles[i]
435
- };
547
+ }
436
548
 
437
- if (event && event.type === 'click') {
438
- relatedTarget.clickEvent = event;
549
+ static clearMenus(event) {
550
+ if (event) {
551
+ if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {
552
+ return;
439
553
  }
440
554
 
441
- if (!context) {
442
- continue;
555
+ if (/input|select|option|textarea|form/i.test(event.target.tagName)) {
556
+ return;
443
557
  }
558
+ }
444
559
 
445
- var dropdownMenu = context._menu;
560
+ const toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
446
561
 
447
- if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
562
+ for (let i = 0, len = toggles.length; i < len; i++) {
563
+ const context = Data__default['default'].get(toggles[i], DATA_KEY);
564
+
565
+ if (!context || context._config.autoClose === false) {
448
566
  continue;
449
567
  }
450
568
 
451
- if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.key === TAB_KEY) && dropdownMenu.contains(event.target)) {
569
+ if (!context._element.classList.contains(CLASS_NAME_SHOW)) {
452
570
  continue;
453
571
  }
454
572
 
455
- var hideEvent = EventHandler__default['default'].trigger(parent, EVENT_HIDE, relatedTarget);
456
-
457
- if (hideEvent.defaultPrevented) {
458
- continue;
459
- } // If this is a touch-enabled device we remove the extra
460
- // empty mouseover listeners we added for iOS support
573
+ const relatedTarget = {
574
+ relatedTarget: context._element
575
+ };
461
576
 
577
+ if (event) {
578
+ const composedPath = event.composedPath();
579
+ const isMenuTarget = composedPath.includes(context._menu);
462
580
 
463
- if ('ontouchstart' in document.documentElement) {
464
- var _ref2;
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
465
584
 
466
- (_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) {
467
- return EventHandler__default['default'].off(elem, 'mouseover', null, noop());
468
- });
469
- }
470
585
 
471
- toggles[i].setAttribute('aria-expanded', 'false');
586
+ if (event.type === 'keyup' && event.key === TAB_KEY && context._menu.contains(event.target)) {
587
+ continue;
588
+ }
472
589
 
473
- if (context._popper) {
474
- context._popper.destroy();
590
+ if (event.type === 'click') {
591
+ relatedTarget.clickEvent = event;
592
+ }
475
593
  }
476
594
 
477
- dropdownMenu.classList.remove(CLASS_NAME_SHOW);
478
- toggles[i].classList.remove(CLASS_NAME_SHOW);
479
- EventHandler__default['default'].trigger(parent, EVENT_HIDDEN, relatedTarget);
595
+ context._completeHide(relatedTarget);
480
596
  }
481
- };
597
+ }
482
598
 
483
- Dropdown.getParentFromElement = function getParentFromElement(element) {
599
+ static getParentFromElement(element) {
484
600
  return getElementFromSelector(element) || element.parentNode;
485
- };
601
+ }
486
602
 
487
- Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
603
+ static dataApiKeydownHandler(event) {
488
604
  // If not input/textarea:
489
605
  // - And not a key in REGEXP_KEYDOWN => not a dropdown command
490
606
  // If input/textarea:
@@ -496,74 +612,41 @@
496
612
  return;
497
613
  }
498
614
 
615
+ const isActive = this.classList.contains(CLASS_NAME_SHOW);
616
+
617
+ if (!isActive && event.key === ESCAPE_KEY) {
618
+ return;
619
+ }
620
+
499
621
  event.preventDefault();
500
622
  event.stopPropagation();
501
623
 
502
- if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
624
+ if (isDisabled(this)) {
503
625
  return;
504
626
  }
505
627
 
506
- var parent = Dropdown.getParentFromElement(this);
507
- var isActive = this.classList.contains(CLASS_NAME_SHOW);
628
+ const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
508
629
 
509
630
  if (event.key === ESCAPE_KEY) {
510
- var button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
511
- button.focus();
631
+ getToggleButton().focus();
512
632
  Dropdown.clearMenus();
513
633
  return;
514
634
  }
515
635
 
516
- if (!isActive || event.key === SPACE_KEY) {
517
- Dropdown.clearMenus();
636
+ if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
637
+ getToggleButton().click();
518
638
  return;
519
639
  }
520
640
 
521
- var items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible);
522
-
523
- if (!items.length) {
641
+ if (!isActive || event.key === SPACE_KEY) {
642
+ Dropdown.clearMenus();
524
643
  return;
525
644
  }
526
645
 
527
- var index = items.indexOf(event.target);
528
-
529
- if (event.key === ARROW_UP_KEY && index > 0) {
530
- // Up
531
- index--;
532
- }
533
-
534
- if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
535
- // Down
536
- index++;
537
- } // index is -1 if the first keydown is an ArrowUp
538
-
539
-
540
- index = index === -1 ? 0 : index;
541
- items[index].focus();
542
- };
543
-
544
- Dropdown.getInstance = function getInstance(element) {
545
- return Data__default['default'].getData(element, DATA_KEY);
546
- };
547
-
548
- _createClass(Dropdown, null, [{
549
- key: "VERSION",
550
- get: function get() {
551
- return VERSION;
552
- }
553
- }, {
554
- key: "Default",
555
- get: function get() {
556
- return Default;
557
- }
558
- }, {
559
- key: "DefaultType",
560
- get: function get() {
561
- return DefaultType;
562
- }
563
- }]);
646
+ Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
647
+ }
564
648
 
565
- return Dropdown;
566
- }();
649
+ }
567
650
  /**
568
651
  * ------------------------------------------------------------------------
569
652
  * Data Api implementation
@@ -577,32 +660,16 @@
577
660
  EventHandler__default['default'].on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
578
661
  EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
579
662
  event.preventDefault();
580
- event.stopPropagation();
581
- Dropdown.dropdownInterface(this, 'toggle');
582
- });
583
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
584
- return e.stopPropagation();
663
+ Dropdown.dropdownInterface(this);
585
664
  });
586
- var $ = getjQuery();
587
665
  /**
588
666
  * ------------------------------------------------------------------------
589
667
  * jQuery
590
668
  * ------------------------------------------------------------------------
591
- * add .dropdown to jQuery only if jQuery is present
669
+ * add .Dropdown to jQuery only if jQuery is present
592
670
  */
593
671
 
594
- /* istanbul ignore if */
595
-
596
- if ($) {
597
- var JQUERY_NO_CONFLICT = $.fn[NAME];
598
- $.fn[NAME] = Dropdown.jQueryInterface;
599
- $.fn[NAME].Constructor = Dropdown;
600
-
601
- $.fn[NAME].noConflict = function () {
602
- $.fn[NAME] = JQUERY_NO_CONFLICT;
603
- return Dropdown.jQueryInterface;
604
- };
605
- }
672
+ defineJQueryPlugin(NAME, Dropdown);
606
673
 
607
674
  return Dropdown;
608
675