bootstrap 5.1.3 → 5.3.5

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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/CHANGELOG.md +9 -0
  4. data/Gemfile +1 -0
  5. data/README.md +35 -14
  6. data/Rakefile +16 -5
  7. data/assets/javascripts/bootstrap/alert.js +22 -167
  8. data/assets/javascripts/bootstrap/base-component.js +34 -133
  9. data/assets/javascripts/bootstrap/button.js +19 -86
  10. data/assets/javascripts/bootstrap/carousel.js +209 -564
  11. data/assets/javascripts/bootstrap/collapse.js +78 -324
  12. data/assets/javascripts/bootstrap/dom/data.js +8 -14
  13. data/assets/javascripts/bootstrap/dom/event-handler.js +89 -174
  14. data/assets/javascripts/bootstrap/dom/manipulator.js +22 -39
  15. data/assets/javascripts/bootstrap/dom/selector-engine.js +47 -71
  16. data/assets/javascripts/bootstrap/dropdown.js +135 -420
  17. data/assets/javascripts/bootstrap/modal.js +115 -837
  18. data/assets/javascripts/bootstrap/offcanvas.js +93 -714
  19. data/assets/javascripts/bootstrap/popover.js +42 -130
  20. data/assets/javascripts/bootstrap/scrollspy.js +180 -296
  21. data/assets/javascripts/bootstrap/tab.js +197 -245
  22. data/assets/javascripts/bootstrap/toast.js +52 -276
  23. data/assets/javascripts/bootstrap/tooltip.js +283 -744
  24. data/assets/javascripts/bootstrap/util/backdrop.js +138 -0
  25. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  26. data/assets/javascripts/bootstrap/util/config.js +67 -0
  27. data/assets/javascripts/bootstrap/util/focustrap.js +112 -0
  28. data/assets/javascripts/bootstrap/util/index.js +280 -0
  29. data/assets/javascripts/bootstrap/util/sanitizer.js +113 -0
  30. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  31. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  32. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  33. data/assets/javascripts/bootstrap-global-this-define.js +1 -1
  34. data/assets/javascripts/bootstrap-sprockets.js +15 -6
  35. data/assets/javascripts/bootstrap.js +2278 -2831
  36. data/assets/javascripts/bootstrap.min.js +3 -3
  37. data/assets/stylesheets/_bootstrap-grid.scss +4 -9
  38. data/assets/stylesheets/_bootstrap-reboot.scss +4 -7
  39. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  40. data/assets/stylesheets/_bootstrap.scss +5 -6
  41. data/assets/stylesheets/bootstrap/_accordion.scss +68 -33
  42. data/assets/stylesheets/bootstrap/_alert.scss +25 -14
  43. data/assets/stylesheets/bootstrap/_badge.scss +14 -5
  44. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -10
  45. data/assets/stylesheets/bootstrap/_button-group.scss +12 -4
  46. data/assets/stylesheets/bootstrap/_buttons.scss +133 -28
  47. data/assets/stylesheets/bootstrap/_card.scss +61 -39
  48. data/assets/stylesheets/bootstrap/_carousel.scss +22 -25
  49. data/assets/stylesheets/bootstrap/_close.scss +36 -10
  50. data/assets/stylesheets/bootstrap/_containers.scss +1 -1
  51. data/assets/stylesheets/bootstrap/_dropdown.scss +86 -76
  52. data/assets/stylesheets/bootstrap/_functions.scss +10 -10
  53. data/assets/stylesheets/bootstrap/_grid.scss +9 -3
  54. data/assets/stylesheets/bootstrap/_helpers.scss +3 -0
  55. data/assets/stylesheets/bootstrap/_list-group.scss +81 -56
  56. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  57. data/assets/stylesheets/bootstrap/_mixins.scss +1 -2
  58. data/assets/stylesheets/bootstrap/_modal.scss +76 -45
  59. data/assets/stylesheets/bootstrap/_nav.scss +87 -29
  60. data/assets/stylesheets/bootstrap/_navbar.scss +102 -148
  61. data/assets/stylesheets/bootstrap/_offcanvas.scss +125 -61
  62. data/assets/stylesheets/bootstrap/_pagination.scss +66 -21
  63. data/assets/stylesheets/bootstrap/_placeholders.scss +1 -1
  64. data/assets/stylesheets/bootstrap/_popover.scss +90 -52
  65. data/assets/stylesheets/bootstrap/_progress.scss +31 -11
  66. data/assets/stylesheets/bootstrap/_reboot.scss +32 -46
  67. data/assets/stylesheets/bootstrap/_root.scss +155 -22
  68. data/assets/stylesheets/bootstrap/_spinners.scss +38 -22
  69. data/assets/stylesheets/bootstrap/_tables.scss +40 -24
  70. data/assets/stylesheets/bootstrap/_toasts.scss +38 -16
  71. data/assets/stylesheets/bootstrap/_tooltip.scss +60 -56
  72. data/assets/stylesheets/bootstrap/_type.scss +3 -1
  73. data/assets/stylesheets/bootstrap/_utilities.scss +209 -33
  74. data/assets/stylesheets/bootstrap/_variables-dark.scss +102 -0
  75. data/assets/stylesheets/bootstrap/_variables.scss +415 -303
  76. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +39 -5
  77. data/assets/stylesheets/bootstrap/forms/_form-check.scss +51 -14
  78. data/assets/stylesheets/bootstrap/forms/_form-control.scss +36 -41
  79. data/assets/stylesheets/bootstrap/forms/_form-range.scss +3 -3
  80. data/assets/stylesheets/bootstrap/forms/_form-select.scss +12 -4
  81. data/assets/stylesheets/bootstrap/forms/_input-group.scss +20 -9
  82. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
  83. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +20 -2
  84. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  85. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  86. data/assets/stylesheets/bootstrap/helpers/_position.scss +7 -1
  87. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
  88. data/assets/stylesheets/bootstrap/helpers/_vr.scss +2 -2
  89. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -4
  90. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  91. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +8 -8
  92. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +32 -95
  93. data/assets/stylesheets/bootstrap/mixins/_caret.scss +30 -25
  94. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  95. data/assets/stylesheets/bootstrap/mixins/_container.scss +4 -2
  96. data/assets/stylesheets/bootstrap/mixins/_forms.scss +38 -19
  97. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
  98. data/assets/stylesheets/bootstrap/mixins/_grid.scss +15 -15
  99. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  100. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +4 -25
  101. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  102. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +12 -9
  103. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +14 -6
  104. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +6 -2
  105. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +23 -29
  106. data/bootstrap.gemspec +3 -3
  107. data/lib/bootstrap/engine.rb +17 -2
  108. data/lib/bootstrap/version.rb +2 -2
  109. data/tasks/updater/js.rb +10 -5
  110. data/tasks/updater/network.rb +2 -2
  111. data/tasks/updater/scss.rb +2 -2
  112. data/tasks/updater.rb +2 -2
  113. data/test/dummy_rails/config/application.rb +0 -2
  114. data/test/dummy_rails/public/favicon.ico +0 -0
  115. data/test/gemfiles/rails_4_2.gemfile +2 -1
  116. data/test/gemfiles/rails_5_0.gemfile +1 -2
  117. data/test/gemfiles/rails_5_1.gemfile +1 -2
  118. data/test/gemfiles/rails_5_2.gemfile +7 -0
  119. data/test/gemfiles/rails_6_0.gemfile +1 -1
  120. data/test/gemfiles/rails_6_1.gemfile +1 -1
  121. data/test/gemfiles/rails_7_0_dartsass.gemfile +7 -0
  122. data/test/gemfiles/rails_7_0_sassc.gemfile +7 -0
  123. data/test/rails_test.rb +0 -5
  124. data/test/test_helper.rb +3 -2
  125. metadata +49 -29
  126. data/.travis.yml +0 -32
  127. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -18
