bootstrap 5.2.2 → 5.3.3

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +1 -0
  5. data/README.md +9 -3
  6. data/Rakefile +17 -4
  7. data/assets/javascripts/bootstrap/alert.js +22 -32
  8. data/assets/javascripts/bootstrap/base-component.js +22 -38
  9. data/assets/javascripts/bootstrap/button.js +19 -22
  10. data/assets/javascripts/bootstrap/carousel.js +52 -135
  11. data/assets/javascripts/bootstrap/collapse.js +40 -102
  12. data/assets/javascripts/bootstrap/dom/data.js +8 -12
  13. data/assets/javascripts/bootstrap/dom/event-handler.js +19 -66
  14. data/assets/javascripts/bootstrap/dom/manipulator.js +4 -17
  15. data/assets/javascripts/bootstrap/dom/selector-engine.js +42 -24
  16. data/assets/javascripts/bootstrap/dropdown.js +74 -145
  17. data/assets/javascripts/bootstrap/modal.js +53 -133
  18. data/assets/javascripts/bootstrap/offcanvas.js +50 -102
  19. data/assets/javascripts/bootstrap/popover.js +23 -29
  20. data/assets/javascripts/bootstrap/scrollspy.js +53 -90
  21. data/assets/javascripts/bootstrap/tab.js +63 -112
  22. data/assets/javascripts/bootstrap/toast.js +31 -73
  23. data/assets/javascripts/bootstrap/tooltip.js +80 -191
  24. data/assets/javascripts/bootstrap/util/backdrop.js +27 -54
  25. data/assets/javascripts/bootstrap/util/component-functions.js +13 -18
  26. data/assets/javascripts/bootstrap/util/config.js +15 -27
  27. data/assets/javascripts/bootstrap/util/focustrap.js +19 -36
  28. data/assets/javascripts/bootstrap/util/index.js +42 -112
  29. data/assets/javascripts/bootstrap/util/sanitizer.js +33 -42
  30. data/assets/javascripts/bootstrap/util/scrollbar.js +24 -50
  31. data/assets/javascripts/bootstrap/util/swipe.js +27 -48
  32. data/assets/javascripts/bootstrap/util/template-factory.js +25 -52
  33. data/assets/javascripts/bootstrap-sprockets.js +8 -8
  34. data/assets/javascripts/bootstrap.js +686 -1450
  35. data/assets/javascripts/bootstrap.min.js +3 -3
  36. data/assets/stylesheets/_bootstrap-grid.scss +1 -3
  37. data/assets/stylesheets/_bootstrap-reboot.scss +1 -0
  38. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  39. data/assets/stylesheets/_bootstrap.scss +1 -0
  40. data/assets/stylesheets/bootstrap/_accordion.scss +20 -11
  41. data/assets/stylesheets/bootstrap/_alert.scss +8 -11
  42. data/assets/stylesheets/bootstrap/_button-group.scss +2 -2
  43. data/assets/stylesheets/bootstrap/_buttons.scss +12 -3
  44. data/assets/stylesheets/bootstrap/_card.scss +5 -0
  45. data/assets/stylesheets/bootstrap/_carousel.scss +22 -15
  46. data/assets/stylesheets/bootstrap/_close.scss +32 -9
  47. data/assets/stylesheets/bootstrap/_dropdown.scss +1 -0
  48. data/assets/stylesheets/bootstrap/_functions.scss +2 -2
  49. data/assets/stylesheets/bootstrap/_grid.scss +6 -0
  50. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  51. data/assets/stylesheets/bootstrap/_list-group.scss +12 -7
  52. data/assets/stylesheets/bootstrap/_maps.scss +120 -0
  53. data/assets/stylesheets/bootstrap/_mixins.scss +1 -2
  54. data/assets/stylesheets/bootstrap/_modal.scss +0 -1
  55. data/assets/stylesheets/bootstrap/_nav.scss +42 -17
  56. data/assets/stylesheets/bootstrap/_navbar.scss +15 -4
  57. data/assets/stylesheets/bootstrap/_offcanvas.scss +5 -6
  58. data/assets/stylesheets/bootstrap/_pagination.scss +1 -1
  59. data/assets/stylesheets/bootstrap/_progress.scss +10 -1
  60. data/assets/stylesheets/bootstrap/_reboot.scss +8 -7
  61. data/assets/stylesheets/bootstrap/_root.scss +124 -10
  62. data/assets/stylesheets/bootstrap/_tables.scss +19 -12
  63. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -5
  64. data/assets/stylesheets/bootstrap/_utilities.scss +175 -16
  65. data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
  66. data/assets/stylesheets/bootstrap/_variables.scss +289 -172
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +23 -3
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +27 -13
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +24 -4
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +3 -3
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +12 -3
  72. data/assets/stylesheets/bootstrap/forms/_input-group.scss +1 -1
  73. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +1 -4
  74. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +20 -2
  75. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  76. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  77. data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
  78. data/assets/stylesheets/bootstrap/mixins/_alert.scss +4 -1
  79. data/assets/stylesheets/bootstrap/mixins/_banner.scss +2 -4
  80. data/assets/stylesheets/bootstrap/mixins/_caret.scss +30 -25
  81. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  82. data/assets/stylesheets/bootstrap/mixins/_forms.scss +20 -9
  83. data/assets/stylesheets/bootstrap/mixins/_grid.scss +2 -2
  84. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  85. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +1 -1
  86. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +5 -1
  87. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +23 -29
  88. data/bootstrap.gemspec +4 -3
  89. data/lib/bootstrap/engine.rb +17 -1
  90. data/lib/bootstrap/version.rb +2 -2
  91. data/tasks/updater/js.rb +1 -1
  92. data/tasks/updater/network.rb +2 -2
  93. data/tasks/updater/scss.rb +2 -2
  94. data/test/gemfiles/rails_4_2.gemfile +2 -1
  95. data/test/gemfiles/rails_5_0.gemfile +1 -1
  96. data/test/gemfiles/rails_5_1.gemfile +1 -1
  97. data/test/gemfiles/rails_5_2.gemfile +8 -0
  98. data/test/gemfiles/rails_6_0.gemfile +1 -0
  99. data/test/gemfiles/rails_6_1.gemfile +1 -0
  100. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  101. data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
  102. data/test/test_helper.rb +3 -2
  103. metadata +42 -18
  104. data/.travis.yml +0 -32
  105. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +0 -15
