bootstrap 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/assets/javascripts/bootstrap-sprockets.js +7 -7
  4. data/assets/javascripts/bootstrap.js +590 -580
  5. data/assets/javascripts/bootstrap.min.js +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +73 -43
  7. data/assets/javascripts/bootstrap/base-component.js +15 -10
  8. data/assets/javascripts/bootstrap/button.js +13 -6
  9. data/assets/javascripts/bootstrap/carousel.js +26 -8
  10. data/assets/javascripts/bootstrap/collapse.js +96 -114
  11. data/assets/javascripts/bootstrap/dom/data.js +2 -2
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +9 -2
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +4 -4
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +47 -5
  15. data/assets/javascripts/bootstrap/dropdown.js +66 -74
  16. data/assets/javascripts/bootstrap/modal.js +198 -52
  17. data/assets/javascripts/bootstrap/offcanvas.js +177 -31
  18. data/assets/javascripts/bootstrap/popover.js +19 -52
  19. data/assets/javascripts/bootstrap/scrollspy.js +28 -47
  20. data/assets/javascripts/bootstrap/tab.js +27 -8
  21. data/assets/javascripts/bootstrap/toast.js +108 -13
  22. data/assets/javascripts/bootstrap/tooltip.js +57 -47
  23. data/assets/stylesheets/_bootstrap-grid.scss +1 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +1 -1
  25. data/assets/stylesheets/_bootstrap.scss +2 -1
  26. data/assets/stylesheets/bootstrap/_card.scss +2 -1
  27. data/assets/stylesheets/bootstrap/_functions.scss +45 -12
  28. data/assets/stylesheets/bootstrap/_grid.scss +11 -0
  29. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  30. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  31. data/assets/stylesheets/bootstrap/_modal.scss +1 -11
  32. data/assets/stylesheets/bootstrap/_navbar.scss +30 -1
  33. data/assets/stylesheets/bootstrap/_offcanvas.scss +4 -0
  34. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  35. data/assets/stylesheets/bootstrap/_reboot.scss +12 -8
  36. data/assets/stylesheets/bootstrap/_root.scss +39 -2
  37. data/assets/stylesheets/bootstrap/_toasts.scss +2 -2
  38. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  39. data/assets/stylesheets/bootstrap/_utilities.scss +44 -8
  40. data/assets/stylesheets/bootstrap/_variables.scss +167 -6
  41. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  42. data/assets/stylesheets/bootstrap/forms/_form-control.scss +1 -1
  43. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  44. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  45. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  46. data/assets/stylesheets/bootstrap/mixins/_grid.scss +25 -7
  47. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +27 -6
  48. data/bootstrap.gemspec +3 -3
  49. data/lib/bootstrap/version.rb +2 -2
  50. data/tasks/updater/js.rb +6 -2
  51. metadata +11 -7
@@ -1,30 +1,28 @@
1
1
  /*!
2
- * Bootstrap scrollspy.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap scrollspy.js v5.1.0 (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
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
14
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
15
  var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
17
17
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
18
 
19
19
  /**
20
20
  * --------------------------------------------------------------------------
21
- * Bootstrap (v5.0.2): util/index.js
21
+ * Bootstrap (v5.1.0): 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];
@@ -155,7 +152,7 @@
155
152
 
156
153
  /**
157
154
  * --------------------------------------------------------------------------
158
- * Bootstrap (v5.0.2): scrollspy.js
155
+ * Bootstrap (v5.1.0): scrollspy.js
159
156
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
160
157
  * --------------------------------------------------------------------------
161
158
  */
@@ -189,6 +186,7 @@
189
186
  const SELECTOR_NAV_LINKS = '.nav-link';
190
187
  const SELECTOR_NAV_ITEMS = '.nav-item';
191
188
  const SELECTOR_LIST_ITEMS = '.list-group-item';
189
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
192
190
  const SELECTOR_DROPDOWN = '.dropdown';
193
191
  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
194
192
  const METHOD_OFFSET = 'offset';
@@ -204,7 +202,6 @@
204
202
  super(element);
205
203
  this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
206
204
  this._config = this._getConfig(config);
207
- this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
208
205
  this._offsets = [];
209
206
  this._targets = [];
210
207
  this._activeTarget = null;
@@ -232,7 +229,7 @@
232
229
  this._offsets = [];
233
230
  this._targets = [];
234
231
  this._scrollHeight = this._getScrollHeight();
