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