@@ -1,18 +1,15 @@
1
1
  /*!
2
- * Bootstrap tooltip.js v5.2.2 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap tooltip.js v5.3.3 (https://getbootstrap.com/)
3
+ * Copyright 2011-2024 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('./util/index'), require('./util/sanitizer'), require('./dom/event-handler'), require('./dom/manipulator'), require('./base-component'), require('./util/template-factory')) :
8
- typeof define === 'function' && define.amd ? define(['@popperjs/core', './util/index', './util/sanitizer', './dom/event-handler', './dom/manipulator', './base-component', './util/template-factory'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global["@popperjs/core"], global.Index, global.Sanitizer, global.EventHandler, global.Manipulator, global.BaseComponent, global.TemplateFactory));
10
- })(this, (function (Popper, index, sanitizer, EventHandler, Manipulator, BaseComponent, TemplateFactory) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./util/index.js'), require('./util/sanitizer.js'), require('./util/template-factory.js')) :
8
+ typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './util/index', './util/sanitizer', './util/template-factory'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global["@popperjs/core"], global.BaseComponent, global.EventHandler, global.Manipulator, global.Index, global.Sanitizer, global.TemplateFactory));
10
+ })(this, (function (Popper, BaseComponent, EventHandler, Manipulator, index_js, sanitizer_js, TemplateFactory) { 'use strict';
11
11
 
12
- const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
-
14
- function _interopNamespace(e) {
15
- if (e && e.__esModule) return e;
12
+ function _interopNamespaceDefault(e) {
16
13
  const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
17
14
  if (e) {
18
15
  for (const k in e) {
@@ -29,18 +26,16 @@
29
26
  return Object.freeze(n);
30
27
  }
31
28
 
32
- const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
33
- const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
34
- const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
35
- const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
36
- const TemplateFactory__default = /*#__PURE__*/_interopDefaultLegacy(TemplateFactory);
29
+ const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);
37
30
 
