bootstrap 4.1.3 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +17 -2
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +7 -4
  5. data/Rakefile +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +226 -166
  7. data/assets/javascripts/bootstrap/base-component.js +63 -0
  8. data/assets/javascripts/bootstrap/button.js +119 -165
  9. data/assets/javascripts/bootstrap/carousel.js +634 -445
  10. data/assets/javascripts/bootstrap/collapse.js +447 -327
  11. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  15. data/assets/javascripts/bootstrap/dropdown.js +550 -425
  16. data/assets/javascripts/bootstrap/modal.js +695 -492
  17. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  18. data/assets/javascripts/bootstrap/popover.js +167 -217
  19. data/assets/javascripts/bootstrap/scrollspy.js +319 -302
  20. data/assets/javascripts/bootstrap/tab.js +303 -221
  21. data/assets/javascripts/bootstrap/toast.js +333 -0
  22. data/assets/javascripts/bootstrap/tooltip.js +896 -577
  23. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  24. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  25. data/assets/javascripts/bootstrap-sprockets.js +15 -7
  26. data/assets/javascripts/bootstrap.js +4262 -3163
  27. data/assets/javascripts/bootstrap.min.js +4 -4
  28. data/assets/stylesheets/_bootstrap-grid.scss +54 -21
  29. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  30. data/assets/stylesheets/_bootstrap.scss +21 -11
  31. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  32. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  33. data/assets/stylesheets/bootstrap/_badge.scss +3 -21
  34. data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
  35. data/assets/stylesheets/bootstrap/_button-group.scss +29 -62
  36. data/assets/stylesheets/bootstrap/_buttons.scss +33 -65
  37. data/assets/stylesheets/bootstrap/_card.scss +55 -141
  38. data/assets/stylesheets/bootstrap/_carousel.scss +94 -101
  39. data/assets/stylesheets/bootstrap/_close.scss +33 -28
  40. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  41. data/assets/stylesheets/bootstrap/_dropdown.scss +114 -40
  42. data/assets/stylesheets/bootstrap/_forms.scss +9 -333
  43. data/assets/stylesheets/bootstrap/_functions.scss +148 -29
  44. data/assets/stylesheets/bootstrap/_grid.scss +4 -34
  45. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  46. data/assets/stylesheets/bootstrap/_images.scss +4 -4
  47. data/assets/stylesheets/bootstrap/_list-group.scss +86 -27
  48. data/assets/stylesheets/bootstrap/_mixins.scss +17 -16
  49. data/assets/stylesheets/bootstrap/_modal.scss +90 -42
  50. data/assets/stylesheets/bootstrap/_nav.scss +31 -10
  51. data/assets/stylesheets/bootstrap/_navbar.scss +68 -61
  52. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  53. data/assets/stylesheets/bootstrap/_pagination.scss +13 -27
  54. data/assets/stylesheets/bootstrap/_popover.scss +63 -88
  55. data/assets/stylesheets/bootstrap/_progress.scss +20 -6
  56. data/assets/stylesheets/bootstrap/_reboot.scss +349 -211
  57. data/assets/stylesheets/bootstrap/_root.scss +5 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +69 -0
  59. data/assets/stylesheets/bootstrap/_tables.scss +79 -116
  60. data/assets/stylesheets/bootstrap/_toasts.scss +51 -0
  61. data/assets/stylesheets/bootstrap/_tooltip.scss +18 -18
  62. data/assets/stylesheets/bootstrap/_transitions.scss +2 -3
  63. data/assets/stylesheets/bootstrap/_type.scss +42 -63
  64. data/assets/stylesheets/bootstrap/_utilities.scss +594 -15
  65. data/assets/stylesheets/bootstrap/_variables.scss +952 -440
  66. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  72. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  74. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  75. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  76. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  77. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  78. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  79. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  80. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  81. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  82. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  83. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +57 -14
  84. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +14 -1
  85. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +13 -9
  86. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -53
  87. data/assets/stylesheets/bootstrap/mixins/_caret.scss +14 -16
  88. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  89. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  90. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  91. data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
  92. data/assets/stylesheets/bootstrap/mixins/_forms.scss +87 -97
  93. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  94. data/assets/stylesheets/bootstrap/mixins/_grid.scss +106 -33
  95. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  96. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  97. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +18 -9
  98. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  99. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  100. data/assets/stylesheets/bootstrap/mixins/_transition.scss +19 -6
  101. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  102. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  103. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  104. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +312 -0
  105. data/bootstrap.gemspec +7 -6
  106. data/lib/bootstrap/engine.rb +3 -0
  107. data/lib/bootstrap/version.rb +4 -2
  108. data/lib/bootstrap.rb +10 -7
  109. data/tasks/updater/js.rb +20 -5
  110. data/tasks/updater/network.rb +8 -2
  111. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  112. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  113. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  114. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  115. data/test/dummy_rails/app/views/pages/root.html +89 -0
  116. data/test/dummy_rails/config/application.rb +0 -3
  117. data/test/gemfiles/rails_6_0.gemfile +7 -0
  118. data/test/gemfiles/rails_6_1.gemfile +7 -0
  119. data/test/support/dummy_rails_integration.rb +3 -1
  120. data/test/test_helper.rb +18 -13
  121. metadata +64 -79
  122. data/assets/javascripts/bootstrap/util.js +0 -143
  123. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  124. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -433
  125. data/assets/stylesheets/bootstrap/_input-group.scss +0 -173
  126. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  127. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  128. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  129. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  130. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  131. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  133. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  134. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  135. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  136. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  137. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  138. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  139. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -13
  140. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  141. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  142. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  143. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  144. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  145. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  146. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  147. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  148. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -37
  149. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  150. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  151. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  152. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  153. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -58
  154. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  155. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  156. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,429 +1,549 @@
