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
@@ -1,143 +1,243 @@
1
1
  /*!
2
- * Bootstrap collapse.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 collapse.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('./util.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
9
- (global = global || self, global.Collapse = factory(global.jQuery, global.Util));
10
- }(this, function ($, Util) { 'use strict';
11
-
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
14
-
15
- function _defineProperties(target, props) {
16
- for (var i = 0; i < props.length; i++) {
17
- var descriptor = props[i];
18
- descriptor.enumerable = descriptor.enumerable || false;
19
- descriptor.configurable = true;
20
- if ("value" in descriptor) descriptor.writable = true;
21
- Object.defineProperty(target, descriptor.key, descriptor);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(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(['./dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
+ }(this, (function (Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
15
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
17
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
18
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
19
+
20
+ /**
21
+ * --------------------------------------------------------------------------
22
+ * Bootstrap (v5.1.0): util/index.js
23
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
24
+ * --------------------------------------------------------------------------
25
+ */
26
+
27
+ const toType = obj => {
28
+ if (obj === null || obj === undefined) {
29
+ return `${obj}`;
22
30
  }
23
- }
24
31
 
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
32
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
33
+ };
30
34
 
31
- function _defineProperty(obj, key, value) {
32
- if (key in obj) {
33
- Object.defineProperty(obj, key, {
34
- value: value,
35
- enumerable: true,
36
- configurable: true,
37
- writable: true
38
- });
39
- } else {
40
- obj[key] = value;
35
+ const getSelector = element => {
36
+ let selector = element.getAttribute('data-bs-target');
37
+
38
+ if (!selector || selector === '#') {
39
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
40
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
41
+ // `document.querySelector` will rightfully complain it is invalid.
42
+ // See https://github.com/twbs/bootstrap/issues/32273
43
+
44
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
45
+ return null;
46
+ } // Just in case some CMS puts out a full URL with the anchor appended
47
+
48
+
49
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
50
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
51
+ }
52
+
53
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
41
54
  }
42
55
 
43
- return obj;
44
- }
56
+ return selector;
57
+ };
58
+
59
+ const getSelectorFromElement = element => {
60
+ const selector = getSelector(element);
61
+
62
+ if (selector) {
63
+ return document.querySelector(selector) ? selector : null;
64
+ }
65
+
66
+ return null;
67
+ };
68
+
69
+ const getElementFromSelector = element => {
70
+ const selector = getSelector(element);
71
+ return selector ? document.querySelector(selector) : null;
72
+ };
73
+
74
+ const isElement = obj => {
75
+ if (!obj || typeof obj !== 'object') {
76
+ return false;
77
+ }
78
+
79
+ if (typeof obj.jquery !== 'undefined') {
80
+ obj = obj[0];
81
+ }
82
+
83
+ return typeof obj.nodeType !== 'undefined';
84
+ };
45
85
 
46
- function _objectSpread(target) {
47
- for (var i = 1; i < arguments.length; i++) {
48
- var source = arguments[i] != null ? arguments[i] : {};
49
- var ownKeys = Object.keys(source);
86
+ const getElement = obj => {
87
+ if (isElement(obj)) {
88
+ // it's a jQuery object or a node element
89
+ return obj.jquery ? obj[0] : obj;
90
+ }
50
91
 
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
92
+ if (typeof obj === 'string' && obj.length > 0) {
93
+ return document.querySelector(obj);
94
+ }
95
+
96
+ return null;
97
+ };
98
+
99
+ const typeCheckConfig = (componentName, config, configTypes) => {
100
+ Object.keys(configTypes).forEach(property => {
101
+ const expectedTypes = configTypes[property];
102
+ const value = config[property];
103
+ const valueType = value && isElement(value) ? 'element' : toType(value);
104
+
105
+ if (!new RegExp(expectedTypes).test(valueType)) {
106
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
55
107
  }
108
+ });
109
+ };
110
+ /**
111
+ * Trick to restart an element's animation
112
+ *
113
+ * @param {HTMLElement} element
114
+ * @return void
115
+ *
116
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
117
+ */
56
118
 
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
59
- });
119
+
120
+ const reflow = element => {
121
+ // eslint-disable-next-line no-unused-expressions
122
+ element.offsetHeight;
123
+ };
124
+
125
+ const getjQuery = () => {
126
+ const {
127
+ jQuery
128
+ } = window;
129
+
130
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
131
+ return jQuery;
60
132
  }
