bootstrap 5.0.2 → 5.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/assets/javascripts/bootstrap/alert.js +78 -48
  4. data/assets/javascripts/bootstrap/base-component.js +22 -17
  5. data/assets/javascripts/bootstrap/button.js +19 -12
  6. data/assets/javascripts/bootstrap/carousel.js +66 -44
  7. data/assets/javascripts/bootstrap/collapse.js +114 -131
  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 +96 -106
  13. data/assets/javascripts/bootstrap/modal.js +241 -87
  14. data/assets/javascripts/bootstrap/offcanvas.js +203 -57
  15. data/assets/javascripts/bootstrap/popover.js +25 -58
  16. data/assets/javascripts/bootstrap/scrollspy.js +47 -66
  17. data/assets/javascripts/bootstrap/tab.js +41 -22
  18. data/assets/javascripts/bootstrap/toast.js +124 -29
  19. data/assets/javascripts/bootstrap/tooltip.js +122 -104
  20. data/assets/javascripts/bootstrap-sprockets.js +7 -7
  21. data/assets/javascripts/bootstrap.js +660 -630
  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/_card.scss +2 -1
  27. data/assets/stylesheets/bootstrap/_functions.scss +51 -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 +40 -2
  37. data/assets/stylesheets/bootstrap/_tables.scss +8 -4
  38. data/assets/stylesheets/bootstrap/_toasts.scss +2 -2
  39. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  40. data/assets/stylesheets/bootstrap/_utilities.scss +44 -8
  41. data/assets/stylesheets/bootstrap/_variables.scss +184 -11
  42. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  43. data/assets/stylesheets/bootstrap/forms/_form-control.scss +1 -1
  44. data/assets/stylesheets/bootstrap/forms/_form-select.scss +2 -0
  45. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  46. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  47. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  48. data/assets/stylesheets/bootstrap/mixins/_grid.scss +29 -10
  49. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +27 -6
  50. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +1 -1
  51. data/bootstrap.gemspec +3 -3
  52. data/lib/bootstrap/version.rb +2 -2
  53. data/tasks/updater/js.rb +6 -2
  54. metadata +12 -8
@@ -1,50 +1,47 @@
1
1
  /*!
2
- * Bootstrap tooltip.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap tooltip.js v5.1.3 (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
- 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
14
  function _interopNamespace(e) {
15
15
  if (e && e.__esModule) return e;
16
- var n = Object.create(null);
16
+ const n = Object.create(null);
17
17
  if (e) {
18
- Object.keys(e).forEach(function (k) {
18
+ for (const k in e) {
19
19
  if (k !== 'default') {
20
- var d = Object.getOwnPropertyDescriptor(e, k);
20
+ const d = Object.getOwnPropertyDescriptor(e, k);
21
21
  Object.defineProperty(n, k, d.get ? d : {
22
22
  enumerable: true,
23
- get: function () {
24
- return e[k];
25
- }
23
+ get: () => e[k]
26
24
  });
27
25
  }
28
- });
26
+ }
29
27
  }
30
- n['default'] = e;
28
+ n.default = e;
31
29
  return Object.freeze(n);
32
30
  }
33
31
 
34
- var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
35
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
36
- var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
37
- var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
38
- var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
39
- var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
32
+ const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
33
+ const Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
34
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
35
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
36
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
37
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
40
38
 
41
39
  /**
42
40
  * --------------------------------------------------------------------------
43
- * Bootstrap (v5.0.2): util/index.js
41
+ * Bootstrap (v5.1.3): util/index.js
44
42
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
45
43
  * --------------------------------------------------------------------------
46
44
  */
47
-
48
45
  const MAX_UID = 1000000;
49
46
 
50
47
  const toType = obj => {
@@ -88,7 +85,7 @@
88
85
  }
89
86
 
90
87
  if (typeof obj === 'string' && obj.length > 0) {
91
- return SelectorEngine__default['default'].findOne(obj);
88
+ return document.querySelector(obj);
92
89
  }
93
90
 
94
91
  return null;
@@ -183,42 +180,42 @@
183
180
 
