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,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap offcanvas.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap offcanvas.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
  */
@@ -16,6 +16,12 @@
16
16
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
17
17
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
18
 
19
+ /**
20
+ * --------------------------------------------------------------------------
21
+ * Bootstrap (v5.1.0): util/index.js
22
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
23
+ * --------------------------------------------------------------------------
24
+ */
19
25
  const MILLISECONDS_MULTIPLIER = 1000;
20
26
  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
21
27
 
@@ -102,7 +108,7 @@
102
108
  }
103
109
 
104
110
  if (typeof obj === 'string' && obj.length > 0) {
105
- return SelectorEngine__default['default'].findOne(obj);
111
+ return document.querySelector(obj);
106
112
  }
107
113
 
108
114
  return null;
@@ -143,8 +149,20 @@
143
149
 
144
150
  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
145
151
  };
152
+ /**
153
+ * Trick to restart an element's animation
154
+ *
155
+ * @param {HTMLElement} element
156
+ * @return void
157
+ *
158
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
159
+ */
160
+
146
161
 
147
- const reflow = element => element.offsetHeight;
162
+ const reflow = element => {
163
+ // eslint-disable-next-line no-unused-expressions
164
+ element.offsetHeight;
165
+ };
148
166
 
149
167
  const getjQuery = () => {
150
168
  const {
@@ -232,7 +250,7 @@
232
250
 
233
251
  /**
234
252
  * --------------------------------------------------------------------------
235
- * Bootstrap (v5.0.2): util/scrollBar.js
253
+ * Bootstrap (v5.1.0): util/scrollBar.js
236
254
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
237
255
  * --------------------------------------------------------------------------
238
256
  */
@@ -336,11 +354,12 @@
336
354
 
337
355
  /**
338
356
  * --------------------------------------------------------------------------
339
- * Bootstrap (v5.0.2): util/backdrop.js
357
+ * Bootstrap (v5.1.0): util/backdrop.js
340
358
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
341
359
  * --------------------------------------------------------------------------
342
360
  */
343
- const Default$1 = {
361
+ const Default$2 = {
362
+ className: 'modal-backdrop',
344
363
  isVisible: true,
345
364
  // if false, we use the backdrop helper without adding any element to the dom
346
365
  isAnimated: false,
@@ -348,17 +367,17 @@
348
367
  // give the choice to place backdrop under different elements
349
368
  clickCallback: null
350
369
  };
351
- const DefaultType$1 = {
370
+ const DefaultType$2 = {
371
+ className: 'string',
352
372
  isVisible: 'boolean',
353
373
  isAnimated: 'boolean',
354
374
  rootElement: '(element|string)',
355
375
  clickCallback: '(function|null)'
356
376
  };
357
- const NAME$1 = 'backdrop';
358
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
377
+ const NAME$2 = 'backdrop';
359
378
  const CLASS_NAME_FADE = 'fade';
360
379
  const CLASS_NAME_SHOW$1 = 'show';
361
- const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$1}`;
380
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$2}`;
362
381
 
363
382
  class Backdrop {
364
383
  constructor(config) {
@@ -404,7 +423,7 @@
404
423
  _getElement() {
405
424
  if (!this._element) {
406
425
  const backdrop = document.createElement('div');
407
- backdrop.className = CLASS_NAME_BACKDROP;
426
+ backdrop.className = this._config.className;
408
427
 
409
428
  if (this._config.isAnimated) {
410
429
  backdrop.classList.add(CLASS_NAME_FADE);
@@ -417,12 +436,12 @@
417
436
  }
418
437
 
419
438
  _getConfig(config) {
420
- config = { ...Default$1,
439
+ config = { ...Default$2,
421
440
  ...(typeof config === 'object' ? config : {})
422
441
  }; // use getElement() with the default "body" to get a fresh Element on each instantiation
423
442
 
424
443
  config.rootElement = getElement(config.rootElement);
425
- typeCheckConfig(NAME$1, config, DefaultType$1);
444
+ typeCheckConfig(NAME$2, config, DefaultType$2);
426
445
  return config;
427
446
  }
428
447
 
@@ -431,7 +450,7 @@
431
450
  return;
432
451
  }
433
452
 
434
- this._config.rootElement.appendChild(this._getElement());
453
+ this._config.rootElement.append(this._getElement());
435
454
 
436
455
  EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
437
456
  execute(this._config.clickCallback);
@@ -459,7 +478,136 @@
459
478
 
460
479
  /**
461
480
  * --------------------------------------------------------------------------
462
- * Bootstrap (v5.0.2): offcanvas.js
481
+ * Bootstrap (v5.1.0): util/focustrap.js
482
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
483
+ * --------------------------------------------------------------------------
484
+ */
485
+ const Default$1 = {
486
+ trapElement: null,
487
+ // The element to trap focus inside of
488
+ autofocus: true
489
+ };
490
+ const DefaultType$1 = {
491
+ trapElement: 'element',
492
+ autofocus: 'boolean'
493
+ };
494
+ const NAME$1 = 'focustrap';
495
+ const DATA_KEY$1 = 'bs.focustrap';
496
+ const EVENT_KEY$1 = `.${DATA_KEY$1}`;
497
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
498
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
499
+ const TAB_KEY = 'Tab';
500
+ const TAB_NAV_FORWARD = 'forward';
501
+ const TAB_NAV_BACKWARD = 'backward';
502
+
503
+ class FocusTrap {
504
+ constructor(config) {
505
+ this._config = this._getConfig(config);
506
+ this._isActive = false;
507
+ this._lastTabNavDirection = null;
508
+ }
509
+
510
+ activate() {
511
+ const {
512
+ trapElement,
513
+ autofocus
514
+ } = this._config;
515
+
516
+ if (this._isActive) {
517
+ return;
518
+ }
519
+
520
+ if (autofocus) {
521
+ trapElement.focus();
522
+ }
523
+
524
+ EventHandler__default['default'].off(document, EVENT_KEY$1); // guard against infinite focus loop
525
+
526
+ EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
527
+ EventHandler__default['default'].on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
528
+ this._isActive = true;
529
+ }
530
+
531
+ deactivate() {
532
+ if (!this._isActive) {
533
+ return;
534
+ }
535
+
536
+ this._isActive = false;
537
+ EventHandler__default['default'].off(document, EVENT_KEY$1);
538
+ } // Private
539
+
540
+
541
+ _handleFocusin(event) {
542
+ const {
543
+ target
544
+ } = event;
545
+ const {
546
+ trapElement
547
+ } = this._config;
548
+
549
+ if (target === document || target === trapElement || trapElement.contains(target)) {
550
+ return;
551
+ }
552
+
553
+ const elements = SelectorEngine__default['default'].focusableChildren(trapElement);
554
+
555
+ if (elements.length === 0) {
556
+ trapElement.focus();
557
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
558
+ elements[elements.length - 1].focus();
559
+ } else {
560
+ elements[0].focus();
561
+ }
562
+ }
563
+
564
+ _handleKeydown(event) {
565
+ if (event.key !== TAB_KEY) {
566
+ return;
567
+ }
568
+
569
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
570
+ }
571
+
572
+ _getConfig(config) {
573
+ config = { ...Default$1,
574
+ ...(typeof config === 'object' ? config : {})
575
+ };
576
+ typeCheckConfig(NAME$1, config, DefaultType$1);
577
+ return config;
578
+ }
579
+
580
+ }
581
+
582
+ /**
583
+ * --------------------------------------------------------------------------
584
+ * Bootstrap (v5.1.0): util/component-functions.js
585
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
586
+ * --------------------------------------------------------------------------
587
+ */
588
+
589
+ const enableDismissTrigger = (component, method = 'hide') => {
590
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
591
+ const name = component.NAME;
592
+ EventHandler__default['default'].on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
593
+ if (['A', 'AREA'].includes(this.tagName)) {
594
+ event.preventDefault();
595
+ }
596
+
597
+ if (isDisabled(this)) {
598
+ return;
599
+ }
600
+
601
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
602
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
603
+
604
+ instance[method]();
605
+ });
606
+ };
607
+
608
+ /**
609
+ * --------------------------------------------------------------------------
610
+ * Bootstrap (v5.1.0): offcanvas.js
463
611
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
464
612
  * --------------------------------------------------------------------------
465
613
  */
@@ -486,16 +634,14 @@
486
634
  scroll: 'boolean'
487
635
  };
488
636
  const CLASS_NAME_SHOW = 'show';
637
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
489
638
  const OPEN_SELECTOR = '.offcanvas.show';
490
639
  const EVENT_SHOW = `show${EVENT_KEY}`;
491
640
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
492
641
  const EVENT_HIDE = `hide${EVENT_KEY}`;
493
642
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
494
- const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
495
643
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
496
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
497
644
  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
498
- const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="offcanvas"]';
499
645
  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]';
500
646
  /**
501
647
  * ------------------------------------------------------------------------
@@ -509,6 +655,7 @@
509
655
  this._config = this._getConfig(config);
510
656
  this._isShown = false;
511
657
  this._backdrop = this._initializeBackDrop();
658
+ this._focustrap = this._initializeFocusTrap();
512
659
 
513
660
  this._addEventListeners();
514
661
  } // Getters
@@ -547,8 +694,6 @@
547
694
 
548
695
  if (!this._config.scroll) {
549
696
  new ScrollBarHelper().hide();
550
-
551
- this._enforceFocusOnElement(this._element);
552
697
  }
553
698
 
554
699
  this._element.removeAttribute('aria-hidden');
@@ -560,6 +705,10 @@
560
705
  this._element.classList.add(CLASS_NAME_SHOW);
561
706
 
562
707
  const completeCallBack = () => {
708
+ if (!this._config.scroll) {
709
+ this._focustrap.activate();
710
+ }
711
+
563
712
  EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
564
713
  relatedTarget
565
714
  });
@@ -579,7 +728,7 @@
579
728
  return;
580
729
  }
581
730
 
582
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
731
+ this._focustrap.deactivate();
583
732
 
584
733
  this._element.blur();
585
734
 
@@ -611,8 +760,9 @@
611
760
  dispose() {
612
761
  this._backdrop.dispose();
613
762
 
763
+ this._focustrap.deactivate();
764
+
614
765
  super.dispose();
615
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
616
766
  } // Private
617
767
 
618
768
 
@@ -627,6 +777,7 @@
627
777
 
628
778
  _initializeBackDrop() {
629
779
  return new Backdrop({
780
+ className: CLASS_NAME_BACKDROP,
630
781
  isVisible: this._config.backdrop,
631
782
  isAnimated: true,
632
783
  rootElement: this._element.parentNode,
@@ -634,19 +785,13 @@
634
785
  });
635
786
  }
636
787
 
637
- _enforceFocusOnElement(element) {
638
- EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
639
-
640
- EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => {
641
- if (document !== event.target && element !== event.target && !element.contains(event.target)) {
642
- element.focus();
643
- }
788
+ _initializeFocusTrap() {
789
+ return new FocusTrap({
790
+ trapElement: this._element
644
791
  });
645
- element.focus();
646
792
  }
647
793
 
648
794
  _addEventListeners() {
649
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
650
795
  EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
651
796
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
652
797
  this.hide();
@@ -707,6 +852,7 @@
707
852
  data.toggle(this);
708
853
  });
709
854
  EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => SelectorEngine__default['default'].find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
855
+ enableDismissTrigger(Offcanvas);
710
856
  /**
711
857
  * ------------------------------------------------------------------------
712
858
  * jQuery
@@ -1,19 +1,25 @@
1
1
  /*!
2
- * Bootstrap popover.js v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap popover.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('./tooltip.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './tooltip'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.SelectorEngine, global.Tooltip));
10
- }(this, (function (SelectorEngine, Tooltip) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./tooltip.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./tooltip'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.Tooltip));
10
+ }(this, (function (Tooltip) { 'use strict';
11
11
 
12
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 Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
16
15
 
16
+ /**
17
+ * --------------------------------------------------------------------------
18
+ * Bootstrap (v5.1.0): util/index.js
19
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
20
+ * --------------------------------------------------------------------------
21
+ */
22
+
17
23
  const getjQuery = () => {
18
24
  const {
19
25
  jQuery
@@ -64,7 +70,7 @@
64
70
 
65
71
  /**
66
72
  * --------------------------------------------------------------------------
67
- * Bootstrap (v5.0.2): popover.js
73
+ * Bootstrap (v5.1.0): popover.js
68
74
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
69
75
  * --------------------------------------------------------------------------
70
76
  */
@@ -78,7 +84,6 @@
78
84
  const DATA_KEY = 'bs.popover';
79
85
  const EVENT_KEY = `.${DATA_KEY}`;
80
86
  const CLASS_PREFIX = 'bs-popover';
81
- const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
82
87
  const Default = { ...Tooltip__default['default'].Default,
83
88
  placement: 'right',
84
89
  offset: [0, 8],
@@ -101,8 +106,6 @@
101
106
  MOUSEENTER: `mouseenter${EVENT_KEY}`,
102
107
  MOUSELEAVE: `mouseleave${EVENT_KEY}`
103
108
  };
104
- const CLASS_NAME_FADE = 'fade';
105
- const CLASS_NAME_SHOW = 'show';
106
109
  const SELECTOR_TITLE = '.popover-header';
107
110
  const SELECTOR_CONTENT = '.popover-body';
108
111
  /**
@@ -134,55 +137,19 @@
134
137
  return this.getTitle() || this._getContent();
135
138
  }
136
139
 
137
- getTipElement() {
138
- if (this.tip) {
139
- return this.tip;
140
- }
141
-
142
- this.tip = super.getTipElement();
143
-
144
- if (!this.getTitle()) {
145
- SelectorEngine__default['default'].findOne(SELECTOR_TITLE, this.tip).remove();
146
- }
147
-
148
- if (!this._getContent()) {
149
- SelectorEngine__default['default'].findOne(SELECTOR_CONTENT, this.tip).remove();
150
- }
140
+ setContent(tip) {
141
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
151
142
 
152
- return this.tip;
153
- }
154
-
155
- setContent() {
156
- const tip = this.getTipElement(); // we use append for html objects to maintain js events
157
-
158
- this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_TITLE, tip), this.getTitle());
159
-
160
- let content = this._getContent();
161
-
162
- if (typeof content === 'function') {
163
- content = content.call(this._element);
164
- }
165
-
166
- this.setElementContent(SelectorEngine__default['default'].findOne(SELECTOR_CONTENT, tip), content);
167
- tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
143
+ this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
168
144
  } // Private
169
145
 
170
146
 
171
- _addAttachmentClass(attachment) {
172
- this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
173
- }
174
-
175
147
  _getContent() {
176
- return this._element.getAttribute('data-bs-content') || this._config.content;
148
+ return this._resolvePossibleFunction(this._config.content);
177
149
  }
178
150
 
179
- _cleanTipClass() {
180
- const tip = this.getTipElement();
181
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
182
-
183
- if (tabClass !== null && tabClass.length > 0) {
184
- tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
185
- }
151
+ _getBasicClassPrefix() {
152
+ return CLASS_PREFIX;
186
153
  } // Static
187
154
 
188
155