61
133
 
62
- return target;
63
- }
134
+ return null;
135
+ };
136
+
137
+ const DOMContentLoadedCallbacks = [];
138
+
139
+ const onDOMContentLoaded = callback => {
140
+ if (document.readyState === 'loading') {
141
+ // add listener on the first call when the document is in loading state
142
+ if (!DOMContentLoadedCallbacks.length) {
143
+ document.addEventListener('DOMContentLoaded', () => {
144
+ DOMContentLoadedCallbacks.forEach(callback => callback());
145
+ });
146
+ }
147
+
148
+ DOMContentLoadedCallbacks.push(callback);
149
+ } else {
150
+ callback();
151
+ }
152
+ };
153
+
154
+ const defineJQueryPlugin = plugin => {
155
+ onDOMContentLoaded(() => {
156
+ const $ = getjQuery();
157
+ /* istanbul ignore if */
158
+
159
+ if ($) {
160
+ const name = plugin.NAME;
161
+ const JQUERY_NO_CONFLICT = $.fn[name];
162
+ $.fn[name] = plugin.jQueryInterface;
163
+ $.fn[name].Constructor = plugin;
164
+
165
+ $.fn[name].noConflict = () => {
166
+ $.fn[name] = JQUERY_NO_CONFLICT;
167
+ return plugin.jQueryInterface;
168
+ };
169
+ }
170
+ });
171
+ };
64
172
 
173
+ /**
174
+ * --------------------------------------------------------------------------
175
+ * Bootstrap (v5.1.0): collapse.js
176
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
177
+ * --------------------------------------------------------------------------
178
+ */
65
179
  /**
66
180
  * ------------------------------------------------------------------------
67
181
  * Constants
68
182
  * ------------------------------------------------------------------------
69
183
  */
70
184
 