@@ -1,199 +1,30 @@
1
1
  /*!
2
- * Bootstrap collapse.js v5.1.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap collapse.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./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);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));
10
+ })(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';
19
11
 
20
12
  /**
21
13
  * --------------------------------------------------------------------------
22
- * Bootstrap (v5.1.3): util/index.js
14
+ * Bootstrap collapse.js
23
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
24
16
  * --------------------------------------------------------------------------
25
17
  */
26
18
 
27
- const toType = obj => {
28
- if (obj === null || obj === undefined) {
29
- return `${obj}`;
30
- }
31
-
32
- return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
33
- };
34
-
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
19
 
53
- selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
54
- }
55
-
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
- };
85
-
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
- }
91
-
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}".`);
107
- }
108
- });
109
- };
110
20
  /**
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
- */
118
-
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;
132
- }
133
-
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
- };
172
-
173
- /**
174
- * --------------------------------------------------------------------------
175
- * Bootstrap (v5.1.3): collapse.js
176
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
177
- * --------------------------------------------------------------------------
178
- */
179
- /**
180
- * ------------------------------------------------------------------------
181
21
  * Constants
182
- * ------------------------------------------------------------------------
183
22
  */
184
23
 
185
24
  const NAME = 'collapse';
186
25
  const DATA_KEY = 'bs.collapse';