1
+ /*!
2
+ * Bootstrap collapse.js v5.0.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
1
6
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
3
- typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
4
- (global.Collapse = factory(global.jQuery,global.Util));
5
- }(this, (function ($,Util) { 'use strict';
6
-
7
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
8
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
9
-
10
- function _defineProperties(target, props) {
11
- for (var i = 0; i < props.length; i++) {
12
- var descriptor = props[i];
13
- descriptor.enumerable = descriptor.enumerable || false;
14
- descriptor.configurable = true;
15
- if ("value" in descriptor) descriptor.writable = true;
16
- 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.0.0): util/index.js
23
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
24
+ * --------------------------------------------------------------------------
25
+ */
26
+ const MILLISECONDS_MULTIPLIER = 1000;
27
+ const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
28
+
29
+ const toType = obj => {
30
+ if (obj === null || obj === undefined) {
31
+ return `${obj}`;
17
32
  }
18
- }
19
33
 
20
- function _createClass(Constructor, protoProps, staticProps) {
21
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
22
- if (staticProps) _defineProperties(Constructor, staticProps);
23
- return Constructor;
24
- }
34
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
35
+ };
25
36
 
26
- function _defineProperty(obj, key, value) {
27
- if (key in obj) {
28
- Object.defineProperty(obj, key, {
29
- value: value,
30
- enumerable: true,
31
- configurable: true,
32
- writable: true
33
- });
34
- } else {
35
- obj[key] = value;
37
+ const getSelector = element => {
38
+ let selector = element.getAttribute('data-bs-target');
39
+
40
+ if (!selector || selector === '#') {
41
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
42
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
43
+ // `document.querySelector` will rightfully complain it is invalid.
44
+ // See https://github.com/twbs/bootstrap/issues/32273
45
+
46
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
47
+ return null;
48
+ } // Just in case some CMS puts out a full URL with the anchor appended
49
+
50
+
51
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
52
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
53
+ }
54
+
55
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
36
56
  }
37
57
 
38
- return obj;
39
- }
58
+ return selector;
59
+ };
40
60
 