38
31
  /**
39
32
  * --------------------------------------------------------------------------
40
- * Bootstrap (v5.2.2): tooltip.js
33
+ * Bootstrap tooltip.js
41
34
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
42
35
  * --------------------------------------------------------------------------
43
36
  */
37
+
38
+
44
39
  /**
45
40
  * Constants
46
41
  */
@@ -70,12 +65,12 @@
70
65
  const AttachmentMap = {
71
66
  AUTO: 'auto',
72
67
  TOP: 'top',
73
- RIGHT: index.isRTL() ? 'left' : 'right',
68
+ RIGHT: index_js.isRTL() ? 'left' : 'right',
74
69
  BOTTOM: 'bottom',
75
- LEFT: index.isRTL() ? 'right' : 'left'
70
+ LEFT: index_js.isRTL() ? 'right' : 'left'
76
71
  };
77
72
  const Default = {
78
- allowList: sanitizer.DefaultAllowlist,
73
+ allowList: sanitizer_js.DefaultAllowlist,
79
74
  animation: true,
80
75
  boundary: 'clippingParents',
81
76
  container: false,
@@ -83,7 +78,7 @@
83
78
  delay: 0,
84
79
  fallbackPlacements: ['top', 'right', 'bottom', 'left'],
85
80
  html: false,
86
- offset: [0, 0],
81
+ offset: [0, 6],
87
82
  placement: 'top',
88
83
  popperConfig: null,
89
84
  sanitize: true,
@@ -112,183 +107,140 @@
112
107
  title: '(string|element|function)',
113
108
  trigger: 'string'
114
109
  };
110
+
115
111
  /**
116
112
  * Class definition
117
113
  */
118
114
 
119
- class Tooltip extends BaseComponent__default.default {
115
+ class Tooltip extends BaseComponent {
120
116
  constructor(element, config) {
121
117
  if (typeof Popper__namespace === 'undefined') {
122
118
  throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
123
119
  }
120
+ super(element, config);
124
121
 
125
- super(element, config); // Private
126
-
122
+ // Private
127
123
  this._isEnabled = true;
128
124
  this._timeout = 0;
129
125
  this._isHovered = null;
130
126
  this._activeTrigger = {};
131
127
  this._popper = null;
132
128
  this._templateFactory = null;
133
- this._newContent = null; // Protected
129
+ this._newContent = null;
134
130
 
131
+ // Protected
135
132
  this.tip = null;
136
-
137
133
  this._setListeners();
138
-
139
134
  if (!this._config.selector) {
140
135
  this._fixTitle();
141
136
  }
142
- } // Getters
143
-
137
+ }
144
138
 
139
+ // Getters
145
140
  static get Default() {
146
141
  return Default;
147
142
  }
148
-
149
143
  static get DefaultType() {
150
144
  return DefaultType;
151
145
  }
152
-
153
146
  static get NAME() {
154
147
  return NAME;
155
- } // Public
156
-
148
+ }
157
149
 
150
+ // Public
158
151
  enable() {
159
152
  this._isEnabled = true;
160
153
  }
161
-
162
154
  disable() {
163
155
  this._isEnabled = false;
164
156
  }
165
-
166
157
  toggleEnabled() {
167
158
  this._isEnabled = !this._isEnabled;
168
159
  }
