bootstrap 5.2.0 → 5.3.0
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.
- 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
|
|