41
- function _objectSpread(target) {
42
- for (var i = 1; i < arguments.length; i++) {
43
- var source = arguments[i] != null ? arguments[i] : {};
44
- var ownKeys = Object.keys(source);
61
+ const getSelectorFromElement = element => {
62
+ const selector = getSelector(element);
45
63
 
46
- if (typeof Object.getOwnPropertySymbols === 'function') {
47
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
48
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
49
- }));
64
+ if (selector) {
65
+ return document.querySelector(selector) ? selector : null;
66
+ }
67
+
68
+ return null;
69
+ };
70
+
71
+ const getElementFromSelector = element => {
72
+ const selector = getSelector(element);
73
+ return selector ? document.querySelector(selector) : null;
74
+ };
75
+
76
+ const getTransitionDurationFromElement = element => {
77
+ if (!element) {
78
+ return 0;
79
+ } // Get transition-duration of the element
80
+
81
+
82
+ let {
83
+ transitionDuration,
84
+ transitionDelay
85
+ } = window.getComputedStyle(element);
86
+ const floatTransitionDuration = Number.parseFloat(transitionDuration);
87
+ const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
88
+
89
+ if (!floatTransitionDuration && !floatTransitionDelay) {
90
+ return 0;
91
+ } // If multiple durations are defined, take the first
92
+
93
+
94
+ transitionDuration = transitionDuration.split(',')[0];
95
+ transitionDelay = transitionDelay.split(',')[0];
96
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
97
+ };
98
+
99
+ const triggerTransitionEnd = element => {
100
+ element.dispatchEvent(new Event(TRANSITION_END));
101
+ };
102
+
103
+ const isElement = obj => (obj[0] || obj).nodeType;
104
+
105
+ const emulateTransitionEnd = (element, duration) => {
106
+ let called = false;
107
+ const durationPadding = 5;
108
+ const emulatedDuration = duration + durationPadding;
109
+
110
+ function listener() {
111
+ called = true;
112
+ element.removeEventListener(TRANSITION_END, listener);
113
+ }
114
+
115
+ element.addEventListener(TRANSITION_END, listener);
116
+ setTimeout(() => {
117
+ if (!called) {
118
+ triggerTransitionEnd(element);
50
119
  }
120
+ }, emulatedDuration);
121
+ };
51
122
 
52
- ownKeys.forEach(function (key) {
53
- _defineProperty(target, key, source[key]);
54
- });
123
+ const typeCheckConfig = (componentName, config, configTypes) => {
124
+ Object.keys(configTypes).forEach(property => {
125
+ const expectedTypes = configTypes[property];
126
+ const value = config[property];
127
+ const valueType = value && isElement(value) ? 'element' : toType(value);
128
+
129
+ if (!new RegExp(expectedTypes).test(valueType)) {
130
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
131
+ }
132
+ });
133
+ };
134
+
135
+ const reflow = element => element.offsetHeight;
136
+
137
+ const getjQuery = () => {
138
+ const {
139
+ jQuery
140
+ } = window;
141
+
142
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
143
+ return jQuery;
55
144
  }
56
145
 
57
- return target;
58
- }
146
+ return null;
147
+ };
148
+
149
+ const onDOMContentLoaded = callback => {
150
+ if (document.readyState === 'loading') {
151
+ document.addEventListener('DOMContentLoaded', callback);
152
+ } else {
153
+ callback();
154
+ }
155
+ };
156
+
157
+ const defineJQueryPlugin = (name, plugin) => {
158
+ onDOMContentLoaded(() => {
159
+ const $ = getjQuery();
160
+ /* istanbul ignore if */
161
+
162
+ if ($) {
163
+ const JQUERY_NO_CONFLICT = $.fn[name];
164
+ $.fn[name] = plugin.jQueryInterface;
165
+ $.fn[name].Constructor = plugin;
166
+
167
+ $.fn[name].noConflict = () => {
168
+ $.fn[name] = JQUERY_NO_CONFLICT;
169
+ return plugin.jQueryInterface;
170
+ };
171
+ }
172
+ });
173
+ };
59
174
 
60
175
  /**
61
176
  * --------------------------------------------------------------------------
62
- * Bootstrap (v4.1.3): collapse.js
63
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
177
+ * Bootstrap (v5.0.0): collapse.js
178
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
64
179
  * --------------------------------------------------------------------------
65
180
  */
181
+ /**
182
+ * ------------------------------------------------------------------------
183
+ * Constants
184
+ * ------------------------------------------------------------------------
185
+ */
66
186
 