169
-
170
160
  toggle() {
171
161
  if (!this._isEnabled) {
172
162
  return;
173
163
  }
174
-
175
164
  this._activeTrigger.click = !this._activeTrigger.click;
176
-
177
165
  if (this._isShown()) {
178
166
  this._leave();
179
-
180
167
  return;
181
168
  }
182
-
183
169
  this._enter();
184
170
  }
185
-
186
171
  dispose() {
187
172
  clearTimeout(this._timeout);
188
- EventHandler__default.default.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
189
-
190
- if (this.tip) {
191
- this.tip.remove();
192
- }
193
-
173
+ EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
194
174
  if (this._element.getAttribute('data-bs-original-title')) {
195
175
  this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
196
176
  }
197
-
198
177
  this._disposePopper();
199
-
200
178
  super.dispose();
201
179
  }
202
-
203
180
  show() {
204
181
  if (this._element.style.display === 'none') {
205
182
  throw new Error('Please use show on visible elements');
206
183
  }
207
-
208
184
  if (!(this._isWithContent() && this._isEnabled)) {
209
185
  return;
210
186
  }
211
-
212
- const showEvent = EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOW));
213
- const shadowRoot = index.findShadowRoot(this._element);
214
-
187
+ const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW));
188
+ const shadowRoot = index_js.findShadowRoot(this._element);
215
189
  const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
216
-
217
190
  if (showEvent.defaultPrevented || !isInTheDom) {
218
191
  return;
219
- } // todo v6 remove this OR make it optional
220
-
221
-
222
- if (this.tip) {
223
- this.tip.remove();
224
- this.tip = null;
225
192
  }
226
193
 
194
+ // TODO: v6 remove this or make it optional
195
+ this._disposePopper();
227
196
  const tip = this._getTipElement();
228
-
229
197
  this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
230
-
231
198
  const {
232
199
  container
233
200
  } = this._config;
234
-
235
201
  if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
236
202
  container.append(tip);
237
- EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
238
- }
239
-
240
- if (this._popper) {
241
- this._popper.update();
242
- } else {
243
- this._popper = this._createPopper(tip);
203
+ EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
244
204
  }
205
+ this._popper = this._createPopper(tip);
206
+ tip.classList.add(CLASS_NAME_SHOW);
245
207
 
246
- tip.classList.add(CLASS_NAME_SHOW); // If this is a touch-enabled device we add extra
208
+ // If this is a touch-enabled device we add extra
247
209
  // empty mouseover listeners to the body's immediate children;
248
210
  // only needed because of broken event delegation on iOS
249
211
  // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
250
-
251
212
  if ('ontouchstart' in document.documentElement) {
252
213
  for (const element of [].concat(...document.body.children)) {
253
- EventHandler__default.default.on(element, 'mouseover', index.noop);
214
+ EventHandler.on(element, 'mouseover', index_js.noop);
254
215
  }
255
216
  }
256
-
257
217
  const complete = () => {
258
- EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_SHOWN));
259
-
218
+ EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN));
260
219
  if (this._isHovered === false) {
261
220
  this._leave();
262
221
  }
263
-
264
222
  this._isHovered = false;
265
223
  };
266
-
267
224
  this._queueCallback(complete, this.tip, this._isAnimated());
268
225
  }
269
-
270
226
  hide() {
271
227
  if (!this._isShown()) {
272
228
  return;
273
229
  }
274
-
275
- const hideEvent = EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDE));
276
-
230
+ const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE));
277
231
  if (hideEvent.defaultPrevented) {
278
232
  return;
279
233
  }
280
-
281
234
  const tip = this._getTipElement();
235
+ tip.classList.remove(CLASS_NAME_SHOW);
282
236
 