71
- var NAME = 'collapse';
72
- var VERSION = '4.3.0';
73
- var DATA_KEY = 'bs.collapse';
74
- var EVENT_KEY = "." + DATA_KEY;
75
- var DATA_API_KEY = '.data-api';
76
- var JQUERY_NO_CONFLICT = $.fn[NAME];
77
- var Default = {
185
+ const NAME = 'collapse';
186
+ const DATA_KEY = 'bs.collapse';
187
+ const EVENT_KEY = `.${DATA_KEY}`;
188
+ const DATA_API_KEY = '.data-api';
189
+ const Default = {
78
190
  toggle: true,
79
- parent: ''
191
+ parent: null
80
192
  };
81
- var DefaultType = {
193
+ const DefaultType = {
82
194
  toggle: 'boolean',
83
- parent: '(string|element)'
84
- };
85
- var Event = {
86
- SHOW: "show" + EVENT_KEY,
87
- SHOWN: "shown" + EVENT_KEY,
88
- HIDE: "hide" + EVENT_KEY,
89
- HIDDEN: "hidden" + EVENT_KEY,
90
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
91
- };
92
- var ClassName = {
93
- SHOW: 'show',
94
- COLLAPSE: 'collapse',
95
- COLLAPSING: 'collapsing',
96
- COLLAPSED: 'collapsed'
97
- };
98
- var Dimension = {
99
- WIDTH: 'width',
100
- HEIGHT: 'height'
101
- };
102
- var Selector = {
103
- ACTIVES: '.show, .collapsing',
104
- DATA_TOGGLE: '[data-toggle="collapse"]'
105
- /**
106
- * ------------------------------------------------------------------------
107
- * Class Definition
108
- * ------------------------------------------------------------------------
109
- */
110
-
195
+ parent: '(null|element)'
111
196
  };
197
+ const EVENT_SHOW = `show${EVENT_KEY}`;
198
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
199
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
200
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
201
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
202
+ const CLASS_NAME_SHOW = 'show';
203
+ const CLASS_NAME_COLLAPSE = 'collapse';
204
+ const CLASS_NAME_COLLAPSING = 'collapsing';
205
+ const CLASS_NAME_COLLAPSED = 'collapsed';
206
+ const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
207
+ const WIDTH = 'width';
208
+ const HEIGHT = 'height';
209
+ const SELECTOR_ACTIVES = '.show, .collapsing';
210
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
211
+ /**
212
+ * ------------------------------------------------------------------------
213
+ * Class Definition
214
+ * ------------------------------------------------------------------------
215
+ */
112
216
 
113
- var Collapse =
114
- /*#__PURE__*/
115
- function () {
116
- function Collapse(element, config) {
217
+ class Collapse extends BaseComponent__default['default'] {
218
+ constructor(element, config) {
219
+ super(element);
117
220
  this._isTransitioning = false;
118
- this._element = element;
119
221
  this._config = this._getConfig(config);
120
- this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
121
- var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
122
-
123
- for (var i = 0, len = toggleList.length; i < len; i++) {
124
- var elem = toggleList[i];
125
- var selector = Util.getSelectorFromElement(elem);
126
- var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
127
- return foundElem === element;
128
- });
222
+ this._triggerArray = [];
223
+ const toggleList = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
224
+
225
+ for (let i = 0, len = toggleList.length; i < len; i++) {
226
+ const elem = toggleList[i];
227
+ const selector = getSelectorFromElement(elem);
228
+ const filterElement = SelectorEngine__default['default'].find(selector).filter(foundElem => foundElem === this._element);
129
229
 
130
- if (selector !== null && filterElement.length > 0) {
230
+ if (selector !== null && filterElement.length) {
131
231
  this._selector = selector;
132
232
 
133
233
  this._triggerArray.push(elem);
134
234
  }
135
235
  }
136
236
 
137
- this._parent = this._config.parent ? this._getParent() : null;
237
+ this._initializeChildren();
138
238
 
139
239
  if (!this._config.parent) {
140
- this._addAriaAndCollapsedClass(this._element, this._triggerArray);
240
+ this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
141
241
  }
142
242
 
143
243
  if (this._config.toggle) {
@@ -146,244 +246,218 @@
146
246
  } // Getters
147
247
 
148
248
 
149
- var _proto = Collapse.prototype;
249
+ static get Default() {
250
+ return Default;
251
+ }
252
+
253
+ static get NAME() {
254
+ return NAME;
255
+ } // Public
150
256
 
151
- // Public
152
- _proto.toggle = function toggle() {
153
- if ($(this._element).hasClass(ClassName.SHOW)) {
257
+
258
+ toggle() {
259
+ if (this._isShown()) {
154
260
  this.hide();
155
261
  } else {
156
262
  this.show();
157
263
  }
158
- };
159
-
160
- _proto.show = function show() {
161
- var _this = this;
264
+ }
162
265
 
163
- if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
266
+ show() {
267
+ if (this._isTransitioning || this._isShown()) {
164
268
  return;
165
269
  }
166
270
 
167
- var actives;
168
- var activesData;
169
-
170
- if (this._parent) {
171
- actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
172
- if (typeof _this._config.parent === 'string') {
173
- return elem.getAttribute('data-parent') === _this._config.parent;
174
- }
271
+ let actives = [];
272
+ let activesData;
175
273
 
176
- return elem.classList.contains(ClassName.COLLAPSE);
177
- });
178
-
179
- if (actives.length === 0) {
180
- actives = null;
181
- }
274
+ if (this._config.parent) {
275
+ const children = SelectorEngine__default['default'].find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
276
+ actives = SelectorEngine__default['default'].find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
182
277
  }
183
278
 
184
- if (actives) {
185
- activesData = $(actives).not(this._selector).data(DATA_KEY);
279
+ const container = SelectorEngine__default['default'].findOne(this._selector);
280
+
281
+ if (actives.length) {
282
+ const tempActiveData = actives.find(elem => container !== elem);
283
+ activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
186
284
 
187
285
  if (activesData && activesData._isTransitioning) {
188
286
  return;
189
287
  }
190
288
  }
191
289
 
192
- var startEvent = $.Event(Event.SHOW);
193
- $(this._element).trigger(startEvent);
290
+ const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
194
291
 
195
- if (startEvent.isDefaultPrevented()) {
292
+ if (startEvent.defaultPrevented) {
196
293
  return;
197
294
  }
198
295
 
199
- if (actives) {
200
- Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
296
+ actives.forEach(elemActive => {
297
+ if (container !== elemActive) {
298
+ Collapse.getOrCreateInstance(elemActive, {
299
+ toggle: false
300
+ }).hide();
301
+ }
201
302
 
202
303
  if (!activesData) {
203
- $(actives).data(DATA_KEY, null);
304
+ Data__default['default'].set(elemActive, DATA_KEY, null);
204
305
  }
205
- }
306
+ });
307
+
308
+ const dimension = this._getDimension();
309
+
310
+ this._element.classList.remove(CLASS_NAME_COLLAPSE);
206
311
 
207
- var dimension = this._getDimension();
312
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
208
313
 
209
- $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
210
314
  this._element.style[dimension] = 0;
211
315
 
212
- if (this._triggerArray.length) {
213
- $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
214
- }
316
+ this._addAriaAndCollapsedClass(this._triggerArray, true);
317
+
318
+ this._isTransitioning = true;
215
319
 
216
- this.setTransitioning(true);
320
+ const complete = () => {
321
+ this._isTransitioning = false;
217
322
 
218
- var complete = function complete() {
219
- $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
220
- _this._element.style[dimension] = '';
323
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
221
324
 
222
- _this.setTransitioning(false);
325
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
223
326
 
224
- $(_this._element).trigger(Event.SHOWN);
327
+ this._element.style[dimension] = '';
328
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
225
329
  };
226
330
 
227
- var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
228
- var scrollSize = "scroll" + capitalizedDimension;
229
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
230
- $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
231
- this._element.style[dimension] = this._element[scrollSize] + "px";
232
- };
331
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
332
+ const scrollSize = `scroll${capitalizedDimension}`;
233
333
 
234
- _proto.hide = function hide() {
235
- var _this2 = this;
334
+ this._queueCallback(complete, this._element, true);
335
+
336
+ this._element.style[dimension] = `${this._element[scrollSize]}px`;
337
+ }
236
338
 
237
- if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
339
+ hide() {
340
+ if (this._isTransitioning || !this._isShown()) {
238
341
  return;
239
342
  }
240
343
 
241
- var startEvent = $.Event(Event.HIDE);
242
- $(this._element).trigger(startEvent);
344
+ const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
243
345
 
244
- if (startEvent.isDefaultPrevented()) {
346
+ if (startEvent.defaultPrevented) {
245
347
  return;
246
348
  }
247
349
 
248
- var dimension = this._getDimension();
350
+ const dimension = this._getDimension();
249
351
 
250
- this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
251
- Util.reflow(this._element);
252
- $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
253
- var triggerArrayLength = this._triggerArray.length;
352
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
353
+ reflow(this._element);
254
354
 
255
- if (triggerArrayLength > 0) {
256
- for (var i = 0; i < triggerArrayLength; i++) {
257
- var trigger = this._triggerArray[i];
258
- var selector = Util.getSelectorFromElement(trigger);
355
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
259
356
 
260
- if (selector !== null) {
261
- var $elem = $([].slice.call(document.querySelectorAll(selector)));
357
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
262
358
 
263
- if (!$elem.hasClass(ClassName.SHOW)) {
264
- $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
265
- }
266
- }
359
+ const triggerArrayLength = this._triggerArray.length;
360
+
361
+ for (let i = 0; i < triggerArrayLength; i++) {
362
+ const trigger = this._triggerArray[i];
363
+ const elem = getElementFromSelector(trigger);
364
+
365
+ if (elem && !this._isShown(elem)) {
366
+ this._addAriaAndCollapsedClass([trigger], false);
267
367
  }
268
368
  }
269
369
 
270
- this.setTransitioning(true);
370
+ this._isTransitioning = true;
371
+
372
+ const complete = () => {
373
+ this._isTransitioning = false;
271
374
 
272
- var complete = function complete() {
273
- _this2.setTransitioning(false);
375
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
274
376
 
275
- $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
377
+ this._element.classList.add(CLASS_NAME_COLLAPSE);
378
+
379
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
276
380
  };
277
381
 
278
382
  this._element.style[dimension] = '';
279
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
280
- $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
281
- };
282
-
283
- _proto.setTransitioning = function setTransitioning(isTransitioning) {
284
- this._isTransitioning = isTransitioning;
285
- };
286
-
287
- _proto.dispose = function dispose() {
288
- $.removeData(this._element, DATA_KEY);
289
- this._config = null;
290
- this._parent = null;
291
- this._element = null;
292
- this._triggerArray = null;
293
- this._isTransitioning = null;
383
+
384
+ this._queueCallback(complete, this._element, true);
385
+ }
386
+
387
+ _isShown(element = this._element) {
388
+ return element.classList.contains(CLASS_NAME_SHOW);
294
389
  } // Private
295
- ;
296
390
 
297
- _proto._getConfig = function _getConfig(config) {
298
- config = _objectSpread({}, Default, config);
391
+
392
+ _getConfig(config) {
393
+ config = { ...Default,
394
+ ...Manipulator__default['default'].getDataAttributes(this._element),
395
+ ...config
396
+ };
299
397
  config.toggle = Boolean(config.toggle); // Coerce string values
300
398
 
301
- Util.typeCheckConfig(NAME, config, DefaultType);
399
+ config.parent = getElement(config.parent);
400
+ typeCheckConfig(NAME, config, DefaultType);
302
401
  return config;
303
- };
304
-
305
- _proto._getDimension = function _getDimension() {
306
- var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
307
- return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
308
- };
402
+ }
309
403
 
310
- _proto._getParent = function _getParent() {
311
- var _this3 = this;
404
+ _getDimension() {
405
+ return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
406
+ }
312
407
 
313
- var parent;
408
+ _initializeChildren() {
409
+ if (!this._config.parent) {
410
+ return;
411
+ }
314
412
 
315
- if (Util.isElement(this._config.parent)) {
316
- parent = this._config.parent; // It's a jQuery object
413
+ const children = SelectorEngine__default['default'].find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
414
+ SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
415
+ const selected = getElementFromSelector(element);
317
416
 
318
- if (typeof this._config.parent.jquery !== 'undefined') {
319
- parent = this._config.parent[0];
417
+ if (selected) {
418
+ this._addAriaAndCollapsedClass([element], this._isShown(selected));
320
419
  }
321
- } else {
322
- parent = document.querySelector(this._config.parent);
323
- }
324
-
325
- var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
326
- var children = [].slice.call(parent.querySelectorAll(selector));
327
- $(children).each(function (i, element) {
328
- _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
329
420
  });
330
- return parent;
331
- };
332
-
333
- _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
334
- var isOpen = $(element).hasClass(ClassName.SHOW);
421
+ }
335
422
 
336
- if (triggerArray.length) {
337
- $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
423
+ _addAriaAndCollapsedClass(triggerArray, isOpen) {
424
+ if (!triggerArray.length) {
425
+ return;
338
426
  }
427
+
428
+ triggerArray.forEach(elem => {
429
+ if (isOpen) {
430
+ elem.classList.remove(CLASS_NAME_COLLAPSED);
431
+ } else {
432
+ elem.classList.add(CLASS_NAME_COLLAPSED);
433
+ }
434
+
435
+ elem.setAttribute('aria-expanded', isOpen);
436
+ });
339
437
  } // Static
340
- ;
341
438
 
342
- Collapse._getTargetFromElement = function _getTargetFromElement(element) {
343
- var selector = Util.getSelectorFromElement(element);
344
- return selector ? document.querySelector(selector) : null;
345
- };
346
439
 
347
- Collapse._jQueryInterface = function _jQueryInterface(config) {
440
+ static jQueryInterface(config) {
348
441
  return this.each(function () {
349
- var $this = $(this);
350
- var data = $this.data(DATA_KEY);
442
+ const _config = {};
351
443
 
352
- var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
353
-
354
- if (!data && _config.toggle && /show|hide/.test(config)) {
444
+ if (typeof config === 'string' && /show|hide/.test(config)) {
355
445
  _config.toggle = false;
356
446
  }
357
447
 
358
- if (!data) {
359
- data = new Collapse(this, _config);
360
- $this.data(DATA_KEY, data);
361
- }
448
+ const data = Collapse.getOrCreateInstance(this, _config);
362
449
 
363
450
  if (typeof config === 'string') {
364
451
  if (typeof data[config] === 'undefined') {
365
- throw new TypeError("No method named \"" + config + "\"");
452
+ throw new TypeError(`No method named "${config}"`);
366
453
  }
367
454
 
368
455
  data[config]();
369
456
  }
370
457
  });
371
- };
372
-
373
- _createClass(Collapse, null, [{
374
- key: "VERSION",
375
- get: function get() {
376
- return VERSION;
377
- }
378
- }, {
379
- key: "Default",
380
- get: function get() {
381
- return Default;
382
- }
383
- }]);
458
+ }
384
459
 
385
- return Collapse;
386
- }();
460
+ }
387
461
  /**
388
462
  * ------------------------------------------------------------------------
389
463
  * Data Api implementation
@@ -391,37 +465,29 @@
391
465
  */
392
466
 
393
467
 
394
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
468
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
395
469
  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
396
- if (event.currentTarget.tagName === 'A') {
470
+ if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
397
471
  event.preventDefault();
398
472
  }
399
473
 
400
- var $trigger = $(this);
401
- var selector = Util.getSelectorFromElement(this);
402
- var selectors = [].slice.call(document.querySelectorAll(selector));
403
- $(selectors).each(function () {
404
- var $target = $(this);
405
- var data = $target.data(DATA_KEY);
406
- var config = data ? 'toggle' : $trigger.data();
407
-
408
- Collapse._jQueryInterface.call($target, config);
474
+ const selector = getSelectorFromElement(this);
475
+ const selectorElements = SelectorEngine__default['default'].find(selector);
476
+ selectorElements.forEach(element => {
477
+ Collapse.getOrCreateInstance(element, {
478
+ toggle: false
479
+ }).toggle();
409
480
  });
410
481
  });
411
482
  /**
412
483
  * ------------------------------------------------------------------------
413
484
  * jQuery
414
485
  * ------------------------------------------------------------------------
486
+ * add .Collapse to jQuery only if jQuery is present
415
487
  */
416
488
 
417
- $.fn[NAME] = Collapse._jQueryInterface;
418
- $.fn[NAME].Constructor = Collapse;
419
-
420
- $.fn[NAME].noConflict = function () {
421
- $.fn[NAME] = JQUERY_NO_CONFLICT;
422
- return Collapse._jQueryInterface;
423
- };
489
+ defineJQueryPlugin(Collapse);
424
490
 
425
491
  return Collapse;
426
492
 
427
- }));
493
+ })));