bootstrap 4.4.1 → 5.0.1

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