283
- tip.classList.remove(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra
237
+ // If this is a touch-enabled device we remove the extra
284
238
  // empty mouseover listeners we added for iOS support
285
-
286
239
  if ('ontouchstart' in document.documentElement) {
287
240
  for (const element of [].concat(...document.body.children)) {
288
- EventHandler__default.default.off(element, 'mouseover', index.noop);
241
+ EventHandler.off(element, 'mouseover', index_js.noop);
289
242
  }
290
243
  }
291
-
292
244
  this._activeTrigger[TRIGGER_CLICK] = false;
293
245
  this._activeTrigger[TRIGGER_FOCUS] = false;
294
246
  this._activeTrigger[TRIGGER_HOVER] = false;
@@ -298,135 +250,107 @@
298
250
  if (this._isWithActiveTrigger()) {
299
251
  return;
300
252
  }
301
-
302
253
  if (!this._isHovered) {
303
- tip.remove();
254
+ this._disposePopper();
304
255
  }
305
-
306
256
  this._element.removeAttribute('aria-describedby');
307
-
308
- EventHandler__default.default.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN));
309
-
310
- this._disposePopper();
257
+ EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN));
311
258
  };
312
-
313
259
  this._queueCallback(complete, this.tip, this._isAnimated());
314
260
  }
315
-
316
261
  update() {
317
262
  if (this._popper) {
318
263
  this._popper.update();
319
264
  }
320
- } // Protected
321
-
265
+ }
322
266
 
267
+ // Protected
323
268
  _isWithContent() {
324
269
  return Boolean(this._getTitle());
325
270
  }
326
-
327
271
  _getTipElement() {
328
272
  if (!this.tip) {
329
273
  this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
330
274
  }
331
-
332
275
  return this.tip;
333
276
  }
334
-
335
277
  _createTipElement(content) {
336
- const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6
337
-
278
+ const tip = this._getTemplateFactory(content).toHtml();
338
279
 
280
+ // TODO: remove this check in v6
339
281
  if (!tip) {
340
282
  return null;
341
283
  }
342
-
343
- tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); // todo: on v6 the following can be achieved with CSS only
344
-
284
+ tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
285
+ // TODO: v6 the following can be achieved with CSS only
345
286
  tip.classList.add(`bs-${this.constructor.NAME}-auto`);
346
- const tipId = index.getUID(this.constructor.NAME).toString();
287
+ const tipId = index_js.getUID(this.constructor.NAME).toString();
347
288
  tip.setAttribute('id', tipId);
348
-
349
289
  if (this._isAnimated()) {
350
290
  tip.classList.add(CLASS_NAME_FADE);
351
291
  }
352
-
353
292
  return tip;
354
293
  }
355
-
356
294
  setContent(content) {
357
295
  this._newContent = content;
358
-
359
296
  if (this._isShown()) {
360
297
  this._disposePopper();
361
-
362
298
  this.show();
363
299
  }
364
300
  }
365
-
366
301
  _getTemplateFactory(content) {
367
302
  if (this._templateFactory) {
368
303
  this._templateFactory.changeContent(content);
369
304
  } else {
370
- this._templateFactory = new TemplateFactory__default.default({ ...this._config,
305
+ this._templateFactory = new TemplateFactory({
306
+ ...this._config,
371
307
  // the `content` var has to be after `this._config`
372
308
  // to override config.content in case of popover
373
309
  content,
374
310
  extraClass: this._resolvePossibleFunction(this._config.customClass)
375
311
  });
376
312
  }
377
-
378
313
  return this._templateFactory;
379
314
  }
380
-
381
315
  _getContentForTemplate() {
382
316
  return {
383
317
  [SELECTOR_TOOLTIP_INNER]: this._getTitle()
384
318
  };
385
319
  }
386
-
387
320
  _getTitle() {
388
321
  return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');
389
- } // Private
390
-
322
+ }
391
323
 
324
+ // Private
392
325
  _initializeOnDelegatedTarget(event) {
393
326
  return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
394
327
  }
395
-
396
328
  _isAnimated() {
397
329
  return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE);
398
330
  }
