bootstrap 5.0.1 → 5.1.2

Sign up to get free protection for your applications and to get access to all the features.
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
+ }));