235
- const targets = SelectorEngine__default['default'].find(this._selector);
232
+ const targets = SelectorEngine__default['default'].find(SELECTOR_LINK_ITEMS, this._config.target);
236
233
  targets.map(element => {
237
234
  const targetSelector = getSelectorFromElement(element);
238
235
  const target = targetSelector ? SelectorEngine__default['default'].findOne(targetSelector) : null;
@@ -264,20 +261,7 @@
264
261
  ...Manipulator__default['default'].getDataAttributes(this._element),
265
262
  ...(typeof config === 'object' && config ? config : {})
266
263
  };
267
-
268
- if (typeof config.target !== 'string' && isElement(config.target)) {
269
- let {
270
- id
271
- } = config.target;
272
-
273
- if (!id) {
274
- id = getUID(NAME);
275
- config.target.id = id;
276
- }
277
-
278
- config.target = `#${id}`;
279
- }
280
-
264
+ config.target = getElement(config.target) || document.documentElement;
281
265
  typeCheckConfig(NAME, config, DefaultType);
282
266
  return config;
283
267
  }
@@ -337,16 +321,13 @@
337
321
 
338
322
  this._clear();
339
323
 
340
- const queries = this._selector.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
341
-
342
- 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);
343
327
 
344
328
  if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
345
329
  SelectorEngine__default['default'].findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
346
- link.classList.add(CLASS_NAME_ACTIVE);
347
330
  } else {
348
- // Set triggered link as active
349
- link.classList.add(CLASS_NAME_ACTIVE);
350
331
  SelectorEngine__default['default'].parents(link, SELECTOR_NAV_LIST_GROUP).forEach(listGroup => {
351
332
  // Set triggered links parents as active
352
333
  // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
@@ -364,7 +345,7 @@
364
345
  }
365
346
 
366
347
  _clear() {
367
- 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));
368
349
  } // Static
369
350
 
370
351
 
@@ -1,20 +1,27 @@
1
1
  /*!
2
- * Bootstrap tab.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap tab.js v5.1.0 (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('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/event-handler', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.SelectorEngine, global.EventHandler, global.Base));
10
- }(this, (function (SelectorEngine, 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
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
14
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
16
16
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
17
17
 
18
+ /**
19
+ * --------------------------------------------------------------------------
20
+ * Bootstrap (v5.1.0): util/index.js
21
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
22
+ * --------------------------------------------------------------------------
23
+ */
24
+
18
25
  const getSelector = element => {
19
26
  let selector = element.getAttribute('data-bs-target');
20
27
 
@@ -59,8 +66,20 @@
59
66
 
60
67
  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
61
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
+
62
78
 
63
- const reflow = element => element.offsetHeight;
79
+ const reflow = element => {
80
+ // eslint-disable-next-line no-unused-expressions
81
+ element.offsetHeight;
82
+ };
64
83
 
65
84
  const getjQuery = () => {
66
85
  const {
@@ -112,7 +131,7 @@
112
131
 
113
132
  /**
114
133
  * --------------------------------------------------------------------------
115
- * Bootstrap (v5.0.2): tab.js
134
+ * Bootstrap (v5.1.0): tab.js
116
135
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
117
136
  * --------------------------------------------------------------------------
118
137
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap toast.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap toast.js v5.1.0 (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
  */
@@ -15,6 +15,13 @@
15
15
  var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
16
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
17
17
 
18
+ /**
19
+ * --------------------------------------------------------------------------
20
+ * Bootstrap (v5.1.0): util/index.js
21
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
22
+ * --------------------------------------------------------------------------
23
+ */
24
+
18
25
  const toType = obj => {
19
26
  if (obj === null || obj === undefined) {
20
27
  return `${obj}`;
@@ -23,6 +30,35 @@
23
30
  return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
24
31
  };
25
32
 
33
+ const getSelector = element => {
34
+ let selector = element.getAttribute('data-bs-target');
35
+
36
+ if (!selector || selector === '#') {
37
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
38
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
39
+ // `document.querySelector` will rightfully complain it is invalid.
40
+ // See https://github.com/twbs/bootstrap/issues/32273
41
+
42
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
43
+ return null;
44
+ } // Just in case some CMS puts out a full URL with the anchor appended
45
+
46
+
47
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
48
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
49
+ }
50
+
51
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
52
+ }
53
+
54
+ return selector;
55
+ };
56
+
57
+ const getElementFromSelector = element => {
58
+ const selector = getSelector(element);
59
+ return selector ? document.querySelector(selector) : null;
60
+ };
61
+
26
62
  const isElement = obj => {
27
63
  if (!obj || typeof obj !== 'object') {
28
64
  return false;
@@ -47,7 +83,35 @@
47
83
  });
48
84
  };
49
85
 
50
- const reflow = element => element.offsetHeight;
86
+ const isDisabled = element => {
87
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
88
+ return true;
89
+ }
90
+
91
+ if (element.classList.contains('disabled')) {
92
+ return true;
93
+ }
94
+
95
+ if (typeof element.disabled !== 'undefined') {
96
+ return element.disabled;
97
+ }
98
+
99
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
100
+ };
101
+ /**
102
+ * Trick to restart an element's animation
103
+ *
104
+ * @param {HTMLElement} element
105
+ * @return void
106
+ *
107
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
108
+ */
109
+
110
+
111
+ const reflow = element => {
112
+ // eslint-disable-next-line no-unused-expressions
113
+ element.offsetHeight;
114
+ };
51
115
 