187
26
  const EVENT_KEY = `.${DATA_KEY}`;
188
27
  const DATA_API_KEY = '.data-api';
189
- const Default = {
190
- toggle: true,
191
- parent: null
192
- };
193
- const DefaultType = {
194
- toggle: 'boolean',
195
- parent: '(null|element)'
196
- };
197
28
  const EVENT_SHOW = `show${EVENT_KEY}`;
198
29
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
199
30
  const EVENT_HIDE = `hide${EVENT_KEY}`;
@@ -209,53 +40,53 @@
209
40
  const HEIGHT = 'height';
210
41
  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
211
42
  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
43
+ const Default = {
44
+ parent: null,
45
+ toggle: true
46
+ };
47
+ const DefaultType = {
48
+ parent: '(null|element)',
49
+ toggle: 'boolean'
50
+ };
51
+
212
52
  /**
213
- * ------------------------------------------------------------------------
214
- * Class Definition
215
- * ------------------------------------------------------------------------
53
+ * Class definition
216
54
  */
217
55
 
218
- class Collapse extends BaseComponent__default.default {
56
+ class Collapse extends BaseComponent {
219
57
  constructor(element, config) {
220
- super(element);
58
+ super(element, config);
221
59
  this._isTransitioning = false;
222
- this._config = this._getConfig(config);
223
60
  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);
230
-
61
+ const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
62
+ for (const elem of toggleList) {
63
+ const selector = SelectorEngine.getSelectorFromElement(elem);
64
+ const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
231
65
  if (selector !== null && filterElement.length) {
232
- this._selector = selector;
233
-
234
66
  this._triggerArray.push(elem);
235
67
  }
236
68
  }
237
-
238
69
  this._initializeChildren();
239
-
240
70
  if (!this._config.parent) {
241
71
  this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
242
72
  }
243
-
244
73
  if (this._config.toggle) {
245
74
  this.toggle();
246
75
  }
247
- } // Getters
248
-
76
+ }
249
77
 
78
+ // Getters
250
79
  static get Default() {
251
80
  return Default;
252
81
  }
253
-
82
+ static get DefaultType() {
83
+ return DefaultType;
84
+ }
254
85
  static get NAME() {
255
86
  return NAME;
256
- } // Public
257
-
87
+ }
258
88
 
89
+ // Public
259
90
  toggle() {
260
91
  if (this._isShown()) {
261
92
  this.hide();
@@ -263,231 +94,154 @@
263
94
  this.show();
264
95
  }
265
96
  }
266
-
267
97
  show() {
268
98
  if (this._isTransitioning || this._isShown()) {
269
99
  return;
270
100
  }
101
+ let activeChildren = [];
271
102
 
272
- let actives = [];
273
- let activesData;
274
-
103
+ // find active children
275
104
  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
105
+ activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
106
+ toggle: false
107
+ }));
278
108
  }
279
-
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;
285
-
286
- if (activesData && activesData._isTransitioning) {
287
- return;
288
- }
109
+ if (activeChildren.length && activeChildren[0]._isTransitioning) {
110
+ return;
289
111
  }
290
-
291
- const startEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW);
292
-
112
+ const startEvent = EventHandler.trigger(this._element, EVENT_SHOW);
293
113
  if (startEvent.defaultPrevented) {
294
114
  return;
295
115
  }