67
- var Collapse = function ($$$1) {
68
- /**
69
- * ------------------------------------------------------------------------
70
- * Constants
71
- * ------------------------------------------------------------------------
72
- */
73
- var NAME = 'collapse';
74
- var VERSION = '4.1.3';
75
- var DATA_KEY = 'bs.collapse';
76
- var EVENT_KEY = "." + DATA_KEY;
77
- var DATA_API_KEY = '.data-api';
78
- var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
79
- var Default = {
80
- toggle: true,
81
- parent: ''
82
- };
83
- var DefaultType = {
84
- toggle: 'boolean',
85
- parent: '(string|element)'
86
- };
87
- var Event = {
88
- SHOW: "show" + EVENT_KEY,
89
- SHOWN: "shown" + EVENT_KEY,
90
- HIDE: "hide" + EVENT_KEY,
91
- HIDDEN: "hidden" + EVENT_KEY,
92
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
93
- };
94
- var ClassName = {
95
- SHOW: 'show',
96
- COLLAPSE: 'collapse',
97
- COLLAPSING: 'collapsing',
98
- COLLAPSED: 'collapsed'
99
- };
100
- var Dimension = {
101
- WIDTH: 'width',
102
- HEIGHT: 'height'
103
- };
104
- var Selector = {
105
- ACTIVES: '.show, .collapsing',
106
- DATA_TOGGLE: '[data-toggle="collapse"]'
107
- /**
108
- * ------------------------------------------------------------------------
109
- * Class Definition
110
- * ------------------------------------------------------------------------
111
- */
112
-
113
- };
114
-
115
- var Collapse =
116
- /*#__PURE__*/
117
- function () {
118
- function Collapse(element, config) {
119
- this._isTransitioning = false;
120
- this._element = element;
121
- this._config = this._getConfig(config);
122
- this._triggerArray = $$$1.makeArray(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
123
- var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
124
-
125
- for (var i = 0, len = toggleList.length; i < len; i++) {
126
- var elem = toggleList[i];
127
- var selector = Util.getSelectorFromElement(elem);
128
- var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
129
- return foundElem === element;
130
- });
131
-
132
- if (selector !== null && filterElement.length > 0) {
133
- this._selector = selector;
134
-
135
- this._triggerArray.push(elem);
136
- }
137
- }
187
+ const NAME = 'collapse';
188
+ const DATA_KEY = 'bs.collapse';
189
+ const EVENT_KEY = `.${DATA_KEY}`;
190
+ const DATA_API_KEY = '.data-api';
191
+ const Default = {
192
+ toggle: true,
193
+ parent: ''
194
+ };
195
+ const DefaultType = {
196
+ toggle: 'boolean',
197
+ parent: '(string|element)'
198
+ };
199
+ const EVENT_SHOW = `show${EVENT_KEY}`;
200
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
201
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
202
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
203
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
204
+ const CLASS_NAME_SHOW = 'show';
205
+ const CLASS_NAME_COLLAPSE = 'collapse';
206
+ const CLASS_NAME_COLLAPSING = 'collapsing';
207
+ const CLASS_NAME_COLLAPSED = 'collapsed';
208
+ const WIDTH = 'width';
209
+ const HEIGHT = 'height';
210
+ const SELECTOR_ACTIVES = '.show, .collapsing';
211
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
212
+ /**
213
+ * ------------------------------------------------------------------------
214
+ * Class Definition
215
+ * ------------------------------------------------------------------------
216
+ */
138
217
 
139
- this._parent = this._config.parent ? this._getParent() : null;
218
+ class Collapse extends BaseComponent__default['default'] {
219
+ constructor(element, config) {
220
+ super(element);
221
+ this._isTransitioning = false;
222
+ this._config = this._getConfig(config);
223
+ this._triggerArray = SelectorEngine__default['default'].find(`${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` + `${SELECTOR_DATA_TOGGLE}[data-bs-target="#${this._element.id}"]`);
224
+ const toggleList = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
140
225
 
141
- if (!this._config.parent) {
142
- this._addAriaAndCollapsedClass(this._element, this._triggerArray);
143
- }
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);
230
+
231
+ if (selector !== null && filterElement.length) {
232
+ this._selector = selector;
144
233
 
145
- if (this._config.toggle) {
146
- this.toggle();
234
+ this._triggerArray.push(elem);
147
235
  }
148
- } // Getters
236
+ }
149
237
 
238
+ this._parent = this._config.parent ? this._getParent() : null;
150
239
 
151
- var _proto = Collapse.prototype;
240
+ if (!this._config.parent) {
241
+ this._addAriaAndCollapsedClass(this._element, this._triggerArray);
242
+ }
152
243
 
153
- // Public
154
- _proto.toggle = function toggle() {
155
- if ($$$1(this._element).hasClass(ClassName.SHOW)) {
156
- this.hide();
157
- } else {
158
- this.show();
159
- }
160
- };
244
+ if (this._config.toggle) {
245
+ this.toggle();
246
+ }
247
+ } // Getters
161
248
 
162
- _proto.show = function show() {
163
- var _this = this;
164
249
 
165
- if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {
166
- return;
167
- }
250
+ static get Default() {
251
+ return Default;
252
+ }
168
253
 
169
- var actives;
170
- var activesData;
254
+ static get DATA_KEY() {
255
+ return DATA_KEY;
256
+ } // Public
171
257
 
172
- if (this._parent) {
173
- actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
174
- return elem.getAttribute('data-parent') === _this._config.parent;
175
- });
176
258
 
177
- if (actives.length === 0) {
178
- actives = null;
179
- }
180
- }
259
+ toggle() {
260
+ if (this._element.classList.contains(CLASS_NAME_SHOW)) {
261
+ this.hide();
262
+ } else {
263
+ this.show();
264
+ }
265
+ }
266
+
267
+ show() {
268
+ if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) {
269
+ return;
270
+ }
181
271
 