52
116
  const getjQuery = () => {
53
117
  const {
@@ -99,7 +163,33 @@
99
163
 
100
164
  /**
101
165
  * --------------------------------------------------------------------------
102
- * Bootstrap (v5.0.2): toast.js
166
+ * Bootstrap (v5.1.0): util/component-functions.js
167
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
168
+ * --------------------------------------------------------------------------
169
+ */
170
+
171
+ const enableDismissTrigger = (component, method = 'hide') => {
172
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
173
+ const name = component.NAME;
174
+ EventHandler__default['default'].on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
175
+ if (['A', 'AREA'].includes(this.tagName)) {
176
+ event.preventDefault();
177
+ }
178
+
179
+ if (isDisabled(this)) {
180
+ return;
181
+ }
182
+
183
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
184
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
185
+
186
+ instance[method]();
187
+ });
188
+ };
189
+
190
+ /**
191
+ * --------------------------------------------------------------------------
192
+ * Bootstrap (v5.1.0): toast.js
103
193
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
104
194
  * --------------------------------------------------------------------------
105
195
  */
@@ -112,7 +202,6 @@
112
202
  const NAME = 'toast';
113
203
  const DATA_KEY = 'bs.toast';
114
204
  const EVENT_KEY = `.${DATA_KEY}`;
115
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
116
205
  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
117
206
  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
118
207
  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
@@ -122,7 +211,8 @@
122
211
  const EVENT_SHOW = `show${EVENT_KEY}`;
123
212
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
124
213
  const CLASS_NAME_FADE = 'fade';
125
- const CLASS_NAME_HIDE = 'hide';
214
+ const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
215
+
126
216
  const CLASS_NAME_SHOW = 'show';
127
217
  const CLASS_NAME_SHOWING = 'showing';
128
218
  const DefaultType = {
@@ -135,7 +225,6 @@
135
225
  autohide: true,
136
226
  delay: 5000
137
227
  };
138
- const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="toast"]';
139
228
  /**
140
229
  * ------------------------------------------------------------------------
141
230
  * Class Definition
@@ -183,17 +272,18 @@
183
272
  const complete = () => {
184
273
  this._element.classList.remove(CLASS_NAME_SHOWING);
185
274
 
186
- this._element.classList.add(CLASS_NAME_SHOW);
187
-
188
275
  EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
189
276
 
190
277
  this._maybeScheduleHide();
191
278
  };
192
279
 
193
- this._element.classList.remove(CLASS_NAME_HIDE);
280
+ this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
281
+
194
282
 
195
283
  reflow(this._element);
196
284
 
285
+ this._element.classList.add(CLASS_NAME_SHOW);
286
+
197
287
  this._element.classList.add(CLASS_NAME_SHOWING);
198
288
 
199
289
  this._queueCallback(complete, this._element, this._config.animation);
@@ -211,12 +301,17 @@
211
301
  }
212
302
 
213
303
  const complete = () => {
214
- this._element.classList.add(CLASS_NAME_HIDE);
304
+ this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
305
+
306
+
307
+ this._element.classList.remove(CLASS_NAME_SHOWING);
308
+
309
+ this._element.classList.remove(CLASS_NAME_SHOW);
215
310
 
216
311
  EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
217
312
  };
218
313
 
219
- this._element.classList.remove(CLASS_NAME_SHOW);
314
+ this._element.classList.add(CLASS_NAME_SHOWING);
220
315
 
221
316
  this._queueCallback(complete, this._element, this._config.animation);
222
317
  }
@@ -284,7 +379,6 @@
284
379
  }
285
380
 
286
381
  _setListeners() {
287
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
288
382
  EventHandler__default['default'].on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
289
383
  EventHandler__default['default'].on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
290
384
  EventHandler__default['default'].on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
@@ -312,6 +406,8 @@
312
406
  }
313
407
 
314
408
  }
409
+
410
+ enableDismissTrigger(Toast);
315
411
  /**
316
412
  * ------------------------------------------------------------------------
317
413
  * jQuery
@@ -319,7 +415,6 @@
319
415
  * add .Toast to jQuery only if jQuery is present
320
416
  */