296
-
297
- actives.forEach(elemActive => {
298
- if (container !== elemActive) {
299
- Collapse.getOrCreateInstance(elemActive, {
300
- toggle: false
301
- }).hide();
302
- }
303
-
304
- if (!activesData) {
305
- Data__default.default.set(elemActive, DATA_KEY, null);
306
- }
307
- });
308
-
116
+ for (const activeInstance of activeChildren) {
117
+ activeInstance.hide();
118
+ }
309
119
  const dimension = this._getDimension();
310
-
311
120
  this._element.classList.remove(CLASS_NAME_COLLAPSE);
312
-
313
121
  this._element.classList.add(CLASS_NAME_COLLAPSING);
314
-
315
122
  this._element.style[dimension] = 0;
316
-
317
123
  this._addAriaAndCollapsedClass(this._triggerArray, true);
318
-
319
124
  this._isTransitioning = true;
320
-
321
125
  const complete = () => {
322
126
  this._isTransitioning = false;
323
-
324
127
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
325
-
326
128
  this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
327
-
328
129
  this._element.style[dimension] = '';
329
- EventHandler__default.default.trigger(this._element, EVENT_SHOWN);
130
+ EventHandler.trigger(this._element, EVENT_SHOWN);
330
131
  };
331
-
332
132
  const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
333
133
  const scrollSize = `scroll${capitalizedDimension}`;
334
-
335
134
  this._queueCallback(complete, this._element, true);
336
-
337
135
  this._element.style[dimension] = `${this._element[scrollSize]}px`;
338
136
  }
339
-
340
137
  hide() {
341
138
  if (this._isTransitioning || !this._isShown()) {
342
139
  return;
343
140
  }
344
-
345
- const startEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
346
-
141
+ const startEvent = EventHandler.trigger(this._element, EVENT_HIDE);
347
142
  if (startEvent.defaultPrevented) {
348
143
  return;
349
144
  }
350
-
351
145
  const dimension = this._getDimension();
352
-
353
146
  this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
354
- reflow(this._element);
355
-
147
+ index_js.reflow(this._element);
356
148
  this._element.classList.add(CLASS_NAME_COLLAPSING);
357
-
358
149
  this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
359
-
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)) {
150
+ for (const trigger of this._triggerArray) {
151
+ const element = SelectorEngine.getElementFromSelector(trigger);
152
+ if (element && !this._isShown(element)) {
367
153
  this._addAriaAndCollapsedClass([trigger], false);
368
154
  }
369
155
  }
370
-
371
156
  this._isTransitioning = true;
372
-
373
157
  const complete = () => {
374
158
  this._isTransitioning = false;
375
-
376
159
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
377
-
378
160
  this._element.classList.add(CLASS_NAME_COLLAPSE);
379
-
380
- EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
161
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
381
162
  };
382
-
383
163
  this._element.style[dimension] = '';
384
-
385
164
  this._queueCallback(complete, this._element, true);
386
165
  }
387
-
388
166
  _isShown(element = this._element) {
389
167
  return element.classList.contains(CLASS_NAME_SHOW);
390
- } // Private
391
-
168
+ }
392
169
 
393
- _getConfig(config) {
394
- config = { ...Default,
395
- ...Manipulator__default.default.getDataAttributes(this._element),
396
- ...config
397
- };
170
+ // Private
171
+ _configAfterMerge(config) {
398
172
  config.toggle = Boolean(config.toggle); // Coerce string values
399
-
400
- config.parent = getElement(config.parent);
401
- typeCheckConfig(NAME, config, DefaultType);
173
+ config.parent = index_js.getElement(config.parent);
402
174
  return config;
403
175
  }
404
-
405
176
  _getDimension() {
406
177
  return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
407
178
  }
408
-
409
179
  _initializeChildren() {
410
180
  if (!this._config.parent) {
411
181
  return;
412
182
  }
413
-
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);
417
-
183
+ const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);
184
+ for (const element of children) {
185
+ const selected = SelectorEngine.getElementFromSelector(element);
418
186
  if (selected) {
419
187
  this._addAriaAndCollapsedClass([element], this._isShown(selected));
420
188
  }
421
- });
189
+ }
190
+ }
191
+ _getFirstLevelChildren(selector) {
192
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
193
+ // remove children if greater depth
194
+ return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
422
195
  }