184
181
  /**
185
182
  * --------------------------------------------------------------------------
186
- * Bootstrap (v5.0.2): util/sanitizer.js
183
+ * Bootstrap (v5.1.3): util/sanitizer.js
187
184
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
188
185
  * --------------------------------------------------------------------------
189
186
  */
190
- const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
187
+ const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
191
188
  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
192
189
  /**
193
190
  * A pattern that recognizes a commonly useful subset of URLs that are safe.
194
191
  *
195
- * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
192
+ * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
196
193
  */
197
194
 
198
- const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
195
+ const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
199
196
  /**
200
197
  * A pattern that matches safe data URLs. Only matches image, video and audio types.
201
198
  *
202
- * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
199
+ * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
203
200
  */
204
201
 
205
202
  const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
206
203
 
207
- const allowedAttribute = (attr, allowedAttributeList) => {
208
- const attrName = attr.nodeName.toLowerCase();
204
+ const allowedAttribute = (attribute, allowedAttributeList) => {
205
+ const attributeName = attribute.nodeName.toLowerCase();
209
206
 
210
- if (allowedAttributeList.includes(attrName)) {
211
- if (uriAttrs.has(attrName)) {
212
- return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
207
+ if (allowedAttributeList.includes(attributeName)) {
208
+ if (uriAttributes.has(attributeName)) {
209
+ return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
213
210
  }
214
211
 
215
212
  return true;
216
213
  }
217
214
 
218
- const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.
215
+ const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute.
219
216
 
220
217
  for (let i = 0, len = regExp.length; i < len; i++) {
221
- if (regExp[i].test(attrName)) {
218
+ if (regExp[i].test(attributeName)) {
222
219
  return true;
223
220
  }
224
221
  }
@@ -270,23 +267,22 @@
270
267
 
271
268
  const domParser = new window.DOMParser();
272
269
  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
273
- const allowlistKeys = Object.keys(allowList);
274
270
  const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
275
271
 
276
272
  for (let i = 0, len = elements.length; i < len; i++) {
277
- const el = elements[i];
278
- const elName = el.nodeName.toLowerCase();
273
+ const element = elements[i];
274
+ const elementName = element.nodeName.toLowerCase();
279
275
 
280
- if (!allowlistKeys.includes(elName)) {
281
- el.remove();
276
+ if (!Object.keys(allowList).includes(elementName)) {
277
+ element.remove();
282
278
  continue;
283
279
  }
284
280
 
285
- const attributeList = [].concat(...el.attributes);
286
- const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);
287
- attributeList.forEach(attr => {
288
- if (!allowedAttribute(attr, allowedAttributes)) {
289
- el.removeAttribute(attr.nodeName);
281
+ const attributeList = [].concat(...element.attributes);
282
+ const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
283
+ attributeList.forEach(attribute => {
284
+ if (!allowedAttribute(attribute, allowedAttributes)) {
285
+ element.removeAttribute(attribute.nodeName);
290
286
  }
291
287
  });
292
288
  }
@@ -296,7 +292,7 @@
296
292
 
297
293
  /**
298
294
  * --------------------------------------------------------------------------
299
- * Bootstrap (v5.0.2): tooltip.js
295
+ * Bootstrap (v5.1.3): tooltip.js
300
296
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
301
297
  * --------------------------------------------------------------------------
302
298
  */
@@ -310,7 +306,6 @@
310
306
  const DATA_KEY = 'bs.tooltip';
311
307
  const EVENT_KEY = `.${DATA_KEY}`;
312
308
  const CLASS_PREFIX = 'bs-tooltip';
313
- const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
314
309
  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
315
310
  const DefaultType = {
316
311
  animation: 'boolean',
@@ -375,6 +370,8 @@
375
370
  const HOVER_STATE_SHOW = 'show';
376
371
  const HOVER_STATE_OUT = 'out';
377
372
  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
373
+ const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
374
+ const EVENT_MODAL_HIDE = 'hide.bs.modal';
378
375
  const TRIGGER_HOVER = 'hover';
379
376
  const TRIGGER_FOCUS = 'focus';
380
377
  const TRIGGER_CLICK = 'click';
@@ -385,7 +382,7 @@
385
382
  * ------------------------------------------------------------------------
386
383
  */
387
384
 
388
- class Tooltip extends BaseComponent__default['default'] {
385
+ class Tooltip extends BaseComponent__default.default {
389
386
  constructor(element, config) {
390
387
  if (typeof Popper__namespace === 'undefined') {
391
388
  throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
@@ -463,15 +460,13 @@
463
460
 
464
461
  dispose() {
465
462
  clearTimeout(this._timeout);
466
- EventHandler__default['default'].off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
463
+ EventHandler__default.default.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
467
464
 
468
465
  if (this.tip) {
469
466
  this.tip.remove();
470
467
  }
471
468
 
472
- if (this._popper) {
473
- this._popper.destroy();
474
- }
469
+ this._disposePopper();
475
470
 
476
471
  super.dispose();
477
472
  }
@@ -485,12 +480,21 @@
485
480
  return;
486
481
  }
487
482
 
488
- const showEvent = EventHandler__default['default'].trigger(this._element, this.constructor.Event.SHOW);
483
+ const showEvent = EventHandler__default.default.trigger(this._element, this.constructor.Event.SHOW);
489
484
  const shadowRoot = findShadowRoot(this._element);
490
485
  const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
491
486
 
492
487
  if (showEvent.defaultPrevented || !isInTheDom) {
493
488
  return;
489
+ } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`
490
+ // This will be removed later in favor of a `setContent` method
491
+
492
+
493
+ if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {
494
+ this._disposePopper();
495
+
496
+ this.tip.remove();
497
+ this.tip = null;
494
498
  }
495
499
 
496
500
  const tip = this.getTipElement();
@@ -499,8 +503,6 @@
499
503
 
500
504
  this._element.setAttribute('aria-describedby', tipId);
501
505
 
502
- this.setContent();
503
-
504
506
  if (this._config.animation) {
505
507
  tip.classList.add(CLASS_NAME_FADE);
506
508
  }
@@ -514,11 +516,11 @@
514
516
  const {
515
517
  container
516
518
  } = this._config;
517
- Data__default['default'].set(tip, this.constructor.DATA_KEY, this);
519
+ Data__default.default.set(tip, this.constructor.DATA_KEY, this);
518
520
 
519
521
  if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
520
- container.appendChild(tip);
521
- EventHandler__default['default'].trigger(this._element, this.constructor.Event.INSERTED);
522
+ container.append(tip);
523
+ EventHandler__default.default.trigger(this._element, this.constructor.Event.INSERTED);
522
524
  }
523
525
 
524
526
  if (this._popper) {
@@ -528,7 +530,8 @@
528
530
  }
529
531
 
530
532
  tip.classList.add(CLASS_NAME_SHOW);
531
- const customClass = typeof this._config.customClass === 'function' ? this._config.customClass() : this._config.customClass;
533
+
534
+ const customClass = this._resolvePossibleFunction(this._config.customClass);
532
535
 
533
536
  if (customClass) {
534
537
  tip.classList.add(...customClass.split(' '));
@@ -540,14 +543,14 @@
540
543
 
541
544
  if ('ontouchstart' in document.documentElement) {
542
545
  [].concat(...document.body.children).forEach(element => {
543
- EventHandler__default['default'].on(element, 'mouseover', noop);
546
+ EventHandler__default.default.on(element, 'mouseover', noop);
544
547
  });
545
548
  }
546
549
 
547
550
  const complete = () => {
548
551
  const prevHoverState = this._hoverState;
549
552
  this._hoverState = null;
550
- EventHandler__default['default'].trigger(this._element, this.constructor.Event.SHOWN);
553
+ EventHandler__default.default.trigger(this._element, this.constructor.Event.SHOWN);
551
554
 
552
555
  if (prevHoverState === HOVER_STATE_OUT) {
553
556
  this._leave(null, this);
@@ -579,16 +582,12 @@
579
582
 
580
583
  this._element.removeAttribute('aria-describedby');
581
584
 
582
- EventHandler__default['default'].trigger(this._element, this.constructor.Event.HIDDEN);
583
-
584
- if (this._popper) {
585
- this._popper.destroy();
585
+ EventHandler__default.default.trigger(this._element, this.constructor.Event.HIDDEN);
586
586
 
587
- this._popper = null;
588
- }
587
+ this._disposePopper();
589
588
  };
590
589
 
591
- const hideEvent = EventHandler__default['default'].trigger(this._element, this.constructor.Event.HIDE);
590
+ const hideEvent = EventHandler__default.default.trigger(this._element, this.constructor.Event.HIDE);
592
591
 
593
592
  if (hideEvent.defaultPrevented) {
594
593
  return;
@@ -598,7 +597,7 @@
598
597
  // empty mouseover listeners we added for iOS support
599
598
 
600
599
  if ('ontouchstart' in document.documentElement) {
601
- [].concat(...document.body.children).forEach(element => EventHandler__default['default'].off(element, 'mouseover', noop));
600
+ [].concat(...document.body.children).forEach(element => EventHandler__default.default.off(element, 'mouseover', noop));
602
601
  }
603
602
 
604
603
  this._activeTrigger[TRIGGER_CLICK] = false;
@@ -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');
686
+ const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
675
687
 
676
- if (!title) {
677
- title = typeof this._config.title === 'function' ? this._config.title.call(this._element) : this._config.title;
678
- }
679
-
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) {
@@ -774,12 +778,12 @@
774
778
 
775
779
  triggers.forEach(trigger => {
776
780
  if (trigger === 'click') {
777
- EventHandler__default['default'].on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));
781
+ EventHandler__default.default.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));
778
782
  } else if (trigger !== TRIGGER_MANUAL) {
779
783
  const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
780
784
  const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
781
- EventHandler__default['default'].on(this._element, eventIn, this._config.selector, event => this._enter(event));
782
- EventHandler__default['default'].on(this._element, eventOut, this._config.selector, event => this._leave(event));
785
+ EventHandler__default.default.on(this._element, eventIn, this._config.selector, event => this._enter(event));
786
+ EventHandler__default.default.on(this._element, eventOut, this._config.selector, event => this._leave(event));
783
787
  }
784
788
  });
785
789
 
@@ -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,
@@ -881,7 +885,7 @@
881
885
  }
882
886
 
883
887
  _getConfig(config) {
884
- const dataAttributes = Manipulator__default['default'].getDataAttributes(this._element);
888
+ const dataAttributes = Manipulator__default.default.getDataAttributes(this._element);
885
889
  Object.keys(dataAttributes).forEach(dataAttr => {
886
890
  if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
887
891
  delete dataAttributes[dataAttr];
@@ -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
@@ -954,6 +964,14 @@
954
964
  this._cleanTipClass();
955
965
 
956
966
  this._addAttachmentClass(this._getAttachment(state.placement));
967
+ }
968
+
969
+ _disposePopper() {
970
+ if (this._popper) {
971
+ this._popper.destroy();
972
+
973
+ this._popper = null;
974
+ }
957
975
  } // Static
958
976
 
959
977
 
@@ -984,4 +1002,4 @@
984
1002
 
985
1003
  return Tooltip;
986
1004
 
987
- })));
1005
+ }));
@@ -2,18 +2,18 @@
2
2
  //= require ./bootstrap/dom/data
3
3
  //= require ./bootstrap/dom/event-handler
4
4
  //= require ./bootstrap/base-component
5
+ //= require ./bootstrap/alert
6
+ //= require ./bootstrap/button
5
7
  //= require ./bootstrap/dom/manipulator
6
8
  //= require ./bootstrap/dom/selector-engine
7
9
  //= require ./bootstrap/carousel
8
10
  //= require ./bootstrap/collapse
9
- //= require ./bootstrap/button
10
- //= require ./bootstrap/tab
11
- //= require ./bootstrap/toast
11
+ //= require ./bootstrap/dropdown
12
+ //= require ./bootstrap/modal
13
+ //= require ./bootstrap/offcanvas
12
14
  //= require ./bootstrap/tooltip
13
15
  //= require ./bootstrap/popover
14
- //= require ./bootstrap/alert
15
- //= require ./bootstrap/offcanvas
16
16
  //= require ./bootstrap/scrollspy
17
- //= require ./bootstrap/modal
18
- //= require ./bootstrap/dropdown
17
+ //= require ./bootstrap/tab
18
+ //= require ./bootstrap/toast
19
19
  //= require ./bootstrap-global-this-undefine