bootstrap 5.0.1 → 5.1.2

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/assets/javascripts/bootstrap/alert.js +89 -58
  4. data/assets/javascripts/bootstrap/base-component.js +53 -39
  5. data/assets/javascripts/bootstrap/button.js +31 -25
  6. data/assets/javascripts/bootstrap/carousel.js +126 -89
  7. data/assets/javascripts/bootstrap/collapse.js +125 -133
  8. data/assets/javascripts/bootstrap/dom/data.js +5 -5
  9. data/assets/javascripts/bootstrap/dom/event-handler.js +11 -5
  10. data/assets/javascripts/bootstrap/dom/manipulator.js +6 -6
  11. data/assets/javascripts/bootstrap/dom/selector-engine.js +49 -7
  12. data/assets/javascripts/bootstrap/dropdown.js +147 -140
  13. data/assets/javascripts/bootstrap/modal.js +397 -180
  14. data/assets/javascripts/bootstrap/offcanvas.js +333 -138
  15. data/assets/javascripts/bootstrap/popover.js +36 -54
  16. data/assets/javascripts/bootstrap/scrollspy.js +58 -68
  17. data/assets/javascripts/bootstrap/tab.js +53 -26
  18. data/assets/javascripts/bootstrap/toast.js +138 -41
  19. data/assets/javascripts/bootstrap/tooltip.js +137 -120
  20. data/assets/javascripts/bootstrap-sprockets.js +8 -8
  21. data/assets/javascripts/bootstrap.js +937 -886
  22. data/assets/javascripts/bootstrap.min.js +2 -2
  23. data/assets/stylesheets/_bootstrap-grid.scss +3 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +2 -4
  25. data/assets/stylesheets/_bootstrap.scss +2 -1
  26. data/assets/stylesheets/bootstrap/_buttons.scss +1 -0
  27. data/assets/stylesheets/bootstrap/_card.scss +7 -6
  28. data/assets/stylesheets/bootstrap/_carousel.scss +2 -2
  29. data/assets/stylesheets/bootstrap/_dropdown.scss +4 -4
  30. data/assets/stylesheets/bootstrap/_functions.scss +100 -3
  31. data/assets/stylesheets/bootstrap/_grid.scss +11 -0
  32. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  33. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  34. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  35. data/assets/stylesheets/bootstrap/_modal.scss +5 -15
  36. data/assets/stylesheets/bootstrap/_navbar.scss +30 -1
  37. data/assets/stylesheets/bootstrap/_offcanvas.scss +8 -2
  38. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  39. data/assets/stylesheets/bootstrap/_popover.scss +10 -10
  40. data/assets/stylesheets/bootstrap/_reboot.scss +12 -8
  41. data/assets/stylesheets/bootstrap/_root.scss +40 -2
  42. data/assets/stylesheets/bootstrap/_tables.scss +9 -5
  43. data/assets/stylesheets/bootstrap/_toasts.scss +3 -3
  44. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -4
  45. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  46. data/assets/stylesheets/bootstrap/_utilities.scss +44 -8
  47. data/assets/stylesheets/bootstrap/_variables.scss +206 -29
  48. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  49. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +3 -1
  50. data/assets/stylesheets/bootstrap/forms/_form-check.scss +1 -1
  51. data/assets/stylesheets/bootstrap/forms/_form-control.scss +1 -1
  52. data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -1
  53. data/assets/stylesheets/bootstrap/forms/_form-select.scss +5 -0
  54. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  55. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  56. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +1 -1
  58. data/assets/stylesheets/bootstrap/mixins/_grid.scss +35 -9
  59. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +27 -6
  60. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +1 -1
  61. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +55 -13
  62. data/bootstrap.gemspec +3 -3
  63. data/lib/bootstrap/version.rb +2 -2
  64. data/tasks/updater/js.rb +6 -2
  65. metadata +12 -8
@@ -1,19 +1,24 @@
1
1
  /*!
2
- * Bootstrap popover.js v5.0.1 (https://getbootstrap.com/)
2
+ * Bootstrap popover.js v5.1.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 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/selector-engine.js'), require('./dom/data.js'), require('./tooltip.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/data', './tooltip'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.SelectorEngine, global.Data, global.Tooltip));
10
- }(this, (function (SelectorEngine, Data, Tooltip) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./tooltip.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./tooltip'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.Tooltip));
10
+ })(this, (function (Tooltip) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
13
 
14
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
- var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
16
- var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
14
+ const Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
15
+
16
+ /**
17
+ * --------------------------------------------------------------------------
18
+ * Bootstrap (v5.1.2): util/index.js
19
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
20
+ * --------------------------------------------------------------------------
21
+ */
17
22
 