423
-
424
196
  _addAriaAndCollapsedClass(triggerArray, isOpen) {
425
197
  if (!triggerArray.length) {
426
198
  return;
427
199
  }
200
+ for (const element of triggerArray) {
201
+ element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
202
+ element.setAttribute('aria-expanded', isOpen);
203
+ }
204
+ }
428
205
 
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
- });
438
- } // Static
439
-
440
-
206
+ // Static
441
207
  static jQueryInterface(config) {
208
+ const _config = {};
209
+ if (typeof config === 'string' && /show|hide/.test(config)) {
210
+ _config.toggle = false;
211
+ }
442
212
  return this.each(function () {
443
- const _config = {};
444
-
445
- if (typeof config === 'string' && /show|hide/.test(config)) {
446
- _config.toggle = false;
447
- }
448
-
449
213
  const data = Collapse.getOrCreateInstance(this, _config);
450
-
451
214
  if (typeof config === 'string') {
452
215
  if (typeof data[config] === 'undefined') {
453
216
  throw new TypeError(`No method named "${config}"`);
454
217
  }
455
-
456
218
  data[config]();
457
219
  }
458
220
  });
459
221
  }
460
-
461
222
  }
223
+
462
224
  /**
463
- * ------------------------------------------------------------------------
464
- * Data Api implementation
465
- * ------------------------------------------------------------------------
225
+ * Data API implementation
466
226
  */
467
227
 
468
-
469
- EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
228
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
470
229
  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
471
230
  if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
472
231
  event.preventDefault();
473
232
  }
474
-
475
- const selector = getSelectorFromElement(this);
476
- const selectorElements = SelectorEngine__default.default.find(selector);
477
- selectorElements.forEach(element => {
233
+ for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
478
234
  Collapse.getOrCreateInstance(element, {
479
235
  toggle: false
480
236
  }).toggle();
481
- });
237
+ }
482
238
  });
239
+
483
240
  /**
484
- * ------------------------------------------------------------------------
485
241
  * jQuery
486
- * ------------------------------------------------------------------------
487
- * add .Collapse to jQuery only if jQuery is present
488
242
  */
489
243
 
490
- defineJQueryPlugin(Collapse);
244
+ index_js.defineJQueryPlugin(Collapse);
491
245
 
492
246
  return Collapse;
493
247
 
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Bootstrap data.js v5.1.3 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap data.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
@@ -11,56 +11,50 @@
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.1.3): dom/data.js
14
+ * Bootstrap dom/data.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
18
 
19
19
  /**
20
- * ------------------------------------------------------------------------
21
20
  * Constants
22
- * ------------------------------------------------------------------------
23
21
  */
22
+
24
23
  const elementMap = new Map();
25
24
  const data = {
26
25
  set(element, key, instance) {
27
26
  if (!elementMap.has(element)) {
28
27
  elementMap.set(element, new Map());
29
28
  }
29
+ const instanceMap = elementMap.get(element);
30
30
 
31
- const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
31
+ // make it clear we only want one instance per element
32
32
  // can be removed later when multiple key/instances are fine to be used
33
-
34
33
  if (!instanceMap.has(key) && instanceMap.size !== 0) {
35
34
  // eslint-disable-next-line no-console
36
35
  console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
37
36
  return;
38
37
  }
39
-
40
38
  instanceMap.set(key, instance);
41
39
  },
42
-
43
40
  get(element, key) {
44
41
  if (elementMap.has(element)) {
45
42
  return elementMap.get(element).get(key) || null;
46
43
  }
47
-
48
44
  return null;
49
45
  },
50
-
51
46
  remove(element, key) {
52
47
  if (!elementMap.has(element)) {
53
48
  return;
54
49
  }
55
-
56
50
  const instanceMap = elementMap.get(element);
57
- instanceMap.delete(key); // free up element references if there are no instances left for an element
51
+ instanceMap.delete(key);
58
52
 
53
+ // free up element references if there are no instances left for an element
59
54
  if (instanceMap.size === 0) {
60
55
  elementMap.delete(element);
61
56
  }
62
57
  }
63
-
64
58
  };
65
59
 
66
60
  return data;