321
417
 
322
-
323
418
  defineJQueryPlugin(Toast);
324
419
 
325
420
  return Toast;
@@ -1,13 +1,13 @@
1
1
  /*!
2
- * Bootstrap tooltip.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap tooltip.js v5.1.0 (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('@popperjs/core'), require('./dom/selector-engine.js'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/selector-engine', './dom/data', './dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.Popper, global.SelectorEngine, global.Data, global.EventHandler, global.Manipulator, global.Base));
10
- }(this, (function (Popper, SelectorEngine, Data, EventHandler, Manipulator, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), 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(['@popperjs/core', './dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global.Popper, global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
+ }(this, (function (Popper, Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
@@ -32,19 +32,18 @@
32
32
  }
33
33
 
34
34
  var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
35
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
36
35
  var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
37
36
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
38
37
  var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
38
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
39
39
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
40
40
 
41
41
  /**
42
42
  * --------------------------------------------------------------------------
43
- * Bootstrap (v5.0.2): util/index.js
43
+ * Bootstrap (v5.1.0): util/index.js
44
44
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
45
45
  * --------------------------------------------------------------------------
46
46
  */
47
-
48
47
  const MAX_UID = 1000000;
49
48
 
50
49
  const toType = obj => {
@@ -88,7 +87,7 @@
88
87
  }
89
88
 
90
89
  if (typeof obj === 'string' && obj.length > 0) {
91
- return SelectorEngine__default['default'].findOne(obj);
90
+ return document.querySelector(obj);
92
91
  }
93
92
 
94
93
  return null;
@@ -183,7 +182,7 @@
183
182
 
184
183
  /**
185
184
  * --------------------------------------------------------------------------
186
- * Bootstrap (v5.0.2): util/sanitizer.js
185
+ * Bootstrap (v5.1.0): util/sanitizer.js
187
186
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
188
187
  * --------------------------------------------------------------------------
189
188
  */
@@ -296,7 +295,7 @@
296
295
 
297
296
  /**
298
297
  * --------------------------------------------------------------------------
299
- * Bootstrap (v5.0.2): tooltip.js
298
+ * Bootstrap (v5.1.0): tooltip.js
300
299
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
301
300
  * --------------------------------------------------------------------------
302
301
  */
@@ -310,7 +309,6 @@
310
309
  const DATA_KEY = 'bs.tooltip';
311
310
  const EVENT_KEY = `.${DATA_KEY}`;
312
311
  const CLASS_PREFIX = 'bs-tooltip';
313
- const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
314
312
  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