399
-
400
331
  _isShown() {
401
332
  return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW);
402
333
  }
403
-
404
334
  _createPopper(tip) {
405
- const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
335
+ const placement = index_js.execute(this._config.placement, [this, tip, this._element]);
406
336
  const attachment = AttachmentMap[placement.toUpperCase()];
407
337
  return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
408
338
  }
409
-
410
339
  _getOffset() {
411
340
  const {
412
341
  offset
413
342
  } = this._config;
414
-
415
343
  if (typeof offset === 'string') {
416
344
  return offset.split(',').map(value => Number.parseInt(value, 10));
417
345
  }
418
-
419
346
  if (typeof offset === 'function') {
420
347
  return popperData => offset(popperData, this._element);
421
348
  }
422
-
423
349
  return offset;
424
350
  }
425
-
426
351
  _resolvePossibleFunction(arg) {
427
- return typeof arg === 'function' ? arg.call(this._element) : arg;
352
+ return index_js.execute(arg, [this._element]);
428
353
  }
429
-
430
354
  _getPopperConfig(attachment) {
431
355
  const defaultBsPopperConfig = {
432
356
  placement: attachment,
@@ -461,195 +385,160 @@
461
385
  }
462
386
  }]
463
387
  };
464
- return { ...defaultBsPopperConfig,
465
- ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
388
+ return {
389
+ ...defaultBsPopperConfig,
390
+ ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig])
466
391
  };
467
392
  }