18
23
  const getjQuery = () => {
19
24
  const {
@@ -27,9 +32,18 @@
27
32
  return null;
28
33
  };
29
34
 
35
+ const DOMContentLoadedCallbacks = [];
36
+
30
37
  const onDOMContentLoaded = callback => {
31
38
  if (document.readyState === 'loading') {
32
- document.addEventListener('DOMContentLoaded', callback);
39
+ // add listener on the first call when the document is in loading state
40
+ if (!DOMContentLoadedCallbacks.length) {
41
+ document.addEventListener('DOMContentLoaded', () => {
42
+ DOMContentLoadedCallbacks.forEach(callback => callback());
43
+ });
44
+ }
45
+
46
+ DOMContentLoadedCallbacks.push(callback);
33
47
  } else {
34
48
  callback();
35
49
  }
@@ -56,7 +70,7 @@
56
70
 
57
71
  /**
58
72
  * --------------------------------------------------------------------------
59
- * Bootstrap (v5.0.1): popover.js
73
+ * Bootstrap (v5.1.2): popover.js
60
74
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
61
75
  * --------------------------------------------------------------------------
62
76
  */
@@ -70,15 +84,14 @@
70
84
  const DATA_KEY = 'bs.popover';
71
85
  const EVENT_KEY = `.${DATA_KEY}`;
72
86
  const CLASS_PREFIX = 'bs-popover';
73
- const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
74
- const Default = { ...Tooltip__default['default'].Default,
87
+ const Default = { ...Tooltip__default.default.Default,
75
88
  placement: 'right',
76
89
  offset: [0, 8],
77
90
  trigger: 'click',
78
91
  content: '',
79
92
  template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>'
80
93
  };
81
- const DefaultType = { ...Tooltip__default['default'].DefaultType,
94
+ const DefaultType = { ...Tooltip__default.default.DefaultType,
82
95
  content: '(string|element|function)'
83
96
  };
84
97
  const Event = {
@@ -93,8 +106,6 @@
93
106
  MOUSEENTER: `mouseenter${EVENT_KEY}`,
94
107
  MOUSELEAVE: `mouseleave${EVENT_KEY}`
95
108
  };
96
- const CLASS_NAME_FADE = 'fade';
97
- const CLASS_NAME_SHOW = 'show';
98
109
  const SELECTOR_TITLE = '.popover-header';
99
110
  const SELECTOR_CONTENT = '.popover-body';
100
111
  /**
@@ -103,7 +114,7 @@
103
114
  * ------------------------------------------------------------------------
104
115
  */
105
116
 
106
- class Popover extends Tooltip__default['default'] {
117
+ class Popover extends Tooltip__default.default {
107
118
  // Getters
108
119
  static get Default() {
109
120
  return Default;
@@ -126,54 +137,25 @@
126
137
  return this.getTitle() || this._getContent();
127
138
  }
128
139
 
129
- setContent() {
130
- const tip = this.getTipElement(); // we use append for html objects to maintain js events
131
-
132
- this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_TITLE, tip), this.getTitle());
133
-
134
- let content = this._getContent();
140
+ setContent(tip) {
141
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
135
142
 
136
- if (typeof content === 'function') {
137
- content = content.call(this._element);
138
- }
139
-
140
- this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_CONTENT, tip), content);
141
- tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
143
+ this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
142
144
  } // Private
143
145
 
144
146
 
145
- _addAttachmentClass(attachment) {
146
- this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
147
- }
148
-
149
147
  _getContent() {
150
- return this._element.getAttribute('data-bs-content') || this._config.content;
148
+ return this._resolvePossibleFunction(this._config.content);
151
149
  }
152
150
 
153
- _cleanTipClass() {
154
- const tip = this.getTipElement();
155
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
156
-
157
- if (tabClass !== null && tabClass.length > 0) {
158
- tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
159
- }
151
+ _getBasicClassPrefix() {
152
+ return CLASS_PREFIX;
160
153
  } // Static
161
154
 
162
155
 
163
156
  static jQueryInterface(config) {
164
157
  return this.each(function () {
165
- let data = Data__default['default'].get(this, DATA_KEY);
166
-
167
- const _config = typeof config === 'object' ? config : null;
168
-
169
- if (!data && /dispose|hide/.test(config)) {
170
- return;
171
- }
172
-
173
- if (!data) {
174
- data = new Popover(this, _config);
175
- Data__default['default'].set(this, DATA_KEY, data);
176
- }
158
+ const data = Popover.getOrCreateInstance(this, config);
177
159
 
178
160
  if (typeof config === 'string') {
179
161
  if (typeof data[config] === 'undefined') {
@@ -198,4 +180,4 @@
198
180
 
199
181
  return Popover;
200
182
 
201
- })));
183
+ }));
@@ -1,30 +1,28 @@
1
1
  /*!
2
- * Bootstrap scrollspy.js v5.0.1 (https://getbootstrap.com/)
2
+ * Bootstrap scrollspy.js v5.1.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 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/selector-engine.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/event-handler', './dom/manipulator', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ScrollSpy = factory(global.SelectorEngine, global.EventHandler, global.Manipulator, global.Base));
10
- }(this, (function (SelectorEngine, EventHandler, Manipulator, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(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/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ScrollSpy = factory(global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
+ })(this, (function (EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
13
 
14
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
- var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
- var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
17
- var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
17
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
18
 
19
19
  /**
20
20
  * --------------------------------------------------------------------------
21
- * Bootstrap (v5.0.1): util/index.js
21
+ * Bootstrap (v5.1.2): util/index.js
22
22
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
23
23
  * --------------------------------------------------------------------------
24
24
  */
25
25
 
26
- const MAX_UID = 1000000;
27
-
28
26
  const toType = obj => {
29
27
  if (obj === null || obj === undefined) {
30
28
  return `${obj}`;
@@ -32,20 +30,6 @@
32
30
 
33
31
  return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
34
32
  };
35
- /**
36
- * --------------------------------------------------------------------------
37
- * Public Util Api
38
- * --------------------------------------------------------------------------
39
- */
40
-
41
-
42
- const getUID = prefix => {
43
- do {
44
- prefix += Math.floor(Math.random() * MAX_UID);
45
- } while (document.getElementById(prefix));
46
-
47
- return prefix;
48
- };
49
33
 
50
34
  const getSelector = element => {
51
35
  let selector = element.getAttribute('data-bs-target');
@@ -93,6 +77,19 @@
93
77
  return typeof obj.nodeType !== 'undefined';
94
78
  };
95
79
 
80
+ const getElement = obj => {
81
+ if (isElement(obj)) {
82
+ // it's a jQuery object or a node element
83
+ return obj.jquery ? obj[0] : obj;
84
+ }
85
+
86
+ if (typeof obj === 'string' && obj.length > 0) {
87
+ return document.querySelector(obj);
88
+ }
89
+
90
+ return null;
91
+ };
92
+
96
93
  const typeCheckConfig = (componentName, config, configTypes) => {
97
94
  Object.keys(configTypes).forEach(property => {
98
95
  const expectedTypes = configTypes[property];
@@ -117,9 +114,18 @@
117
114
  return null;
118
115
  };
119
116
 
117
+ const DOMContentLoadedCallbacks = [];
118
+
120
119
  const onDOMContentLoaded = callback => {
121
120
  if (document.readyState === 'loading') {
122
- document.addEventListener('DOMContentLoaded', callback);
121
+ // add listener on the first call when the document is in loading state
122
+ if (!DOMContentLoadedCallbacks.length) {
123
+ document.addEventListener('DOMContentLoaded', () => {
124
+ DOMContentLoadedCallbacks.forEach(callback => callback());
125
+ });
126
+ }
127
+
128
+ DOMContentLoadedCallbacks.push(callback);
123
129
  } else {
124
130
  callback();
125
131
  }
@@ -146,7 +152,7 @@
146
152
 
147
153
  /**
148
154
  * --------------------------------------------------------------------------
149
- * Bootstrap (v5.0.1): scrollspy.js
155
+ * Bootstrap (v5.1.2): scrollspy.js
150
156
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
151
157
  * --------------------------------------------------------------------------
152
158
  */
@@ -180,6 +186,7 @@
180
186
  const SELECTOR_NAV_LINKS = '.nav-link';
181
187
  const SELECTOR_NAV_ITEMS = '.nav-item';
182
188
  const SELECTOR_LIST_ITEMS = '.list-group-item';
189
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
183
190
  const SELECTOR_DROPDOWN = '.dropdown';
184
191
  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
185
192
  const METHOD_OFFSET = 'offset';
@@ -190,17 +197,16 @@
190
197
  * ------------------------------------------------------------------------
191
198
  */
192
199
 
193
- class ScrollSpy extends BaseComponent__default['default'] {
200
+ class ScrollSpy extends BaseComponent__default.default {
194
201
  constructor(element, config) {
195
202
  super(element);
196
203
  this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
197
204
  this._config = this._getConfig(config);
198
- this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
199
205
  this._offsets = [];
200
206
  this._targets = [];
201
207
  this._activeTarget = null;
202
208
  this._scrollHeight = 0;
203
- EventHandler__default['default'].on(this._scrollElement, EVENT_SCROLL, () => this._process());
209
+ EventHandler__default.default.on(this._scrollElement, EVENT_SCROLL, () => this._process());
204
210
  this.refresh();
205
211
 
206
212
  this._process();
@@ -223,16 +229,16 @@
223
229
  this._offsets = [];
224
230
  this._targets = [];
225
231
  this._scrollHeight = this._getScrollHeight();
226
- const targets = SelectorEngine__default['default'].find(this._selector);
232
+ const targets = SelectorEngine__default.default.find(SELECTOR_LINK_ITEMS, this._config.target);
227
233
  targets.map(element => {
228
234
  const targetSelector = getSelectorFromElement(element);
229
- const target = targetSelector ? SelectorEngine__default['default'].findOne(targetSelector) : null;
235
+ const target = targetSelector ? SelectorEngine__default.default.findOne(targetSelector) : null;
230
236
 
231
237
  if (target) {
232
238
  const targetBCR = target.getBoundingClientRect();
233
239
 
234
240
  if (targetBCR.width || targetBCR.height) {
235
- return [Manipulator__default['default'][offsetMethod](target).top + offsetBase, targetSelector];
241
+ return [Manipulator__default.default[offsetMethod](target).top + offsetBase, targetSelector];
236
242
  }
237
243
  }
238
244
 
@@ -245,30 +251,17 @@
245
251
  }
246
252
 
247
253
  dispose() {
248
- EventHandler__default['default'].off(this._scrollElement, EVENT_KEY);
254
+ EventHandler__default.default.off(this._scrollElement, EVENT_KEY);
249
255
  super.dispose();
250
256
  } // Private
251
257
 
252
258
 
253
259
  _getConfig(config) {
254
260
  config = { ...Default,
255
- ...Manipulator__default['default'].getDataAttributes(this._element),
261
+ ...Manipulator__default.default.getDataAttributes(this._element),
256
262
  ...(typeof config === 'object' && config ? config : {})
257
263
  };
258
-
259
- if (typeof config.target !== 'string' && isElement(config.target)) {
260
- let {
261
- id
262
- } = config.target;
263
-
264
- if (!id) {
265
- id = getUID(NAME);
266
- config.target.id = id;
267
- }
268
-
269
- config.target = `#${id}`;
270
- }
271
-
264
+ config.target = getElement(config.target) || document.documentElement;
272
265
  typeCheckConfig(NAME, config, DefaultType);
273
266
  return config;
274
267
  }
@@ -328,40 +321,37 @@
328
321
 
329
322
  this._clear();
330
323
 
331
- const queries = this._selector.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
332
-
333
- const link = SelectorEngine__default['default'].findOne(queries.join(','));
324
+ const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
325
+ const link = SelectorEngine__default.default.findOne(queries.join(','), this._config.target);
326
+ link.classList.add(CLASS_NAME_ACTIVE);
334
327
 
335
328
  if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
336
- SelectorEngine__default['default'].findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
337
- link.classList.add(CLASS_NAME_ACTIVE);
329
+ SelectorEngine__default.default.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
338
330
  } else {
339
- // Set triggered link as active
340
- link.classList.add(CLASS_NAME_ACTIVE);
341
- SelectorEngine__default['default'].parents(link, SELECTOR_NAV_LIST_GROUP).forEach(listGroup => {
331
+ SelectorEngine__default.default.parents(link, SELECTOR_NAV_LIST_GROUP).forEach(listGroup => {
342
332
  // Set triggered links parents as active
343
333
  // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
344
- SelectorEngine__default['default'].prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE)); // Handle special case when .nav-link is inside .nav-item
334
+ SelectorEngine__default.default.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE)); // Handle special case when .nav-link is inside .nav-item
345
335
 
346
- SelectorEngine__default['default'].prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {
347
- SelectorEngine__default['default'].children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE));
336
+ SelectorEngine__default.default.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {
337
+ SelectorEngine__default.default.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE));
348
338
  });
349
339
  });
350
340
  }
351
341
 
352
- EventHandler__default['default'].trigger(this._scrollElement, EVENT_ACTIVATE, {
342
+ EventHandler__default.default.trigger(this._scrollElement, EVENT_ACTIVATE, {
353
343
  relatedTarget: target
354
344
  });
355
345
  }
356
346
 
357
347
  _clear() {
358
- SelectorEngine__default['default'].find(this._selector).filter(node => node.classList.contains(CLASS_NAME_ACTIVE)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE));
348
+ SelectorEngine__default.default.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE));
359
349
  } // Static
360
350
 
361
351
 
362
352
  static jQueryInterface(config) {
363
353
  return this.each(function () {
364
- const data = ScrollSpy.getInstance(this) || new ScrollSpy(this, typeof config === 'object' ? config : {});
354
+ const data = ScrollSpy.getOrCreateInstance(this, config);
365
355
 
366
356
  if (typeof config !== 'string') {
367
357
  return;
@@ -383,8 +373,8 @@
383
373
  */
384
374
 
385
375
 
386
- EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => {
387
- SelectorEngine__default['default'].find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
376
+ EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => {
377
+ SelectorEngine__default.default.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
388
378
  });
389
379
  /**
390
380
  * ------------------------------------------------------------------------
@@ -397,4 +387,4 @@
397
387
 
398
388
  return ScrollSpy;
399
389
 
400
- })));
390
+ }));
@@ -1,20 +1,26 @@
1
1
  /*!
2
- * Bootstrap tab.js v5.0.1 (https://getbootstrap.com/)
2
+ * Bootstrap tab.js v5.1.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 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/selector-engine.js'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/data', './dom/event-handler', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.SelectorEngine, global.Data, global.EventHandler, global.Base));
10
- }(this, (function (SelectorEngine, Data, EventHandler, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/event-handler', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.EventHandler, global.SelectorEngine, global.Base));
10
+ })(this, (function (EventHandler, SelectorEngine, BaseComponent) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
13
 
14
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
- var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
16
- var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
17
- var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
16
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
17
+
18
+ /**
19
+ * --------------------------------------------------------------------------
20
+ * Bootstrap (v5.1.2): util/index.js
21
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
22
+ * --------------------------------------------------------------------------
23
+ */
18
24
 
19
25
  const getSelector = element => {
20
26
  let selector = element.getAttribute('data-bs-target');
@@ -60,8 +66,20 @@
60
66
 
61
67
  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
62
68
  };
69
+ /**
70
+ * Trick to restart an element's animation
71
+ *
72
+ * @param {HTMLElement} element
73
+ * @return void
74
+ *
75
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
76
+ */
77
+
63
78
 
64
- const reflow = element => element.offsetHeight;
79
+ const reflow = element => {
80
+ // eslint-disable-next-line no-unused-expressions
81
+ element.offsetHeight;
82
+ };
65
83
 
66
84
  const getjQuery = () => {
67
85
  const {
@@ -75,9 +93,18 @@
75
93
  return null;
76
94
  };
77
95
 
96
+ const DOMContentLoadedCallbacks = [];
97
+
78
98
  const onDOMContentLoaded = callback => {
79
99
  if (document.readyState === 'loading') {
80
- document.addEventListener('DOMContentLoaded', callback);
100
+ // add listener on the first call when the document is in loading state
101
+ if (!DOMContentLoadedCallbacks.length) {
102
+ document.addEventListener('DOMContentLoaded', () => {
103
+ DOMContentLoadedCallbacks.forEach(callback => callback());
104
+ });
105
+ }
106
+
107
+ DOMContentLoadedCallbacks.push(callback);
81
108
  } else {
82
109
  callback();
83
110
  }
@@ -104,7 +131,7 @@
104
131
 
105
132
  /**
106
133
  * --------------------------------------------------------------------------
107
- * Bootstrap (v5.0.1): tab.js
134
+ * Bootstrap (v5.1.2): tab.js
108
135
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
109
136
  * --------------------------------------------------------------------------
110
137
  */
@@ -140,7 +167,7 @@
140
167
  * ------------------------------------------------------------------------
141
168
  */
142
169
 
143
- class Tab extends BaseComponent__default['default'] {
170
+ class Tab extends BaseComponent__default.default {
144
171
  // Getters
145
172
  static get NAME() {
146
173
  return NAME;
@@ -159,14 +186,14 @@
159
186
 
160
187
  if (listElement) {
161
188
  const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
162
- previous = SelectorEngine__default['default'].find(itemSelector, listElement);
189
+ previous = SelectorEngine__default.default.find(itemSelector, listElement);
163
190
  previous = previous[previous.length - 1];
164
191
  }
165
192
 
166
- const hideEvent = previous ? EventHandler__default['default'].trigger(previous, EVENT_HIDE, {
193
+ const hideEvent = previous ? EventHandler__default.default.trigger(previous, EVENT_HIDE, {
167
194
  relatedTarget: this._element
168
195
  }) : null;
169
- const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
196
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
170
197
  relatedTarget: previous
171
198
  });
172
199
 
@@ -177,10 +204,10 @@
177
204
  this._activate(this._element, listElement);
178
205
 
179
206
  const complete = () => {
180
- EventHandler__default['default'].trigger(previous, EVENT_HIDDEN, {
207
+ EventHandler__default.default.trigger(previous, EVENT_HIDDEN, {
181
208
  relatedTarget: this._element
182
209
  });
183
- EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
210
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
184
211
  relatedTarget: previous
185
212
  });
186
213
  };
@@ -194,7 +221,7 @@
194
221
 
195
222
 
196
223
  _activate(element, container, callback) {
197
- const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine__default['default'].find(SELECTOR_ACTIVE_UL, container) : SelectorEngine__default['default'].children(container, SELECTOR_ACTIVE);
224
+ const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine__default.default.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine__default.default.children(container, SELECTOR_ACTIVE);
198
225
  const active = activeElements[0];
199
226
  const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE);
200
227
 
@@ -212,7 +239,7 @@
212
239
  _transitionComplete(element, active, callback) {
213
240
  if (active) {
214
241
  active.classList.remove(CLASS_NAME_ACTIVE);
215
- const dropdownChild = SelectorEngine__default['default'].findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
242
+ const dropdownChild = SelectorEngine__default.default.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
216
243
 
217
244
  if (dropdownChild) {
218
245
  dropdownChild.classList.remove(CLASS_NAME_ACTIVE);
@@ -245,7 +272,7 @@
245
272
  const dropdownElement = element.closest(SELECTOR_DROPDOWN);
246
273
 
247
274
  if (dropdownElement) {
248
- SelectorEngine__default['default'].find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
275
+ SelectorEngine__default.default.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
249
276
  }
250
277
 
251
278
  element.setAttribute('aria-expanded', true);
@@ -259,7 +286,7 @@
259
286
 
260
287
  static jQueryInterface(config) {
261
288
  return this.each(function () {
262
- const data = Data__default['default'].get(this, DATA_KEY) || new Tab(this);
289
+ const data = Tab.getOrCreateInstance(this);
263
290
 
264
291
  if (typeof config === 'string') {
265
292
  if (typeof data[config] === 'undefined') {
@@ -279,7 +306,7 @@
279
306
  */
280
307
 
281
308
 
282
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
309
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
283
310
  if (['A', 'AREA'].includes(this.tagName)) {
284
311
  event.preventDefault();
285
312
  }
@@ -288,7 +315,7 @@
288
315
  return;
289
316
  }
290
317
 
291
- const data = Data__default['default'].get(this, DATA_KEY) || new Tab(this);
318
+ const data = Tab.getOrCreateInstance(this);
292
319
  data.show();
293
320
  });
294
321
  /**
@@ -302,4 +329,4 @@
302
329
 
303
330
  return Tab;
304
331
 
305
- })));
332
+ }));