bootstrap 5.1.3 → 5.2.2
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/README.md +24 -4
- data/assets/javascripts/bootstrap/alert.js +11 -146
- data/assets/javascripts/bootstrap/base-component.js +37 -120
- data/assets/javascripts/bootstrap/button.js +10 -74
- data/assets/javascripts/bootstrap/carousel.js +213 -485
- data/assets/javascripts/bootstrap/collapse.js +65 -249
- data/assets/javascripts/bootstrap/dom/data.js +3 -5
- data/assets/javascripts/bootstrap/dom/event-handler.js +94 -132
- data/assets/javascripts/bootstrap/dom/manipulator.js +23 -27
- data/assets/javascripts/bootstrap/dom/selector-engine.js +16 -58
- data/assets/javascripts/bootstrap/dropdown.js +103 -317
- data/assets/javascripts/bootstrap/modal.js +107 -749
- data/assets/javascripts/bootstrap/offcanvas.js +90 -659
- data/assets/javascripts/bootstrap/popover.js +36 -118
- data/assets/javascripts/bootstrap/scrollspy.js +183 -262
- data/assets/javascripts/bootstrap/tab.js +215 -214
- data/assets/javascripts/bootstrap/toast.js +36 -218
- data/assets/javascripts/bootstrap/tooltip.js +280 -629
- data/assets/javascripts/bootstrap/util/backdrop.js +165 -0
- data/assets/javascripts/bootstrap/util/component-functions.js +46 -0
- data/assets/javascripts/bootstrap/util/config.js +79 -0
- data/assets/javascripts/bootstrap/util/focustrap.js +129 -0
- data/assets/javascripts/bootstrap/util/index.js +350 -0
- data/assets/javascripts/bootstrap/util/sanitizer.js +122 -0
- data/assets/javascripts/bootstrap/util/scrollbar.js +138 -0
- data/assets/javascripts/bootstrap/util/swipe.js +155 -0
- data/assets/javascripts/bootstrap/util/template-factory.js +177 -0
- data/assets/javascripts/bootstrap-global-this-define.js +1 -1
- data/assets/javascripts/bootstrap-sprockets.js +17 -8
- data/assets/javascripts/bootstrap.js +2093 -1881
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/stylesheets/_bootstrap-grid.scss +3 -6
- data/assets/stylesheets/_bootstrap-reboot.scss +3 -7
- data/assets/stylesheets/_bootstrap.scss +4 -6
- data/assets/stylesheets/bootstrap/_accordion.scss +56 -25
- data/assets/stylesheets/bootstrap/_alert.scss +18 -4
- data/assets/stylesheets/bootstrap/_badge.scss +14 -5
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -10
- data/assets/stylesheets/bootstrap/_button-group.scss +4 -1
- data/assets/stylesheets/bootstrap/_buttons.scss +125 -29
- data/assets/stylesheets/bootstrap/_card.scss +55 -37
- data/assets/stylesheets/bootstrap/_close.scss +1 -1
- data/assets/stylesheets/bootstrap/_containers.scss +1 -1
- data/assets/stylesheets/bootstrap/_dropdown.scss +85 -76
- data/assets/stylesheets/bootstrap/_functions.scss +8 -8
- data/assets/stylesheets/bootstrap/_grid.scss +3 -3
- data/assets/stylesheets/bootstrap/_helpers.scss +1 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +48 -30
- data/assets/stylesheets/bootstrap/_maps.scss +54 -0
- data/assets/stylesheets/bootstrap/_modal.scss +71 -43
- data/assets/stylesheets/bootstrap/_nav.scss +53 -20
- data/assets/stylesheets/bootstrap/_navbar.scss +93 -150
- data/assets/stylesheets/bootstrap/_offcanvas.scss +120 -59
- data/assets/stylesheets/bootstrap/_pagination.scss +66 -21
- data/assets/stylesheets/bootstrap/_placeholders.scss +1 -1
- data/assets/stylesheets/bootstrap/_popover.scss +90 -52
- data/assets/stylesheets/bootstrap/_progress.scss +20 -9
- data/assets/stylesheets/bootstrap/_reboot.scss +25 -40
- data/assets/stylesheets/bootstrap/_root.scss +40 -21
- data/assets/stylesheets/bootstrap/_spinners.scss +38 -22
- data/assets/stylesheets/bootstrap/_tables.scss +32 -23
- data/assets/stylesheets/bootstrap/_toasts.scss +38 -16
- data/assets/stylesheets/bootstrap/_tooltip.scss +61 -56
- data/assets/stylesheets/bootstrap/_type.scss +2 -0
- data/assets/stylesheets/bootstrap/_utilities.scss +43 -26
- data/assets/stylesheets/bootstrap/_variables.scss +128 -135
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +3 -6
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +15 -3
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +28 -5
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +12 -37
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +0 -1
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +19 -8
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +10 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_position.scss +7 -1
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +7 -3
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +8 -8
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +32 -95
- data/assets/stylesheets/bootstrap/mixins/_container.scss +4 -2
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +18 -10
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +12 -12
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +4 -25
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +12 -9
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +13 -5
- data/bootstrap.gemspec +1 -1
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +10 -5
- data/tasks/updater.rb +2 -2
- metadata +16 -4
|
@@ -1,622 +1,31 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap modal.js v5.
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap modal.js v5.2.2 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2022 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('./
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['./
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.
|
|
10
|
-
})(this, (function (
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./util/index'), require('./dom/event-handler'), require('./dom/selector-engine'), require('./util/scrollbar'), require('./base-component'), require('./util/backdrop'), require('./util/focustrap'), require('./util/component-functions')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['./util/index', './dom/event-handler', './dom/selector-engine', './util/scrollbar', './base-component', './util/backdrop', './util/focustrap', './util/component-functions'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.Index, global.EventHandler, global.SelectorEngine, global.Scrollbar, global.BaseComponent, global.Backdrop, global.Focustrap, global.ComponentFunctions));
|
|
10
|
+
})(this, (function (index, EventHandler, SelectorEngine, ScrollBarHelper, BaseComponent, Backdrop, FocusTrap, componentFunctions) { 'use strict';
|
|
11
11
|
|
|
12
12
|
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
|
|
13
13
|
|
|
14
14
|
const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
15
|
-
const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
16
15
|
const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
16
|
+
const ScrollBarHelper__default = /*#__PURE__*/_interopDefaultLegacy(ScrollBarHelper);
|
|
17
17
|
const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
18
|
+
const Backdrop__default = /*#__PURE__*/_interopDefaultLegacy(Backdrop);
|
|
19
|
+
const FocusTrap__default = /*#__PURE__*/_interopDefaultLegacy(FocusTrap);
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* --------------------------------------------------------------------------
|
|
21
|
-
* Bootstrap (v5.
|
|
23
|
+
* Bootstrap (v5.2.2): modal.js
|
|
22
24
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
23
25
|
* --------------------------------------------------------------------------
|
|
24
26
|
*/
|
|
25
|
-
const MILLISECONDS_MULTIPLIER = 1000;
|
|
26
|
-
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
27
|
-
|
|
28
|
-
const toType = obj => {
|
|
29
|
-
if (obj === null || obj === undefined) {
|
|
30
|
-
return `${obj}`;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const getSelector = element => {
|
|
37
|
-
let selector = element.getAttribute('data-bs-target');
|
|
38
|
-
|
|
39
|
-
if (!selector || selector === '#') {
|
|
40
|
-
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
41
|
-
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
42
|
-
// `document.querySelector` will rightfully complain it is invalid.
|
|
43
|
-
// See https://github.com/twbs/bootstrap/issues/32273
|
|
44
|
-
|
|
45
|
-
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
46
|
-
return null;
|
|
47
|
-
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
51
|
-
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return selector;
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const getElementFromSelector = element => {
|
|
61
|
-
const selector = getSelector(element);
|
|
62
|
-
return selector ? document.querySelector(selector) : null;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const getTransitionDurationFromElement = element => {
|
|
66
|
-
if (!element) {
|
|
67
|
-
return 0;
|
|
68
|
-
} // Get transition-duration of the element
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
let {
|
|
72
|
-
transitionDuration,
|
|
73
|
-
transitionDelay
|
|
74
|
-
} = window.getComputedStyle(element);
|
|
75
|
-
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
|
76
|
-
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
|
|
77
|
-
|
|
78
|
-
if (!floatTransitionDuration && !floatTransitionDelay) {
|
|
79
|
-
return 0;
|
|
80
|
-
} // If multiple durations are defined, take the first
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
transitionDuration = transitionDuration.split(',')[0];
|
|
84
|
-
transitionDelay = transitionDelay.split(',')[0];
|
|
85
|
-
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const triggerTransitionEnd = element => {
|
|
89
|
-
element.dispatchEvent(new Event(TRANSITION_END));
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const isElement = obj => {
|
|
93
|
-
if (!obj || typeof obj !== 'object') {
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (typeof obj.jquery !== 'undefined') {
|
|
98
|
-
obj = obj[0];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return typeof obj.nodeType !== 'undefined';
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const getElement = obj => {
|
|
105
|
-
if (isElement(obj)) {
|
|
106
|
-
// it's a jQuery object or a node element
|
|
107
|
-
return obj.jquery ? obj[0] : obj;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (typeof obj === 'string' && obj.length > 0) {
|
|
111
|
-
return document.querySelector(obj);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return null;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
118
|
-
Object.keys(configTypes).forEach(property => {
|
|
119
|
-
const expectedTypes = configTypes[property];
|
|
120
|
-
const value = config[property];
|
|
121
|
-
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
122
|
-
|
|
123
|
-
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
124
|
-
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
const isVisible = element => {
|
|
130
|
-
if (!isElement(element) || element.getClientRects().length === 0) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
const isDisabled = element => {
|
|
138
|
-
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (element.classList.contains('disabled')) {
|
|
143
|
-
return true;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (typeof element.disabled !== 'undefined') {
|
|
147
|
-
return element.disabled;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
|
151
|
-
};
|
|
152
27
|
/**
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
const reflow = element => {
|
|
163
|
-
// eslint-disable-next-line no-unused-expressions
|
|
164
|
-
element.offsetHeight;
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const getjQuery = () => {
|
|
168
|
-
const {
|
|
169
|
-
jQuery
|
|
170
|
-
} = window;
|
|
171
|
-
|
|
172
|
-
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
173
|
-
return jQuery;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return null;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
const DOMContentLoadedCallbacks = [];
|
|
180
|
-
|
|
181
|
-
const onDOMContentLoaded = callback => {
|
|
182
|
-
if (document.readyState === 'loading') {
|
|
183
|
-
// add listener on the first call when the document is in loading state
|
|
184
|
-
if (!DOMContentLoadedCallbacks.length) {
|
|
185
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
186
|
-
DOMContentLoadedCallbacks.forEach(callback => callback());
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
DOMContentLoadedCallbacks.push(callback);
|
|
191
|
-
} else {
|
|
192
|
-
callback();
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
const isRTL = () => document.documentElement.dir === 'rtl';
|
|
197
|
-
|
|
198
|
-
const defineJQueryPlugin = plugin => {
|
|
199
|
-
onDOMContentLoaded(() => {
|
|
200
|
-
const $ = getjQuery();
|
|
201
|
-
/* istanbul ignore if */
|
|
202
|
-
|
|
203
|
-
if ($) {
|
|
204
|
-
const name = plugin.NAME;
|
|
205
|
-
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
206
|
-
$.fn[name] = plugin.jQueryInterface;
|
|
207
|
-
$.fn[name].Constructor = plugin;
|
|
208
|
-
|
|
209
|
-
$.fn[name].noConflict = () => {
|
|
210
|
-
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
211
|
-
return plugin.jQueryInterface;
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
const execute = callback => {
|
|
218
|
-
if (typeof callback === 'function') {
|
|
219
|
-
callback();
|
|
220
|
-
}
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
|
|
224
|
-
if (!waitForTransition) {
|
|
225
|
-
execute(callback);
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
const durationPadding = 5;
|
|
230
|
-
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
|
|
231
|
-
let called = false;
|
|
232
|
-
|
|
233
|
-
const handler = ({
|
|
234
|
-
target
|
|
235
|
-
}) => {
|
|
236
|
-
if (target !== transitionElement) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
called = true;
|
|
241
|
-
transitionElement.removeEventListener(TRANSITION_END, handler);
|
|
242
|
-
execute(callback);
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
transitionElement.addEventListener(TRANSITION_END, handler);
|
|
246
|
-
setTimeout(() => {
|
|
247
|
-
if (!called) {
|
|
248
|
-
triggerTransitionEnd(transitionElement);
|
|
249
|
-
}
|
|
250
|
-
}, emulatedDuration);
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
* --------------------------------------------------------------------------
|
|
255
|
-
* Bootstrap (v5.1.3): util/scrollBar.js
|
|
256
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
257
|
-
* --------------------------------------------------------------------------
|
|
258
|
-
*/
|
|
259
|
-
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
|
260
|
-
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
|
261
|
-
|
|
262
|
-
class ScrollBarHelper {
|
|
263
|
-
constructor() {
|
|
264
|
-
this._element = document.body;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
getWidth() {
|
|
268
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
|
269
|
-
const documentWidth = document.documentElement.clientWidth;
|
|
270
|
-
return Math.abs(window.innerWidth - documentWidth);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
hide() {
|
|
274
|
-
const width = this.getWidth();
|
|
275
|
-
|
|
276
|
-
this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
|
|
283
|
-
|
|
284
|
-
this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
_disableOverFlow() {
|
|
288
|
-
this._saveInitialAttribute(this._element, 'overflow');
|
|
289
|
-
|
|
290
|
-
this._element.style.overflow = 'hidden';
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
_setElementAttributes(selector, styleProp, callback) {
|
|
294
|
-
const scrollbarWidth = this.getWidth();
|
|
295
|
-
|
|
296
|
-
const manipulationCallBack = element => {
|
|
297
|
-
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
this._saveInitialAttribute(element, styleProp);
|
|
302
|
-
|
|
303
|
-
const calculatedValue = window.getComputedStyle(element)[styleProp];
|
|
304
|
-
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
|
|
305
|
-
};
|
|
306
|
-
|
|
307
|
-
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
reset() {
|
|
311
|
-
this._resetElementAttributes(this._element, 'overflow');
|
|
312
|
-
|
|
313
|
-
this._resetElementAttributes(this._element, 'paddingRight');
|
|
314
|
-
|
|
315
|
-
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
|
|
316
|
-
|
|
317
|
-
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
_saveInitialAttribute(element, styleProp) {
|
|
321
|
-
const actualValue = element.style[styleProp];
|
|
322
|
-
|
|
323
|
-
if (actualValue) {
|
|
324
|
-
Manipulator__default.default.setDataAttribute(element, styleProp, actualValue);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
_resetElementAttributes(selector, styleProp) {
|
|
329
|
-
const manipulationCallBack = element => {
|
|
330
|
-
const value = Manipulator__default.default.getDataAttribute(element, styleProp);
|
|
331
|
-
|
|
332
|
-
if (typeof value === 'undefined') {
|
|
333
|
-
element.style.removeProperty(styleProp);
|
|
334
|
-
} else {
|
|
335
|
-
Manipulator__default.default.removeDataAttribute(element, styleProp);
|
|
336
|
-
element.style[styleProp] = value;
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
_applyManipulationCallback(selector, callBack) {
|
|
344
|
-
if (isElement(selector)) {
|
|
345
|
-
callBack(selector);
|
|
346
|
-
} else {
|
|
347
|
-
SelectorEngine__default.default.find(selector, this._element).forEach(callBack);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
isOverflowing() {
|
|
352
|
-
return this.getWidth() > 0;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* --------------------------------------------------------------------------
|
|
359
|
-
* Bootstrap (v5.1.3): util/backdrop.js
|
|
360
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
361
|
-
* --------------------------------------------------------------------------
|
|
362
|
-
*/
|
|
363
|
-
const Default$2 = {
|
|
364
|
-
className: 'modal-backdrop',
|
|
365
|
-
isVisible: true,
|
|
366
|
-
// if false, we use the backdrop helper without adding any element to the dom
|
|
367
|
-
isAnimated: false,
|
|
368
|
-
rootElement: 'body',
|
|
369
|
-
// give the choice to place backdrop under different elements
|
|
370
|
-
clickCallback: null
|
|
371
|
-
};
|
|
372
|
-
const DefaultType$2 = {
|
|
373
|
-
className: 'string',
|
|
374
|
-
isVisible: 'boolean',
|
|
375
|
-
isAnimated: 'boolean',
|
|
376
|
-
rootElement: '(element|string)',
|
|
377
|
-
clickCallback: '(function|null)'
|
|
378
|
-
};
|
|
379
|
-
const NAME$2 = 'backdrop';
|
|
380
|
-
const CLASS_NAME_FADE$1 = 'fade';
|
|
381
|
-
const CLASS_NAME_SHOW$1 = 'show';
|
|
382
|
-
const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$2}`;
|
|
383
|
-
|
|
384
|
-
class Backdrop {
|
|
385
|
-
constructor(config) {
|
|
386
|
-
this._config = this._getConfig(config);
|
|
387
|
-
this._isAppended = false;
|
|
388
|
-
this._element = null;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
show(callback) {
|
|
392
|
-
if (!this._config.isVisible) {
|
|
393
|
-
execute(callback);
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
this._append();
|
|
398
|
-
|
|
399
|
-
if (this._config.isAnimated) {
|
|
400
|
-
reflow(this._getElement());
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
this._getElement().classList.add(CLASS_NAME_SHOW$1);
|
|
404
|
-
|
|
405
|
-
this._emulateAnimation(() => {
|
|
406
|
-
execute(callback);
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
hide(callback) {
|
|
411
|
-
if (!this._config.isVisible) {
|
|
412
|
-
execute(callback);
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
this._getElement().classList.remove(CLASS_NAME_SHOW$1);
|
|
417
|
-
|
|
418
|
-
this._emulateAnimation(() => {
|
|
419
|
-
this.dispose();
|
|
420
|
-
execute(callback);
|
|
421
|
-
});
|
|
422
|
-
} // Private
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
_getElement() {
|
|
426
|
-
if (!this._element) {
|
|
427
|
-
const backdrop = document.createElement('div');
|
|
428
|
-
backdrop.className = this._config.className;
|
|
429
|
-
|
|
430
|
-
if (this._config.isAnimated) {
|
|
431
|
-
backdrop.classList.add(CLASS_NAME_FADE$1);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
this._element = backdrop;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
return this._element;
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
_getConfig(config) {
|
|
441
|
-
config = { ...Default$2,
|
|
442
|
-
...(typeof config === 'object' ? config : {})
|
|
443
|
-
}; // use getElement() with the default "body" to get a fresh Element on each instantiation
|
|
444
|
-
|
|
445
|
-
config.rootElement = getElement(config.rootElement);
|
|
446
|
-
typeCheckConfig(NAME$2, config, DefaultType$2);
|
|
447
|
-
return config;
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
_append() {
|
|
451
|
-
if (this._isAppended) {
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
this._config.rootElement.append(this._getElement());
|
|
456
|
-
|
|
457
|
-
EventHandler__default.default.on(this._getElement(), EVENT_MOUSEDOWN, () => {
|
|
458
|
-
execute(this._config.clickCallback);
|
|
459
|
-
});
|
|
460
|
-
this._isAppended = true;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
dispose() {
|
|
464
|
-
if (!this._isAppended) {
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
EventHandler__default.default.off(this._element, EVENT_MOUSEDOWN);
|
|
469
|
-
|
|
470
|
-
this._element.remove();
|
|
471
|
-
|
|
472
|
-
this._isAppended = false;
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
_emulateAnimation(callback) {
|
|
476
|
-
executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
/**
|
|
482
|
-
* --------------------------------------------------------------------------
|
|
483
|
-
* Bootstrap (v5.1.3): util/focustrap.js
|
|
484
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
485
|
-
* --------------------------------------------------------------------------
|
|
486
|
-
*/
|
|
487
|
-
const Default$1 = {
|
|
488
|
-
trapElement: null,
|
|
489
|
-
// The element to trap focus inside of
|
|
490
|
-
autofocus: true
|
|
491
|
-
};
|
|
492
|
-
const DefaultType$1 = {
|
|
493
|
-
trapElement: 'element',
|
|
494
|
-
autofocus: 'boolean'
|
|
495
|
-
};
|
|
496
|
-
const NAME$1 = 'focustrap';
|
|
497
|
-
const DATA_KEY$1 = 'bs.focustrap';
|
|
498
|
-
const EVENT_KEY$1 = `.${DATA_KEY$1}`;
|
|
499
|
-
const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
|
|
500
|
-
const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
|
|
501
|
-
const TAB_KEY = 'Tab';
|
|
502
|
-
const TAB_NAV_FORWARD = 'forward';
|
|
503
|
-
const TAB_NAV_BACKWARD = 'backward';
|
|
504
|
-
|
|
505
|
-
class FocusTrap {
|
|
506
|
-
constructor(config) {
|
|
507
|
-
this._config = this._getConfig(config);
|
|
508
|
-
this._isActive = false;
|
|
509
|
-
this._lastTabNavDirection = null;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
activate() {
|
|
513
|
-
const {
|
|
514
|
-
trapElement,
|
|
515
|
-
autofocus
|
|
516
|
-
} = this._config;
|
|
517
|
-
|
|
518
|
-
if (this._isActive) {
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
if (autofocus) {
|
|
523
|
-
trapElement.focus();
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
EventHandler__default.default.off(document, EVENT_KEY$1); // guard against infinite focus loop
|
|
527
|
-
|
|
528
|
-
EventHandler__default.default.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
|
|
529
|
-
EventHandler__default.default.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
|
|
530
|
-
this._isActive = true;
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
deactivate() {
|
|
534
|
-
if (!this._isActive) {
|
|
535
|
-
return;
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
this._isActive = false;
|
|
539
|
-
EventHandler__default.default.off(document, EVENT_KEY$1);
|
|
540
|
-
} // Private
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
_handleFocusin(event) {
|
|
544
|
-
const {
|
|
545
|
-
target
|
|
546
|
-
} = event;
|
|
547
|
-
const {
|
|
548
|
-
trapElement
|
|
549
|
-
} = this._config;
|
|
550
|
-
|
|
551
|
-
if (target === document || target === trapElement || trapElement.contains(target)) {
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
const elements = SelectorEngine__default.default.focusableChildren(trapElement);
|
|
556
|
-
|
|
557
|
-
if (elements.length === 0) {
|
|
558
|
-
trapElement.focus();
|
|
559
|
-
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
|
|
560
|
-
elements[elements.length - 1].focus();
|
|
561
|
-
} else {
|
|
562
|
-
elements[0].focus();
|
|
563
|
-
}
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
_handleKeydown(event) {
|
|
567
|
-
if (event.key !== TAB_KEY) {
|
|
568
|
-
return;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
_getConfig(config) {
|
|
575
|
-
config = { ...Default$1,
|
|
576
|
-
...(typeof config === 'object' ? config : {})
|
|
577
|
-
};
|
|
578
|
-
typeCheckConfig(NAME$1, config, DefaultType$1);
|
|
579
|
-
return config;
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
/**
|
|
585
|
-
* --------------------------------------------------------------------------
|
|
586
|
-
* Bootstrap (v5.1.3): util/component-functions.js
|
|
587
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
588
|
-
* --------------------------------------------------------------------------
|
|
589
|
-
*/
|
|
590
|
-
|
|
591
|
-
const enableDismissTrigger = (component, method = 'hide') => {
|
|
592
|
-
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
|
|
593
|
-
const name = component.NAME;
|
|
594
|
-
EventHandler__default.default.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
|
|
595
|
-
if (['A', 'AREA'].includes(this.tagName)) {
|
|
596
|
-
event.preventDefault();
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
if (isDisabled(this)) {
|
|
600
|
-
return;
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
const target = getElementFromSelector(this) || this.closest(`.${name}`);
|
|
604
|
-
const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
|
|
605
|
-
|
|
606
|
-
instance[method]();
|
|
607
|
-
});
|
|
608
|
-
};
|
|
609
|
-
|
|
610
|
-
/**
|
|
611
|
-
* --------------------------------------------------------------------------
|
|
612
|
-
* Bootstrap (v5.1.3): modal.js
|
|
613
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
614
|
-
* --------------------------------------------------------------------------
|
|
615
|
-
*/
|
|
616
|
-
/**
|
|
617
|
-
* ------------------------------------------------------------------------
|
|
618
28
|
* Constants
|
|
619
|
-
* ------------------------------------------------------------------------
|
|
620
29
|
*/
|
|
621
30
|
|
|
622
31
|
const NAME = 'modal';
|
|
@@ -624,16 +33,6 @@
|
|
|
624
33
|
const EVENT_KEY = `.${DATA_KEY}`;
|
|
625
34
|
const DATA_API_KEY = '.data-api';
|
|
626
35
|
const ESCAPE_KEY = 'Escape';
|
|
627
|
-
const Default = {
|
|
628
|
-
backdrop: true,
|
|
629
|
-
keyboard: true,
|
|
630
|
-
focus: true
|
|
631
|
-
};
|
|
632
|
-
const DefaultType = {
|
|
633
|
-
backdrop: '(boolean|string)',
|
|
634
|
-
keyboard: 'boolean',
|
|
635
|
-
focus: 'boolean'
|
|
636
|
-
};
|
|
637
36
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
638
37
|
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
|
|
639
38
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
@@ -641,9 +40,8 @@
|
|
|
641
40
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
642
41
|
const EVENT_RESIZE = `resize${EVENT_KEY}`;
|
|
643
42
|
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
|
|
644
|
-
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
|
|
645
|
-
const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`;
|
|
646
43
|
const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
|
|
44
|
+
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
|
|
647
45
|
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
648
46
|
const CLASS_NAME_OPEN = 'modal-open';
|
|
649
47
|
const CLASS_NAME_FADE = 'fade';
|
|
@@ -653,23 +51,31 @@
|
|
|
653
51
|
const SELECTOR_DIALOG = '.modal-dialog';
|
|
654
52
|
const SELECTOR_MODAL_BODY = '.modal-body';
|
|
655
53
|
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
|
|
54
|
+
const Default = {
|
|
55
|
+
backdrop: true,
|
|
56
|
+
focus: true,
|
|
57
|
+
keyboard: true
|
|
58
|
+
};
|
|
59
|
+
const DefaultType = {
|
|
60
|
+
backdrop: '(boolean|string)',
|
|
61
|
+
focus: 'boolean',
|
|
62
|
+
keyboard: 'boolean'
|
|
63
|
+
};
|
|
656
64
|
/**
|
|
657
|
-
*
|
|
658
|
-
* Class Definition
|
|
659
|
-
* ------------------------------------------------------------------------
|
|
65
|
+
* Class definition
|
|
660
66
|
*/
|
|
661
67
|
|
|
662
68
|
class Modal extends BaseComponent__default.default {
|
|
663
69
|
constructor(element, config) {
|
|
664
|
-
super(element);
|
|
665
|
-
this._config = this._getConfig(config);
|
|
70
|
+
super(element, config);
|
|
666
71
|
this._dialog = SelectorEngine__default.default.findOne(SELECTOR_DIALOG, this._element);
|
|
667
72
|
this._backdrop = this._initializeBackDrop();
|
|
668
73
|
this._focustrap = this._initializeFocusTrap();
|
|
669
74
|
this._isShown = false;
|
|
670
|
-
this._ignoreBackdropClick = false;
|
|
671
75
|
this._isTransitioning = false;
|
|
672
|
-
this._scrollBar = new
|
|
76
|
+
this._scrollBar = new ScrollBarHelper__default.default();
|
|
77
|
+
|
|
78
|
+
this._addEventListeners();
|
|
673
79
|
} // Getters
|
|
674
80
|
|
|
675
81
|
|
|
@@ -677,6 +83,10 @@
|
|
|
677
83
|
return Default;
|
|
678
84
|
}
|
|
679
85
|
|
|
86
|
+
static get DefaultType() {
|
|
87
|
+
return DefaultType;
|
|
88
|
+
}
|
|
89
|
+
|
|
680
90
|
static get NAME() {
|
|
681
91
|
return NAME;
|
|
682
92
|
} // Public
|
|
@@ -700,10 +110,7 @@
|
|
|
700
110
|
}
|
|
701
111
|
|
|
702
112
|
this._isShown = true;
|
|
703
|
-
|
|
704
|
-
if (this._isAnimated()) {
|
|
705
|
-
this._isTransitioning = true;
|
|
706
|
-
}
|
|
113
|
+
this._isTransitioning = true;
|
|
707
114
|
|
|
708
115
|
this._scrollBar.hide();
|
|
709
116
|
|
|
@@ -711,19 +118,7 @@
|
|
|
711
118
|
|
|
712
119
|
this._adjustDialog();
|
|
713
120
|
|
|
714
|
-
this.
|
|
715
|
-
|
|
716
|
-
this._setResizeEvent();
|
|
717
|
-
|
|
718
|
-
EventHandler__default.default.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
|
|
719
|
-
EventHandler__default.default.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
|
|
720
|
-
if (event.target === this._element) {
|
|
721
|
-
this._ignoreBackdropClick = true;
|
|
722
|
-
}
|
|
723
|
-
});
|
|
724
|
-
});
|
|
725
|
-
|
|
726
|
-
this._showBackdrop(() => this._showElement(relatedTarget));
|
|
121
|
+
this._backdrop.show(() => this._showElement(relatedTarget));
|
|
727
122
|
}
|
|
728
123
|
|
|
729
124
|
hide() {
|
|
@@ -738,29 +133,19 @@
|
|
|
738
133
|
}
|
|
739
134
|
|
|
740
135
|
this._isShown = false;
|
|
741
|
-
|
|
742
|
-
const isAnimated = this._isAnimated();
|
|
743
|
-
|
|
744
|
-
if (isAnimated) {
|
|
745
|
-
this._isTransitioning = true;
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
this._setEscapeEvent();
|
|
749
|
-
|
|
750
|
-
this._setResizeEvent();
|
|
136
|
+
this._isTransitioning = true;
|
|
751
137
|
|
|
752
138
|
this._focustrap.deactivate();
|
|
753
139
|
|
|
754
140
|
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
755
141
|
|
|
756
|
-
|
|
757
|
-
EventHandler__default.default.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
|
|
758
|
-
|
|
759
|
-
this._queueCallback(() => this._hideModal(), this._element, isAnimated);
|
|
142
|
+
this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
|
|
760
143
|
}
|
|
761
144
|
|
|
762
145
|
dispose() {
|
|
763
|
-
[window, this._dialog]
|
|
146
|
+
for (const htmlElement of [window, this._dialog]) {
|
|
147
|
+
EventHandler__default.default.off(htmlElement, EVENT_KEY);
|
|
148
|
+
}
|
|
764
149
|
|
|
765
150
|
this._backdrop.dispose();
|
|
766
151
|
|
|
@@ -775,35 +160,22 @@
|
|
|
775
160
|
|
|
776
161
|
|
|
777
162
|
_initializeBackDrop() {
|
|
778
|
-
return new
|
|
163
|
+
return new Backdrop__default.default({
|
|
779
164
|
isVisible: Boolean(this._config.backdrop),
|
|
780
|
-
// 'static' option will be translated to true, and booleans will keep their value
|
|
165
|
+
// 'static' option will be translated to true, and booleans will keep their value,
|
|
781
166
|
isAnimated: this._isAnimated()
|
|
782
167
|
});
|
|
783
168
|
}
|
|
784
169
|
|
|
785
170
|
_initializeFocusTrap() {
|
|
786
|
-
return new
|
|
171
|
+
return new FocusTrap__default.default({
|
|
787
172
|
trapElement: this._element
|
|
788
173
|
});
|
|
789
174
|
}
|
|
790
175
|
|
|
791
|
-
_getConfig(config) {
|
|
792
|
-
config = { ...Default,
|
|
793
|
-
...Manipulator__default.default.getDataAttributes(this._element),
|
|
794
|
-
...(typeof config === 'object' ? config : {})
|
|
795
|
-
};
|
|
796
|
-
typeCheckConfig(NAME, config, DefaultType);
|
|
797
|
-
return config;
|
|
798
|
-
}
|
|
799
|
-
|
|
800
176
|
_showElement(relatedTarget) {
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
const modalBody = SelectorEngine__default.default.findOne(SELECTOR_MODAL_BODY, this._dialog);
|
|
804
|
-
|
|
805
|
-
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
|
806
|
-
// Don't move modal's DOM position
|
|
177
|
+
// try to append dynamic modal
|
|
178
|
+
if (!document.body.contains(this._element)) {
|
|
807
179
|
document.body.append(this._element);
|
|
808
180
|
}
|
|
809
181
|
|
|
@@ -816,14 +188,13 @@
|
|
|
816
188
|
this._element.setAttribute('role', 'dialog');
|
|
817
189
|
|
|
818
190
|
this._element.scrollTop = 0;
|
|
191
|
+
const modalBody = SelectorEngine__default.default.findOne(SELECTOR_MODAL_BODY, this._dialog);
|
|
819
192
|
|
|
820
193
|
if (modalBody) {
|
|
821
194
|
modalBody.scrollTop = 0;
|
|
822
195
|
}
|
|
823
196
|
|
|
824
|
-
|
|
825
|
-
reflow(this._element);
|
|
826
|
-
}
|
|
197
|
+
index.reflow(this._element);
|
|
827
198
|
|
|
828
199
|
this._element.classList.add(CLASS_NAME_SHOW);
|
|
829
200
|
|
|
@@ -838,30 +209,46 @@
|
|
|
838
209
|
});
|
|
839
210
|
};
|
|
840
211
|
|
|
841
|
-
this._queueCallback(transitionComplete, this._dialog,
|
|
212
|
+
this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
|
|
842
213
|
}
|
|
843
214
|
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
215
|
+
_addEventListeners() {
|
|
216
|
+
EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
|
217
|
+
if (event.key !== ESCAPE_KEY) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (this._config.keyboard) {
|
|
222
|
+
event.preventDefault();
|
|
223
|
+
this.hide();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
this._triggerBackdropTransition();
|
|
228
|
+
});
|
|
229
|
+
EventHandler__default.default.on(window, EVENT_RESIZE, () => {
|
|
230
|
+
if (this._isShown && !this._isTransitioning) {
|
|
231
|
+
this._adjustDialog();
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
EventHandler__default.default.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
|
|
235
|
+
// a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
|
|
236
|
+
EventHandler__default.default.one(this._element, EVENT_CLICK_DISMISS, event2 => {
|
|
237
|
+
if (this._element !== event.target || this._element !== event2.target) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (this._config.backdrop === 'static') {
|
|
851
242
|
this._triggerBackdropTransition();
|
|
243
|
+
|
|
244
|
+
return;
|
|
852
245
|
}
|
|
853
|
-
});
|
|
854
|
-
} else {
|
|
855
|
-
EventHandler__default.default.off(this._element, EVENT_KEYDOWN_DISMISS);
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
246
|
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
}
|
|
247
|
+
if (this._config.backdrop) {
|
|
248
|
+
this.hide();
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
});
|
|
865
252
|
}
|
|
866
253
|
|
|
867
254
|
_hideModal() {
|
|
@@ -886,27 +273,6 @@
|
|
|
886
273
|
});
|
|
887
274
|
}
|
|
888
275
|
|
|
889
|
-
_showBackdrop(callback) {
|
|
890
|
-
EventHandler__default.default.on(this._element, EVENT_CLICK_DISMISS, event => {
|
|
891
|
-
if (this._ignoreBackdropClick) {
|
|
892
|
-
this._ignoreBackdropClick = false;
|
|
893
|
-
return;
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
if (event.target !== event.currentTarget) {
|
|
897
|
-
return;
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
if (this._config.backdrop === true) {
|
|
901
|
-
this.hide();
|
|
902
|
-
} else if (this._config.backdrop === 'static') {
|
|
903
|
-
this._triggerBackdropTransition();
|
|
904
|
-
}
|
|
905
|
-
});
|
|
906
|
-
|
|
907
|
-
this._backdrop.show(callback);
|
|
908
|
-
}
|
|
909
|
-
|
|
910
276
|
_isAnimated() {
|
|
911
277
|
return this._element.classList.contains(CLASS_NAME_FADE);
|
|
912
278
|
}
|
|
@@ -918,37 +284,32 @@
|
|
|
918
284
|
return;
|
|
919
285
|
}
|
|
920
286
|
|
|
921
|
-
const
|
|
922
|
-
|
|
923
|
-
scrollHeight,
|
|
924
|
-
style
|
|
925
|
-
} = this._element;
|
|
926
|
-
const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
|
|
287
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
288
|
+
const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed
|
|
927
289
|
|
|
928
|
-
if (
|
|
290
|
+
if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
|
|
929
291
|
return;
|
|
930
292
|
}
|
|
931
293
|
|
|
932
294
|
if (!isModalOverflowing) {
|
|
933
|
-
style.overflowY = 'hidden';
|
|
295
|
+
this._element.style.overflowY = 'hidden';
|
|
934
296
|
}
|
|
935
297
|
|
|
936
|
-
classList.add(CLASS_NAME_STATIC);
|
|
298
|
+
this._element.classList.add(CLASS_NAME_STATIC);
|
|
937
299
|
|
|
938
300
|
this._queueCallback(() => {
|
|
939
|
-
classList.remove(CLASS_NAME_STATIC);
|
|
301
|
+
this._element.classList.remove(CLASS_NAME_STATIC);
|
|
940
302
|
|
|
941
|
-
|
|
942
|
-
this.
|
|
943
|
-
|
|
944
|
-
}, this._dialog);
|
|
945
|
-
}
|
|
303
|
+
this._queueCallback(() => {
|
|
304
|
+
this._element.style.overflowY = initialOverflowY;
|
|
305
|
+
}, this._dialog);
|
|
946
306
|
}, this._dialog);
|
|
947
307
|
|
|
948
308
|
this._element.focus();
|
|
949
|
-
}
|
|
950
|
-
|
|
951
|
-
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* The following methods are used to handle overflowing modals
|
|
312
|
+
*/
|
|
952
313
|
|
|
953
314
|
|
|
954
315
|
_adjustDialog() {
|
|
@@ -958,12 +319,14 @@
|
|
|
958
319
|
|
|
959
320
|
const isBodyOverflowing = scrollbarWidth > 0;
|
|
960
321
|
|
|
961
|
-
if (
|
|
962
|
-
|
|
322
|
+
if (isBodyOverflowing && !isModalOverflowing) {
|
|
323
|
+
const property = index.isRTL() ? 'paddingLeft' : 'paddingRight';
|
|
324
|
+
this._element.style[property] = `${scrollbarWidth}px`;
|
|
963
325
|
}
|
|
964
326
|
|
|
965
|
-
if (
|
|
966
|
-
|
|
327
|
+
if (!isBodyOverflowing && isModalOverflowing) {
|
|
328
|
+
const property = index.isRTL() ? 'paddingRight' : 'paddingLeft';
|
|
329
|
+
this._element.style[property] = `${scrollbarWidth}px`;
|
|
967
330
|
}
|
|
968
331
|
}
|
|
969
332
|
|
|
@@ -991,14 +354,12 @@
|
|
|
991
354
|
|
|
992
355
|
}
|
|
993
356
|
/**
|
|
994
|
-
*
|
|
995
|
-
* Data Api implementation
|
|
996
|
-
* ------------------------------------------------------------------------
|
|
357
|
+
* Data API implementation
|
|
997
358
|
*/
|
|
998
359
|
|
|
999
360
|
|
|
1000
361
|
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
1001
|
-
const target = getElementFromSelector(this);
|
|
362
|
+
const target = index.getElementFromSelector(this);
|
|
1002
363
|
|
|
1003
364
|
if (['A', 'AREA'].includes(this.tagName)) {
|
|
1004
365
|
event.preventDefault();
|
|
@@ -1011,30 +372,27 @@
|
|
|
1011
372
|
}
|
|
1012
373
|
|
|
1013
374
|
EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
|
|
1014
|
-
if (isVisible(this)) {
|
|
375
|
+
if (index.isVisible(this)) {
|
|
1015
376
|
this.focus();
|
|
1016
377
|
}
|
|
1017
378
|
});
|
|
1018
|
-
}); // avoid conflict when clicking
|
|
379
|
+
}); // avoid conflict when clicking modal toggler while another one is open
|
|
1019
380
|
|
|
1020
|
-
const
|
|
381
|
+
const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
|
|
1021
382
|
|
|
1022
|
-
if (
|
|
1023
|
-
Modal.getInstance(
|
|
383
|
+
if (alreadyOpen) {
|
|
384
|
+
Modal.getInstance(alreadyOpen).hide();
|
|
1024
385
|
}
|
|
1025
386
|
|
|
1026
387
|
const data = Modal.getOrCreateInstance(target);
|
|
1027
388
|
data.toggle(this);
|
|
1028
389
|
});
|
|
1029
|
-
enableDismissTrigger(Modal);
|
|
390
|
+
componentFunctions.enableDismissTrigger(Modal);
|
|
1030
391
|
/**
|
|
1031
|
-
* ------------------------------------------------------------------------
|
|
1032
392
|
* jQuery
|
|
1033
|
-
* ------------------------------------------------------------------------
|
|
1034
|
-
* add .Modal to jQuery only if jQuery is present
|
|
1035
393
|
*/
|
|
1036
394
|
|
|
1037
|
-
defineJQueryPlugin(Modal);
|
|
395
|
+
index.defineJQueryPlugin(Modal);
|
|
1038
396
|
|
|
1039
397
|
return Modal;
|
|
1040
398
|
|