182
- if (actives) {
183
- activesData = $$$1(actives).not(this._selector).data(DATA_KEY);
272
+ let actives;
273
+ let activesData;
184
274
 
185
- if (activesData && activesData._isTransitioning) {
186
- return;
275
+ if (this._parent) {
276
+ actives = SelectorEngine__default['default'].find(SELECTOR_ACTIVES, this._parent).filter(elem => {
277
+ if (typeof this._config.parent === 'string') {
278
+ return elem.getAttribute('data-bs-parent') === this._config.parent;
187
279
  }
280
+
281
+ return elem.classList.contains(CLASS_NAME_COLLAPSE);
282
+ });
283
+
284
+ if (actives.length === 0) {
285
+ actives = null;
188
286
  }
287
+ }
288
+
289
+ const container = SelectorEngine__default['default'].findOne(this._selector);
189
290
 
190
- var startEvent = $$$1.Event(Event.SHOW);
191
- $$$1(this._element).trigger(startEvent);
291
+ if (actives) {
292
+ const tempActiveData = actives.find(elem => container !== elem);
293
+ activesData = tempActiveData ? Data__default['default'].get(tempActiveData, DATA_KEY) : null;
192
294
 
193
- if (startEvent.isDefaultPrevented()) {
295
+ if (activesData && activesData._isTransitioning) {
194
296
  return;
195
297
  }
298
+ }
299
+
300
+ const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
196
301
 
197
- if (actives) {
198
- Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');
302
+ if (startEvent.defaultPrevented) {
303
+ return;
304
+ }
305
+
306
+ if (actives) {
307
+ actives.forEach(elemActive => {
308
+ if (container !== elemActive) {
309
+ Collapse.collapseInterface(elemActive, 'hide');
310
+ }
199
311
 
200
312
  if (!activesData) {
201
- $$$1(actives).data(DATA_KEY, null);
313
+ Data__default['default'].set(elemActive, DATA_KEY, null);
202
314
  }
203
- }
315
+ });
316
+ }
204
317
 
205
- var dimension = this._getDimension();
318
+ const dimension = this._getDimension();
206
319
 
207
- $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
208
- this._element.style[dimension] = 0;
320
+ this._element.classList.remove(CLASS_NAME_COLLAPSE);
209
321
 
210
- if (this._triggerArray.length) {
211
- $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
212
- }
322
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
213
323
 
214
- this.setTransitioning(true);
324
+ this._element.style[dimension] = 0;
215
325
 
216
- var complete = function complete() {
217
- $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
218
- _this._element.style[dimension] = '';
326
+ if (this._triggerArray.length) {
327
+ this._triggerArray.forEach(element => {
328
+ element.classList.remove(CLASS_NAME_COLLAPSED);
329
+ element.setAttribute('aria-expanded', true);
330
+ });
331
+ }
219
332
 
220
- _this.setTransitioning(false);
333
+ this.setTransitioning(true);
221
334
 
222
- $$$1(_this._element).trigger(Event.SHOWN);
223
- };
335
+ const complete = () => {
336
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
224
337
 
225
- var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
226
- var scrollSize = "scroll" + capitalizedDimension;
227
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
228
- $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
229
- this._element.style[dimension] = this._element[scrollSize] + "px";
338
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
339
+
340
+ this._element.style[dimension] = '';
341
+ this.setTransitioning(false);
342
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
230
343
  };
231
344
 
232
- _proto.hide = function hide() {
233
- var _this2 = this;
345
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
346
+ const scrollSize = `scroll${capitalizedDimension}`;
347
+ const transitionDuration = getTransitionDurationFromElement(this._element);
348
+ EventHandler__default['default'].one(this._element, 'transitionend', complete);
349
+ emulateTransitionEnd(this._element, transitionDuration);
350
+ this._element.style[dimension] = `${this._element[scrollSize]}px`;
351
+ }
234
352
 
235
- if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {
236
- return;
237
- }
353
+ hide() {
354
+ if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) {
355
+ return;
356
+ }
238
357
 
239
- var startEvent = $$$1.Event(Event.HIDE);
240
- $$$1(this._element).trigger(startEvent);
358
+ const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
241
359
 
242
- if (startEvent.isDefaultPrevented()) {
243
- return;
244
- }
360
+ if (startEvent.defaultPrevented) {
361
+ return;
362
+ }
363
+
364
+ const dimension = this._getDimension();
365
+
366
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
367
+ reflow(this._element);
245
368
 
246
- var dimension = this._getDimension();
369
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
247
370
 
248
- this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
249
- Util.reflow(this._element);
250
- $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
251
- var triggerArrayLength = this._triggerArray.length;
371
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
252
372
 
253
- if (triggerArrayLength > 0) {
254
- for (var i = 0; i < triggerArrayLength; i++) {
255
- var trigger = this._triggerArray[i];
256
- var selector = Util.getSelectorFromElement(trigger);
373
+ const triggerArrayLength = this._triggerArray.length;
257
374
 
258
- if (selector !== null) {
259
- var $elem = $$$1([].slice.call(document.querySelectorAll(selector)));
375
+ if (triggerArrayLength > 0) {
376
+ for (let i = 0; i < triggerArrayLength; i++) {
377
+ const trigger = this._triggerArray[i];
378
+ const elem = getElementFromSelector(trigger);
260
379
 
261
- if (!$elem.hasClass(ClassName.SHOW)) {
262
- $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
263
- }
264
- }
380
+ if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) {
381
+ trigger.classList.add(CLASS_NAME_COLLAPSED);
382
+ trigger.setAttribute('aria-expanded', false);
265
383
  }
266
384
  }
385
+ }
267
386
 
268
- this.setTransitioning(true);
387
+ this.setTransitioning(true);
269
388
 
270
- var complete = function complete() {
271
- _this2.setTransitioning(false);
389
+ const complete = () => {
390
+ this.setTransitioning(false);
272
391
 
273
- $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
274
- };
392
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
275
393
 
276
- this._element.style[dimension] = '';
277
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
278
- $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
279
- };
394
+ this._element.classList.add(CLASS_NAME_COLLAPSE);
280
395
 
281
- _proto.setTransitioning = function setTransitioning(isTransitioning) {
282
- this._isTransitioning = isTransitioning;
396
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
283
397
  };
284
398
 
285
- _proto.dispose = function dispose() {
286
- $$$1.removeData(this._element, DATA_KEY);
287
- this._config = null;
288
- this._parent = null;
289
- this._element = null;
290
- this._triggerArray = null;
291
- this._isTransitioning = null;
292
- }; // Private
399
+ this._element.style[dimension] = '';
400
+ const transitionDuration = getTransitionDurationFromElement(this._element);
401
+ EventHandler__default['default'].one(this._element, 'transitionend', complete);
402
+ emulateTransitionEnd(this._element, transitionDuration);
403
+ }
293
404
 
405
+ setTransitioning(isTransitioning) {
406
+ this._isTransitioning = isTransitioning;
407
+ }
294
408
 
295
- _proto._getConfig = function _getConfig(config) {
296
- config = _objectSpread({}, Default, config);
297
- config.toggle = Boolean(config.toggle); // Coerce string values
409
+ dispose() {
410
+ super.dispose();
411
+ this._config = null;
412
+ this._parent = null;
413
+ this._triggerArray = null;
414
+ this._isTransitioning = null;
415
+ } // Private
298
416
 
299
- Util.typeCheckConfig(NAME, config, DefaultType);
300
- return config;
301
- };
302
417
 
303
- _proto._getDimension = function _getDimension() {
304
- var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);
305
- return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
418
+ _getConfig(config) {
419
+ config = { ...Default,
420
+ ...config
306
421
  };
422
+ config.toggle = Boolean(config.toggle); // Coerce string values
307
423
 
308
- _proto._getParent = function _getParent() {
309
- var _this3 = this;
424
+ typeCheckConfig(NAME, config, DefaultType);
425
+ return config;
426
+ }
310
427
 
311
- var parent = null;
428
+ _getDimension() {
429
+ return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT;
430
+ }
312
431
 
313
- if (Util.isElement(this._config.parent)) {
314
- parent = this._config.parent; // It's a jQuery object
432
+ _getParent() {
433
+ let {
434
+ parent
435
+ } = this._config;
315
436
 
316
- if (typeof this._config.parent.jquery !== 'undefined') {
317
- parent = this._config.parent[0];
318
- }
319
- } else {
320
- parent = document.querySelector(this._config.parent);
437
+ if (isElement(parent)) {
438
+ // it's a jQuery object
439
+ if (typeof parent.jquery !== 'undefined' || typeof parent[0] !== 'undefined') {
440
+ parent = parent[0];
321
441
  }
442
+ } else {
443
+ parent = SelectorEngine__default['default'].findOne(parent);
444
+ }
322
445
 
323
- var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
324
- var children = [].slice.call(parent.querySelectorAll(selector));
325
- $$$1(children).each(function (i, element) {
326
- _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
327
- });
328
- return parent;
329
- };
446
+ const selector = `${SELECTOR_DATA_TOGGLE}[data-bs-parent="${parent}"]`;
447
+ SelectorEngine__default['default'].find(selector, parent).forEach(element => {
448
+ const selected = getElementFromSelector(element);
330
449
 
331
- _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
332
- if (element) {
333
- var isOpen = $$$1(element).hasClass(ClassName.SHOW);
450
+ this._addAriaAndCollapsedClass(selected, [element]);
451
+ });
452
+ return parent;
453
+ }
334
454
 
335
- if (triggerArray.length) {
336
- $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
337
- }
455
+ _addAriaAndCollapsedClass(element, triggerArray) {
456
+ if (!element || !triggerArray.length) {
457
+ return;
458
+ }
459
+
460
+ const isOpen = element.classList.contains(CLASS_NAME_SHOW);
461
+ triggerArray.forEach(elem => {
462
+ if (isOpen) {
463
+ elem.classList.remove(CLASS_NAME_COLLAPSED);
464
+ } else {
465
+ elem.classList.add(CLASS_NAME_COLLAPSED);
338
466
  }
339
- }; // Static
467
+
468
+ elem.setAttribute('aria-expanded', isOpen);
469
+ });
470
+ } // Static
340
471
 
341
472
 
342
- Collapse._getTargetFromElement = function _getTargetFromElement(element) {
343
- var selector = Util.getSelectorFromElement(element);
344
- return selector ? document.querySelector(selector) : null;
473
+ static collapseInterface(element, config) {
474
+ let data = Data__default['default'].get(element, DATA_KEY);
475
+ const _config = { ...Default,
476
+ ...Manipulator__default['default'].getDataAttributes(element),
477
+ ...(typeof config === 'object' && config ? config : {})
345
478
  };
346
479
 
347
- Collapse._jQueryInterface = function _jQueryInterface(config) {
348
- return this.each(function () {
349
- var $this = $$$1(this);
350
- var data = $this.data(DATA_KEY);
480
+ if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
481
+ _config.toggle = false;
482
+ }
351
483
 
352
- var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
484
+ if (!data) {
485
+ data = new Collapse(element, _config);
486
+ }
353
487
 
354
- if (!data && _config.toggle && /show|hide/.test(config)) {
355
- _config.toggle = false;
356
- }
488
+ if (typeof config === 'string') {
489
+ if (typeof data[config] === 'undefined') {
490
+ throw new TypeError(`No method named "${config}"`);
491
+ }
357
492
 
358
- if (!data) {
359
- data = new Collapse(this, _config);
360
- $this.data(DATA_KEY, data);
361
- }
493
+ data[config]();
494
+ }
495
+ }
362
496
 
363
- if (typeof config === 'string') {
364
- if (typeof data[config] === 'undefined') {
365
- throw new TypeError("No method named \"" + config + "\"");
366
- }
497
+ static jQueryInterface(config) {
498
+ return this.each(function () {
499
+ Collapse.collapseInterface(this, config);
500
+ });
501
+ }
367
502
 
368
- data[config]();
369
- }
370
- });
371
- };
503
+ }
504
+ /**
505
+ * ------------------------------------------------------------------------
506
+ * Data Api implementation
507
+ * ------------------------------------------------------------------------
508
+ */
372
509
 
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
- }]);
384
510
 
