bootstrap 4.3.1 → 5.1.3

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 +172 -136
  6. data/assets/javascripts/bootstrap/base-component.js +182 -0
  7. data/assets/javascripts/bootstrap/button.js +101 -142
  8. data/assets/javascripts/bootstrap/carousel.js +483 -408
  9. data/assets/javascripts/bootstrap/collapse.js +340 -273
  10. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +321 -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 +491 -399
  15. data/assets/javascripts/bootstrap/modal.js +841 -449
  16. data/assets/javascripts/bootstrap/offcanvas.js +866 -0
  17. data/assets/javascripts/bootstrap/popover.js +121 -198
  18. data/assets/javascripts/bootstrap/scrollspy.js +256 -240
  19. data/assets/javascripts/bootstrap/tab.js +218 -154
  20. data/assets/javascripts/bootstrap/toast.js +329 -189
  21. data/assets/javascripts/bootstrap/tooltip.js +651 -552
  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 +3503 -2892
  26. data/assets/javascripts/bootstrap.min.js +4 -4
  27. data/assets/stylesheets/_bootstrap-grid.scss +56 -18
  28. data/assets/stylesheets/_bootstrap-reboot.scss +5 -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 +243 -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 +43 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  59. data/assets/stylesheets/bootstrap/_tables.scss +84 -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 +1007 -489
  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 +72 -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 +132 -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 +278 -128
  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,244 @@
1
1
  /*!
2
- * Bootstrap collapse.js v4.3.1 (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.3 (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
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
+
14
+ const Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
15
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
17
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
18
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
19
+
20
+ /**
21
+ * --------------------------------------------------------------------------
22
+ * Bootstrap (v5.1.3): 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.3): 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.1';
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_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
207
+ const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
208
+ const WIDTH = 'width';
209
+ const HEIGHT = 'height';
210
+ const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
211
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
212
+ /**
213
+ * ------------------------------------------------------------------------
214
+ * Class Definition
215
+ * ------------------------------------------------------------------------
216
+ */
112
217
 