468
-
469
393
  _setListeners() {
470
394
  const triggers = this._config.trigger.split(' ');
471
-
472
395
  for (const trigger of triggers) {
473
396
  if (trigger === 'click') {
474
- EventHandler__default.default.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {
397
+ EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {
475
398
  const context = this._initializeOnDelegatedTarget(event);
476
-
477
399
  context.toggle();
478
400
  });
479
401
  } else if (trigger !== TRIGGER_MANUAL) {
480
402
  const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN);
481
403
  const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT);
482
- EventHandler__default.default.on(this._element, eventIn, this._config.selector, event => {
404
+ EventHandler.on(this._element, eventIn, this._config.selector, event => {
483
405
  const context = this._initializeOnDelegatedTarget(event);
484
-
485
406
  context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
486
-
487
407
  context._enter();
488
408
  });
489
- EventHandler__default.default.on(this._element, eventOut, this._config.selector, event => {
409
+ EventHandler.on(this._element, eventOut, this._config.selector, event => {
490
410
  const context = this._initializeOnDelegatedTarget(event);
491
-
492
411
  context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
493
-
494
412
  context._leave();
495
413
  });
496
414
  }
497
415
  }
498
-
499
416
  this._hideModalHandler = () => {
500
417
  if (this._element) {
501
418
  this.hide();
502
419
  }
503
420
  };
504
-
505
- EventHandler__default.default.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
421
+ EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
506
422
  }
507
-
508
423
  _fixTitle() {
509
424
  const title = this._element.getAttribute('title');
510
-
511
425
  if (!title) {
512
426
  return;
513
427
  }
514
-
515
428
  if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
516
429
  this._element.setAttribute('aria-label', title);
517
430
  }
518
-
519
431
  this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
520
-
521
-
522
432
  this._element.removeAttribute('title');
523
433
  }
524
-
525
434
  _enter() {
526
435
  if (this._isShown() || this._isHovered) {
527
436
  this._isHovered = true;
528
437
  return;
529
438
  }
530
-
531
439
  this._isHovered = true;
532
-
533
440
  this._setTimeout(() => {
534
441
  if (this._isHovered) {
535
442
  this.show();
536
443
  }
537
444
  }, this._config.delay.show);
538
445
  }
539
-
540
446
  _leave() {
541
447
  if (this._isWithActiveTrigger()) {
542
448
  return;
543
449
  }
544
-
545
450
  this._isHovered = false;
546
-
547
451
  this._setTimeout(() => {
548
452
  if (!this._isHovered) {
549
453
  this.hide();
550
454
  }
551
455
  }, this._config.delay.hide);
552
456
  }
553
-
554
457
  _setTimeout(handler, timeout) {
555
458
  clearTimeout(this._timeout);
556
459
  this._timeout = setTimeout(handler, timeout);
557
460
  }
558
-
559
461
  _isWithActiveTrigger() {
560
462
  return Object.values(this._activeTrigger).includes(true);
561
463
  }
562
-
563
464
  _getConfig(config) {
564
- const dataAttributes = Manipulator__default.default.getDataAttributes(this._element);
565
-
465
+ const dataAttributes = Manipulator.getDataAttributes(this._element);
566
466
  for (const dataAttribute of Object.keys(dataAttributes)) {
567
467
  if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
568
468
  delete dataAttributes[dataAttribute];
569
469
  }
570
470
  }
571
-
572
- config = { ...dataAttributes,
471
+ config = {
472
+ ...dataAttributes,
573
473
  ...(typeof config === 'object' && config ? config : {})
574
474
  };
575
475
  config = this._mergeConfigObj(config);
576
476
  config = this._configAfterMerge(config);
577
-
578
477
  this._typeCheckConfig(config);
579
-
580
478
  return config;
581
479
  }
582
-
583
480
  _configAfterMerge(config) {
584
- config.container = config.container === false ? document.body : index.getElement(config.container);
585
-
481
+ config.container = config.container === false ? document.body : index_js.getElement(config.container);
586
482
  if (typeof config.delay === 'number') {
587
483
  config.delay = {
588
484
  show: config.delay,
589
485
  hide: config.delay
590
486
  };
591
487
  }
592
-
593
488
  if (typeof config.title === 'number') {
594
489
  config.title = config.title.toString();
595
490
  }
596
-
597
491
  if (typeof config.content === 'number') {
598
492
  config.content = config.content.toString();
599
493
  }
600
-
601
494
  return config;
602
495
  }
603
-
604
496
  _getDelegateConfig() {
605
497
  const config = {};
606
-
607
- for (const key in this._config) {
608
- if (this.constructor.Default[key] !== this._config[key]) {
609
- config[key] = this._config[key];
498
+ for (const [key, value] of Object.entries(this._config)) {
499
+ if (this.constructor.Default[key] !== value) {
500
+ config[key] = value;
610
501
  }
611
502
  }
612
-
613
503
  config.selector = false;
614
- config.trigger = 'manual'; // In the future can be replaced with:
504
+ config.trigger = 'manual';
505
+
506
+ // In the future can be replaced with:
615
507
  // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
616
508
  // `Object.fromEntries(keysWithDifferentValues)`
617
-
618
509
  return config;
619
510
  }
620
-
621
511
  _disposePopper() {
622
512
  if (this._popper) {
623
513
  this._popper.destroy();
624
-
625
514
  this._popper = null;
626
515
  }
627
- } // Static
628
-
516
+ if (this.tip) {
517
+ this.tip.remove();
518
+ this.tip = null;
519
+ }
520
+ }
629
521
 
522
+ // Static
630
523
  static jQueryInterface(config) {
631
524
  return this.each(function () {
632
525
  const data = Tooltip.getOrCreateInstance(this, config);
633
-
634
526
  if (typeof config !== 'string') {
635
527
  return;
636
528
  }
637
-
638
529
  if (typeof data[config] === 'undefined') {
639
530
  throw new TypeError(`No method named "${config}"`);
640
531
  }
641
-
642
532
  data[config]();
643
533
  });
644
534
  }
645
-
646
535
  }
536
+
647
537
  /**
648
538
  * jQuery
649
539
  */
650
540
 
651
-
652
- index.defineJQueryPlugin(Tooltip);
541
+ index_js.defineJQueryPlugin(Tooltip);
653
542
 
654
543
  return Tooltip;
655
544