385
- return Collapse;
386
- }();
387
- /**
388
- * ------------------------------------------------------------------------
389
- * Data Api implementation
390
- * ------------------------------------------------------------------------
391
- */
511
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
512
+ // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
513
+ if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
514
+ event.preventDefault();
515
+ }
392
516
 
517
+ const triggerData = Manipulator__default['default'].getDataAttributes(this);
518
+ const selector = getSelectorFromElement(this);
519
+ const selectorElements = SelectorEngine__default['default'].find(selector);
520
+ selectorElements.forEach(element => {
521
+ const data = Data__default['default'].get(element, DATA_KEY);
522
+ let config;
523
+
524
+ if (data) {
525
+ // update parent attribute
526
+ if (data._parent === null && typeof triggerData.parent === 'string') {
527
+ data._config.parent = triggerData.parent;
528
+ data._parent = data._getParent();
529
+ }
393
530
 
394
- $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
395
- // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
396
- if (event.currentTarget.tagName === 'A') {
397
- event.preventDefault();
531
+ config = 'toggle';
532
+ } else {
533
+ config = triggerData;
398
534
  }
399
535
 
400
- var $trigger = $$$1(this);
401
- var selector = Util.getSelectorFromElement(this);
402
- var selectors = [].slice.call(document.querySelectorAll(selector));
403
- $$$1(selectors).each(function () {
404
- var $target = $$$1(this);
405
- var data = $target.data(DATA_KEY);
406
- var config = data ? 'toggle' : $trigger.data();
407
-
408
- Collapse._jQueryInterface.call($target, config);
409
- });
536
+ Collapse.collapseInterface(element, config);
410
537
  });
411
- /**
412
- * ------------------------------------------------------------------------
413
- * jQuery
414
- * ------------------------------------------------------------------------
415
- */
416
-
417
- $$$1.fn[NAME] = Collapse._jQueryInterface;
418
- $$$1.fn[NAME].Constructor = Collapse;
419
-
420
- $$$1.fn[NAME].noConflict = function () {
421
- $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
422
- return Collapse._jQueryInterface;
423
- };
424
-
425
- return Collapse;
426
- }($);
538
+ });
539
+ /**
540
+ * ------------------------------------------------------------------------
541
+ * jQuery
542
+ * ------------------------------------------------------------------------
543
+ * add .Collapse to jQuery only if jQuery is present
544
+ */
545
+
546
+ defineJQueryPlugin(NAME, Collapse);
427
547
 
428
548
  return Collapse;
429
549