113
- var Collapse =
114
- /*#__PURE__*/
115
- function () {
116
- function Collapse(element, config) {
218
+ class Collapse extends BaseComponent__default.default {
219
+ constructor(element, config) {
220
+ super(element);
117
221
  this._isTransitioning = false;
118
- this._element = element;
119
222
  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
- });
223
+ this._triggerArray = [];
224
+ const toggleList = SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE);
225
+
226
+ for (let i = 0, len = toggleList.length; i < len; i++) {
227
+ const elem = toggleList[i];
228
+ const selector = getSelectorFromElement(elem);
229
+ const filterElement = SelectorEngine__default.default.find(selector).filter(foundElem => foundElem === this._element);
129
230
 
130
- if (selector !== null && filterElement.length > 0) {
231
+ if (selector !== null && filterElement.length) {
131
232
  this._selector = selector;
132
233
 
133
234
  this._triggerArray.push(elem);
134
235
  }
135
236
  }
136
237
 
137
- this._parent = this._config.parent ? this._getParent() : null;
238
+ this._initializeChildren();
138
239
 
139
240
  if (!this._config.parent) {
140
- this._addAriaAndCollapsedClass(this._element, this._triggerArray);
241
+ this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
141
242
  }
142
243
 
143
244
  if (this._config.toggle) {
@@ -146,244 +247,218 @@
146
247
  } // Getters
147
248
 
148
249
 
149
- var _proto = Collapse.prototype;
250
+ static get Default() {
251
+ return Default;
252
+ }
253
+
254
+ static get NAME() {
255
+ return NAME;
256
+ } // Public
150
257
 
151
- // Public
152
- _proto.toggle = function toggle() {
153
- if ($(this._element).hasClass(ClassName.SHOW)) {
258
+
259
+ toggle() {
260
+ if (this._isShown()) {
154
261
  this.hide();
155
262
  } else {
156
263
  this.show();
157
264
  }
158
- };
159
-
160
- _proto.show = function show() {
161
- var _this = this;
265
+ }
162
266
 
163
- if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) {
267
+ show() {
268
+ if (this._isTransitioning || this._isShown()) {
164
269
  return;
165
270
  }
166
271
 
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
- }
272
+ let actives = [];
273
+ let activesData;
175
274
 
176
- return elem.classList.contains(ClassName.COLLAPSE);
177
- });
178
-
179
- if (actives.length === 0) {
180
- actives = null;
181
- }
275
+ if (this._config.parent) {
276
+ const children = SelectorEngine__default.default.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
277
+ actives = SelectorEngine__default.default.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
182
278
  }
183
279
 
184
- if (actives) {
185
- activesData = $(actives).not(this._selector).data(DATA_KEY);
280
+ const container = SelectorEngine__default.default.findOne(this._selector);
281
+
282
+ if (actives.length) {
283
+ const tempActiveData = actives.find(elem => container !== elem);
284
+ activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
186
285
 
187
286
  if (activesData && activesData._isTransitioning) {
188
287
  return;
189
288
  }
190
289
  }
191
290
 
192
- var startEvent = $.Event(Event.SHOW);
193
- $(this._element).trigger(startEvent);
291
+ const startEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW);
194
292
 
195
- if (startEvent.isDefaultPrevented()) {
293
+ if (startEvent.defaultPrevented) {
196
294
  return;
197
295
  }
198
296
 
199
- if (actives) {
200
- Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');
297
+ actives.forEach(elemActive => {
298
+ if (container !== elemActive) {
299
+ Collapse.getOrCreateInstance(elemActive, {
300
+ toggle: false
301
+ }).hide();
302
+ }
201
303
 
202
304
  if (!activesData) {
203
- $(actives).data(DATA_KEY, null);
305
+ Data__default.default.set(elemActive, DATA_KEY, null);
204
306
  }
205
- }
307
+ });
308
+
309
+ const dimension = this._getDimension();
310
+
311
+ this._element.classList.remove(CLASS_NAME_COLLAPSE);
206
312
 
207
- var dimension = this._getDimension();
313
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
208
314
 
209
- $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
210
315
  this._element.style[dimension] = 0;
211
316
 
212
- if (this._triggerArray.length) {
213
- $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
214
- }
317
+ this._addAriaAndCollapsedClass(this._triggerArray, true);
318
+
319
+ this._isTransitioning = true;
215
320
 
216
- this.setTransitioning(true);
321
+ const complete = () => {
322
+ this._isTransitioning = false;
217
323
 
218
- var complete = function complete() {
219
- $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
220
- _this._element.style[dimension] = '';
324
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
221
325
 
222
- _this.setTransitioning(false);
326
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
223
327
 
224
- $(_this._element).trigger(Event.SHOWN);
328
+ this._element.style[dimension] = '';
329
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN);
225
330
  };
226
331
 
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
- };
332
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
333
+ const scrollSize = `scroll${capitalizedDimension}`;
233
334
 
234
- _proto.hide = function hide() {
235
- var _this2 = this;
335
+ this._queueCallback(complete, this._element, true);
336
+
337
+ this._element.style[dimension] = `${this._element[scrollSize]}px`;
338
+ }
236
339
 
237
- if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) {
340
+ hide() {
341
+ if (this._isTransitioning || !this._isShown()) {
238
342
  return;
239
343
  }
240
344
 
241
- var startEvent = $.Event(Event.HIDE);
242
- $(this._element).trigger(startEvent);
345
+ const startEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
243
346
 
244
- if (startEvent.isDefaultPrevented()) {
347
+ if (startEvent.defaultPrevented) {
245
348
  return;
246
349
  }
247
350
 
248
- var dimension = this._getDimension();
351
+ const dimension = this._getDimension();
249
352
 
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;
353
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
354
+ reflow(this._element);
254
355
 
255
- if (triggerArrayLength > 0) {
256
- for (var i = 0; i < triggerArrayLength; i++) {
257
- var trigger = this._triggerArray[i];
258
- var selector = Util.getSelectorFromElement(trigger);
356
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
259
357
 
260
- if (selector !== null) {
261
- var $elem = $([].slice.call(document.querySelectorAll(selector)));
358
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
262
359
 
263
- if (!$elem.hasClass(ClassName.SHOW)) {
264
- $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
265
- }
266
- }
360
+ const triggerArrayLength = this._triggerArray.length;
361
+
362
+ for (let i = 0; i < triggerArrayLength; i++) {
363
+ const trigger = this._triggerArray[i];
364
+ const elem = getElementFromSelector(trigger);
365
+
366
+ if (elem && !this._isShown(elem)) {
367
+ this._addAriaAndCollapsedClass([trigger], false);
267
368
  }
268
369
  }
269
370
 
270
- this.setTransitioning(true);
371
+ this._isTransitioning = true;
372
+
373
+ const complete = () => {
374
+ this._isTransitioning = false;
271
375
 
272
- var complete = function complete() {
273
- _this2.setTransitioning(false);
376
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
274
377
 
275
- $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
378
+ this._element.classList.add(CLASS_NAME_COLLAPSE);
379
+
380
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
276
381
  };
277
382
 
278
383
  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;
384
+
385
+ this._queueCallback(complete, this._element, true);
386
+ }
387
+
388
+ _isShown(element = this._element) {
389
+ return element.classList.contains(CLASS_NAME_SHOW);
294
390
  } // Private
295
- ;
296
391
 
297
- _proto._getConfig = function _getConfig(config) {
298
- config = _objectSpread({}, Default, config);
392
+
393
+ _getConfig(config) {
394
+ config = { ...Default,
395
+ ...Manipulator__default.default.getDataAttributes(this._element),
396
+ ...config
397
+ };
299
398
  config.toggle = Boolean(config.toggle); // Coerce string values
300
399
 
301
- Util.typeCheckConfig(NAME, config, DefaultType);
400
+ config.parent = getElement(config.parent);
401
+ typeCheckConfig(NAME, config, DefaultType);
302
402
  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
- };
403
+ }
309
404
 
310
- _proto._getParent = function _getParent() {
311
- var _this3 = this;
405
+ _getDimension() {
406
+ return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
407
+ }
312
408
 
313
- var parent;
409
+ _initializeChildren() {
410
+ if (!this._config.parent) {
411
+ return;
412
+ }
314
413
 
315
- if (Util.isElement(this._config.parent)) {
316
- parent = this._config.parent; // It's a jQuery object
414
+ const children = SelectorEngine__default.default.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
415
+ SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
416
+ const selected = getElementFromSelector(element);
317
417
 
318
- if (typeof this._config.parent.jquery !== 'undefined') {
319
- parent = this._config.parent[0];
418
+ if (selected) {
419
+ this._addAriaAndCollapsedClass([element], this._isShown(selected));
320
420
  }
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
421
  });
330
- return parent;
331
- };
332
-
333
- _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
334
- var isOpen = $(element).hasClass(ClassName.SHOW);
422
+ }
335
423
 
336
- if (triggerArray.length) {
337
- $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
424
+ _addAriaAndCollapsedClass(triggerArray, isOpen) {
425
+ if (!triggerArray.length) {
426
+ return;
338
427
  }
428
+
429
+ triggerArray.forEach(elem => {
430
+ if (isOpen) {
431
+ elem.classList.remove(CLASS_NAME_COLLAPSED);
432
+ } else {
433
+ elem.classList.add(CLASS_NAME_COLLAPSED);
434
+ }
435
+
436
+ elem.setAttribute('aria-expanded', isOpen);
437
+ });
339
438
  } // Static
340
- ;
341
439
 
342
- Collapse._getTargetFromElement = function _getTargetFromElement(element) {
343
- var selector = Util.getSelectorFromElement(element);
344
- return selector ? document.querySelector(selector) : null;
345
- };
346
440
 
347
- Collapse._jQueryInterface = function _jQueryInterface(config) {
441
+ static jQueryInterface(config) {
348
442
  return this.each(function () {
349
- var $this = $(this);
350
- var data = $this.data(DATA_KEY);
443
+ const _config = {};
351
444
 
352
- var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
353
-
354
- if (!data && _config.toggle && /show|hide/.test(config)) {
445
+ if (typeof config === 'string' && /show|hide/.test(config)) {
355
446
  _config.toggle = false;
356
447
  }
357
448
 
358
- if (!data) {
359
- data = new Collapse(this, _config);
360
- $this.data(DATA_KEY, data);
361
- }
449
+ const data = Collapse.getOrCreateInstance(this, _config);
362
450
 
363
451
  if (typeof config === 'string') {
364
452
  if (typeof data[config] === 'undefined') {
365
- throw new TypeError("No method named \"" + config + "\"");
453
+ throw new TypeError(`No method named "${config}"`);
366
454
  }
367
455
 
368
456
  data[config]();
369
457
  }
370
458
  });
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
- }]);
459
+ }
384
460
 
385
- return Collapse;
386
- }();
461
+ }
387
462
  /**
388
463
  * ------------------------------------------------------------------------
389
464
  * Data Api implementation
@@ -391,36 +466,28 @@
391
466
  */
392
467
 
393
468
 
394
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
469
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
395
470
  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
396
- if (event.currentTarget.tagName === 'A') {
471
+ if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
397
472
  event.preventDefault();
398
473
  }
399
474
 
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);
475
+ const selector = getSelectorFromElement(this);
476
+ const selectorElements = SelectorEngine__default.default.find(selector);
477
+ selectorElements.forEach(element => {
478
+ Collapse.getOrCreateInstance(element, {
479
+ toggle: false
480
+ }).toggle();
409
481
  });
410
482
  });
411
483
  /**
412
484
  * ------------------------------------------------------------------------
413
485
  * jQuery
414
486
  * ------------------------------------------------------------------------
487
+ * add .Collapse to jQuery only if jQuery is present
415
488
  */
416
489
 
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
- };
490
+ defineJQueryPlugin(Collapse);
424
491
 
425
492
  return Collapse;
426
493