bootstrap 5.0.2 → 5.1.0

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