315
313
  const DefaultType = {
316
314
  animation: 'boolean',
@@ -375,6 +373,8 @@
375
373
  const HOVER_STATE_SHOW = 'show';
376
374
  const HOVER_STATE_OUT = 'out';
377
375
  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
376
+ const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
377
+ const EVENT_MODAL_HIDE = 'hide.bs.modal';
378
378
  const TRIGGER_HOVER = 'hover';
379
379
  const TRIGGER_FOCUS = 'focus';
380
380
  const TRIGGER_CLICK = 'click';
@@ -463,7 +463,7 @@
463
463
 
464
464
  dispose() {
465
465
  clearTimeout(this._timeout);
466
- EventHandler__default['default'].off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
466
+ EventHandler__default['default'].off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
467
467
 
468
468
  if (this.tip) {
469
469
  this.tip.remove();
@@ -499,8 +499,6 @@
499
499
 
500
500
  this._element.setAttribute('aria-describedby', tipId);
501
501
 
502
- this.setContent();
503
-
504
502
  if (this._config.animation) {
505
503
  tip.classList.add(CLASS_NAME_FADE);
506
504
  }
@@ -517,7 +515,7 @@
517
515
  Data__default['default'].set(tip, this.constructor.DATA_KEY, this);
518
516
 
519
517
  if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
520
- container.appendChild(tip);
518
+ container.append(tip);
521
519
  EventHandler__default['default'].trigger(this._element, this.constructor.Event.INSERTED);
522
520
  }
523
521
 
@@ -528,7 +526,8 @@
528
526
  }
529
527
 
530
528
  tip.classList.add(CLASS_NAME_SHOW);
531
- const customClass = typeof this._config.customClass === 'function' ? this._config.customClass() : this._config.customClass;
529
+
530
+ const customClass = this._resolvePossibleFunction(this._config.customClass);
532
531
 
533
532
  if (customClass) {
534
533
  tip.classList.add(...customClass.split(' '));
@@ -629,14 +628,27 @@
629
628
 
630
629
  const element = document.createElement('div');
631
630
  element.innerHTML = this._config.template;
632
- this.tip = element.children[0];
631
+ const tip = element.children[0];
632
+ this.setContent(tip);
633
+ tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
634
+ this.tip = tip;
633
635
  return this.tip;
634
636
  }
635
637
 
636
- setContent() {
637
- const tip = this.getTipElement();
638
- this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle());
639
- tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
638
+ setContent(tip) {
639
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
640
+ }
641
+
642
+ _sanitizeAndSetContent(template, content, selector) {
643
+ const templateElement = SelectorEngine__default['default'].findOne(selector, template);
644
+
645
+ if (!content && templateElement) {
646
+ templateElement.remove();
647
+ return;
648
+ } // we use append for html objects to maintain js events
649
+
650
+
651
+ this.setElementContent(templateElement, content);
640
652
  }
641
653
 
642
654
  setElementContent(element, content) {
@@ -650,7 +662,7 @@
650
662
  if (this._config.html) {
651
663
  if (content.parentNode !== element) {
652
664
  element.innerHTML = '';
653
- element.appendChild(content);
665
+ element.append(content);
654
666
  }
655
667
  } else {
656
668
  element.textContent = content.textContent;
@@ -671,13 +683,9 @@
671
683
  }
672
684
 
673
685
  getTitle() {
674
- let title = this._element.getAttribute('data-bs-original-title');
675
-
676
- if (!title) {
677
- title = typeof this._config.title === 'function' ? this._config.title.call(this._element) : this._config.title;
678
- }
686
+ const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
679
687
 
680
- return title;
688
+ return this._resolvePossibleFunction(title);
681
689
  }
682
690
 
683
691
  updateAttachment(attachment) {
@@ -694,15 +702,7 @@
694
702
 
695
703
 
696
704
  _initializeOnDelegatedTarget(event, context) {
697
- const dataKey = this.constructor.DATA_KEY;
698
- context = context || Data__default['default'].get(event.delegateTarget, dataKey);
699
-
700
- if (!context) {
701
- context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
702
- Data__default['default'].set(event.delegateTarget, dataKey, context);
703
- }
704
-
705
- return context;
705
+ return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
706
706
  }
707
707
 
708
708
  _getOffset() {
@@ -721,6 +721,10 @@
721
721
  return offset;
722
722
  }
723
723
 
724
+ _resolvePossibleFunction(content) {
725
+ return typeof content === 'function' ? content.call(this._element) : content;
726
+ }
727
+
724
728
  _getPopperConfig(attachment) {
725
729
  const defaultBsPopperConfig = {
726
730
  placement: attachment,
@@ -762,7 +766,7 @@
762
766
  }
763
767
 
764
768
  _addAttachmentClass(attachment) {
765
- this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
769
+ this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
766
770
  }
767
771
 
768
772
  _getAttachment(placement) {
@@ -789,7 +793,7 @@
789
793
  }
790
794
  };
791
795
 
792
- EventHandler__default['default'].on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
796
+ EventHandler__default['default'].on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
793
797
 
794
798
  if (this._config.selector) {
795
799
  this._config = { ...this._config,
@@ -920,26 +924,32 @@
920
924
  _getDelegateConfig() {
921
925
  const config = {};
922
926
 
923
- if (this._config) {
924
- for (const key in this._config) {
925
- if (this.constructor.Default[key] !== this._config[key]) {
926
- config[key] = this._config[key];
927
- }
927
+ for (const key in this._config) {
928
+ if (this.constructor.Default[key] !== this._config[key]) {
929
+ config[key] = this._config[key];
928
930
  }
929
- }
931
+ } // In the future can be replaced with:
932
+ // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
933
+ // `Object.fromEntries(keysWithDifferentValues)`
934
+
930
935
 
931
936
  return config;
932
937
  }
933
938
 
934
939
  _cleanTipClass() {
935
940
  const tip = this.getTipElement();
936
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
941
+ const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g');
942
+ const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);
937
943
 
938
944
  if (tabClass !== null && tabClass.length > 0) {
939
945
  tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
940
946
  }
941
947
  }
942
948
 
949
+ _getBasicClassPrefix() {
950
+ return CLASS_PREFIX;
951
+ }
952
+
943
953
  _handlePopperPlacementChange(popperData) {
944
954
  const {
945
955
  state