bootstrap 5.0.0.alpha2 → 5.0.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/.travis.yml +1 -0
- data/README.md +7 -4
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +10 -7
- data/assets/javascripts/bootstrap.js +2554 -2564
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/javascripts/bootstrap/alert.js +119 -115
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +67 -69
- data/assets/javascripts/bootstrap/carousel.js +340 -331
- data/assets/javascripts/bootstrap/collapse.js +214 -209
- data/assets/javascripts/bootstrap/dom/data.js +35 -48
- data/assets/javascripts/bootstrap/dom/event-handler.js +105 -98
- data/assets/javascripts/bootstrap/dom/manipulator.js +26 -34
- data/assets/javascripts/bootstrap/dom/selector-engine.js +28 -41
- data/assets/javascripts/bootstrap/dropdown.js +392 -325
- data/assets/javascripts/bootstrap/modal.js +492 -434
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +114 -132
- data/assets/javascripts/bootstrap/scrollspy.js +172 -180
- data/assets/javascripts/bootstrap/tab.js +168 -144
- data/assets/javascripts/bootstrap/toast.js +141 -150
- data/assets/javascripts/bootstrap/tooltip.js +466 -452
- data/assets/stylesheets/_bootstrap-grid.scss +9 -9
- data/assets/stylesheets/_bootstrap-reboot.scss +3 -3
- data/assets/stylesheets/_bootstrap.scss +5 -3
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +10 -3
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +2 -4
- data/assets/stylesheets/bootstrap/_button-group.scss +5 -7
- data/assets/stylesheets/bootstrap/_buttons.scss +2 -15
- data/assets/stylesheets/bootstrap/_card.scss +2 -29
- data/assets/stylesheets/bootstrap/_carousel.scss +35 -18
- data/assets/stylesheets/bootstrap/_close.scss +2 -3
- data/assets/stylesheets/bootstrap/_dropdown.scss +33 -29
- data/assets/stylesheets/bootstrap/_forms.scss +1 -1
- data/assets/stylesheets/bootstrap/_functions.scss +11 -12
- data/assets/stylesheets/bootstrap/_list-group.scss +23 -6
- data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
- data/assets/stylesheets/bootstrap/_modal.scss +2 -9
- data/assets/stylesheets/bootstrap/_nav.scss +12 -0
- data/assets/stylesheets/bootstrap/_navbar.scss +15 -2
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +3 -3
- data/assets/stylesheets/bootstrap/_popover.scss +10 -22
- data/assets/stylesheets/bootstrap/_progress.scss +4 -1
- data/assets/stylesheets/bootstrap/_reboot.scss +48 -44
- data/assets/stylesheets/bootstrap/_root.scss +5 -5
- data/assets/stylesheets/bootstrap/_spinners.scss +18 -5
- data/assets/stylesheets/bootstrap/_tables.scss +15 -16
- data/assets/stylesheets/bootstrap/_toasts.scss +15 -12
- data/assets/stylesheets/bootstrap/_tooltip.scss +12 -12
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -0
- data/assets/stylesheets/bootstrap/_utilities.scss +133 -70
- data/assets/stylesheets/bootstrap/_variables.scss +363 -207
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +5 -5
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +21 -11
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +112 -9
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -46
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +1 -16
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +21 -40
- data/assets/stylesheets/bootstrap/forms/_validation.scss +1 -1
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -1
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +8 -6
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +10 -5
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -6
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +2 -4
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +26 -22
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +5 -1
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +18 -13
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +3 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +5 -3
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +7 -7
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +19 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +3 -2
- data/assets/stylesheets/bootstrap/utilities/_api.scss +1 -1
- data/bootstrap.gemspec +1 -3
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +7 -1
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -3
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- metadata +20 -40
- data/assets/javascripts/bootstrap/dom/polyfill.js +0 -110
- data/assets/stylesheets/bootstrap/forms/_form-file.scss +0 -91
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
|
@@ -1,66 +1,79 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap modal.js v5.0.0
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap modal.js v5.0.0 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
4
4
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
7
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['./dom/
|
|
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('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['./dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
|
10
|
+
}(this, (function (EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
|
11
11
|
|
|
12
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
13
|
|
|
14
|
-
var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
|
|
15
14
|
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
16
15
|
var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
17
16
|
var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
17
|
+
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* --------------------------------------------------------------------------
|
|
21
|
-
* Bootstrap (v5.0.0
|
|
21
|
+
* Bootstrap (v5.0.0): util/index.js
|
|
22
22
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
23
23
|
* --------------------------------------------------------------------------
|
|
24
24
|
*/
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
const MILLISECONDS_MULTIPLIER = 1000;
|
|
26
|
+
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
const toType = obj => {
|
|
29
29
|
if (obj === null || obj === undefined) {
|
|
30
|
-
return
|
|
30
|
+
return `${obj}`;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
34
34
|
};
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
const getSelector = element => {
|
|
37
|
+
let selector = element.getAttribute('data-bs-target');
|
|
38
38
|
|
|
39
39
|
if (!selector || selector === '#') {
|
|
40
|
-
|
|
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
|
+
|
|
41
54
|
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
42
55
|
}
|
|
43
56
|
|
|
44
57
|
return selector;
|
|
45
58
|
};
|
|
46
59
|
|
|
47
|
-
|
|
48
|
-
|
|
60
|
+
const getElementFromSelector = element => {
|
|
61
|
+
const selector = getSelector(element);
|
|
49
62
|
return selector ? document.querySelector(selector) : null;
|
|
50
63
|
};
|
|
51
64
|
|
|
52
|
-
|
|
65
|
+
const getTransitionDurationFromElement = element => {
|
|
53
66
|
if (!element) {
|
|
54
67
|
return 0;
|
|
55
68
|
} // Get transition-duration of the element
|
|
56
69
|
|
|
57
70
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
64
77
|
|
|
65
78
|
if (!floatTransitionDuration && !floatTransitionDelay) {
|
|
66
79
|
return 0;
|
|
@@ -69,21 +82,19 @@
|
|
|
69
82
|
|
|
70
83
|
transitionDuration = transitionDuration.split(',')[0];
|
|
71
84
|
transitionDelay = transitionDelay.split(',')[0];
|
|
72
|
-
return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
85
|
+
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
73
86
|
};
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
const triggerTransitionEnd = element => {
|
|
76
89
|
element.dispatchEvent(new Event(TRANSITION_END));
|
|
77
90
|
};
|
|
78
91
|
|
|
79
|
-
|
|
80
|
-
return (obj[0] || obj).nodeType;
|
|
81
|
-
};
|
|
92
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
|
82
93
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
94
|
+
const emulateTransitionEnd = (element, duration) => {
|
|
95
|
+
let called = false;
|
|
96
|
+
const durationPadding = 5;
|
|
97
|
+
const emulatedDuration = duration + durationPadding;
|
|
87
98
|
|
|
88
99
|
function listener() {
|
|
89
100
|
called = true;
|
|
@@ -91,148 +102,378 @@
|
|
|
91
102
|
}
|
|
92
103
|
|
|
93
104
|
element.addEventListener(TRANSITION_END, listener);
|
|
94
|
-
setTimeout(
|
|
105
|
+
setTimeout(() => {
|
|
95
106
|
if (!called) {
|
|
96
107
|
triggerTransitionEnd(element);
|
|
97
108
|
}
|
|
98
109
|
}, emulatedDuration);
|
|
99
110
|
};
|
|
100
111
|
|
|
101
|
-
|
|
102
|
-
Object.keys(configTypes).forEach(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
112
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
113
|
+
Object.keys(configTypes).forEach(property => {
|
|
114
|
+
const expectedTypes = configTypes[property];
|
|
115
|
+
const value = config[property];
|
|
116
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
106
117
|
|
|
107
118
|
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
108
|
-
throw new
|
|
119
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
109
120
|
}
|
|
110
121
|
});
|
|
111
122
|
};
|
|
112
123
|
|
|
113
|
-
|
|
124
|
+
const isVisible = element => {
|
|
114
125
|
if (!element) {
|
|
115
126
|
return false;
|
|
116
127
|
}
|
|
117
128
|
|
|
118
129
|
if (element.style && element.parentNode && element.parentNode.style) {
|
|
119
|
-
|
|
120
|
-
|
|
130
|
+
const elementStyle = getComputedStyle(element);
|
|
131
|
+
const parentNodeStyle = getComputedStyle(element.parentNode);
|
|
121
132
|
return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
|
|
122
133
|
}
|
|
123
134
|
|
|
124
135
|
return false;
|
|
125
136
|
};
|
|
126
137
|
|
|
127
|
-
|
|
128
|
-
return element.offsetHeight;
|
|
129
|
-
};
|
|
138
|
+
const reflow = element => element.offsetHeight;
|
|
130
139
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
140
|
+
const getjQuery = () => {
|
|
141
|
+
const {
|
|
142
|
+
jQuery
|
|
143
|
+
} = window;
|
|
134
144
|
|
|
135
|
-
if (jQuery && !document.body.hasAttribute('data-no-jquery')) {
|
|
145
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
136
146
|
return jQuery;
|
|
137
147
|
}
|
|
138
148
|
|
|
139
149
|
return null;
|
|
140
150
|
};
|
|
141
151
|
|
|
142
|
-
|
|
152
|
+
const onDOMContentLoaded = callback => {
|
|
153
|
+
if (document.readyState === 'loading') {
|
|
154
|
+
document.addEventListener('DOMContentLoaded', callback);
|
|
155
|
+
} else {
|
|
156
|
+
callback();
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const isRTL = () => document.documentElement.dir === 'rtl';
|
|
161
|
+
|
|
162
|
+
const defineJQueryPlugin = (name, plugin) => {
|
|
163
|
+
onDOMContentLoaded(() => {
|
|
164
|
+
const $ = getjQuery();
|
|
165
|
+
/* istanbul ignore if */
|
|
166
|
+
|
|
167
|
+
if ($) {
|
|
168
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
169
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
170
|
+
$.fn[name].Constructor = plugin;
|
|
171
|
+
|
|
172
|
+
$.fn[name].noConflict = () => {
|
|
173
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
174
|
+
return plugin.jQueryInterface;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
const execute = callback => {
|
|
181
|
+
if (typeof callback === 'function') {
|
|
182
|
+
callback();
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* --------------------------------------------------------------------------
|
|
188
|
+
* Bootstrap (v5.0.0): util/scrollBar.js
|
|
189
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
190
|
+
* --------------------------------------------------------------------------
|
|
191
|
+
*/
|
|
192
|
+
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
|
193
|
+
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
|
194
|
+
|
|
195
|
+
const getWidth = () => {
|
|
196
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
|
197
|
+
const documentWidth = document.documentElement.clientWidth;
|
|
198
|
+
return Math.abs(window.innerWidth - documentWidth);
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const hide = (width = getWidth()) => {
|
|
202
|
+
_disableOverFlow(); // give padding to element to balances the hidden scrollbar width
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
_setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements, to keep shown fullwidth
|
|
206
|
+
|
|
143
207
|
|
|
144
|
-
|
|
208
|
+
_setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
|
|
209
|
+
|
|
210
|
+
_setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const _disableOverFlow = () => {
|
|
214
|
+
const actualValue = document.body.style.overflow;
|
|
215
|
+
|
|
216
|
+
if (actualValue) {
|
|
217
|
+
Manipulator__default['default'].setDataAttribute(document.body, 'overflow', actualValue);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
document.body.style.overflow = 'hidden';
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const _setElementAttributes = (selector, styleProp, callback) => {
|
|
224
|
+
const scrollbarWidth = getWidth();
|
|
225
|
+
SelectorEngine__default['default'].find(selector).forEach(element => {
|
|
226
|
+
if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const actualValue = element.style[styleProp];
|
|
231
|
+
const calculatedValue = window.getComputedStyle(element)[styleProp];
|
|
232
|
+
Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
|
|
233
|
+
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const reset = () => {
|
|
238
|
+
_resetElementAttributes('body', 'overflow');
|
|
239
|
+
|
|
240
|
+
_resetElementAttributes('body', 'paddingRight');
|
|
241
|
+
|
|
242
|
+
_resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
|
|
243
|
+
|
|
244
|
+
_resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const _resetElementAttributes = (selector, styleProp) => {
|
|
248
|
+
SelectorEngine__default['default'].find(selector).forEach(element => {
|
|
249
|
+
const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
|
|
250
|
+
|
|
251
|
+
if (typeof value === 'undefined') {
|
|
252
|
+
element.style.removeProperty(styleProp);
|
|
253
|
+
} else {
|
|
254
|
+
Manipulator__default['default'].removeDataAttribute(element, styleProp);
|
|
255
|
+
element.style[styleProp] = value;
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
};
|
|
145
259
|
|
|
146
|
-
|
|
260
|
+
/**
|
|
261
|
+
* --------------------------------------------------------------------------
|
|
262
|
+
* Bootstrap (v5.0.0): util/backdrop.js
|
|
263
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
264
|
+
* --------------------------------------------------------------------------
|
|
265
|
+
*/
|
|
266
|
+
const Default$1 = {
|
|
267
|
+
isVisible: true,
|
|
268
|
+
// if false, we use the backdrop helper without adding any element to the dom
|
|
269
|
+
isAnimated: false,
|
|
270
|
+
rootElement: document.body,
|
|
271
|
+
// give the choice to place backdrop under different elements
|
|
272
|
+
clickCallback: null
|
|
273
|
+
};
|
|
274
|
+
const DefaultType$1 = {
|
|
275
|
+
isVisible: 'boolean',
|
|
276
|
+
isAnimated: 'boolean',
|
|
277
|
+
rootElement: 'element',
|
|
278
|
+
clickCallback: '(function|null)'
|
|
279
|
+
};
|
|
280
|
+
const NAME$1 = 'backdrop';
|
|
281
|
+
const CLASS_NAME_BACKDROP = 'modal-backdrop';
|
|
282
|
+
const CLASS_NAME_FADE$1 = 'fade';
|
|
283
|
+
const CLASS_NAME_SHOW$1 = 'show';
|
|
284
|
+
const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$1}`;
|
|
285
|
+
|
|
286
|
+
class Backdrop {
|
|
287
|
+
constructor(config) {
|
|
288
|
+
this._config = this._getConfig(config);
|
|
289
|
+
this._isAppended = false;
|
|
290
|
+
this._element = null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
show(callback) {
|
|
294
|
+
if (!this._config.isVisible) {
|
|
295
|
+
execute(callback);
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
this._append();
|
|
300
|
+
|
|
301
|
+
if (this._config.isAnimated) {
|
|
302
|
+
reflow(this._getElement());
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
this._getElement().classList.add(CLASS_NAME_SHOW$1);
|
|
306
|
+
|
|
307
|
+
this._emulateAnimation(() => {
|
|
308
|
+
execute(callback);
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
hide(callback) {
|
|
313
|
+
if (!this._config.isVisible) {
|
|
314
|
+
execute(callback);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
this._getElement().classList.remove(CLASS_NAME_SHOW$1);
|
|
319
|
+
|
|
320
|
+
this._emulateAnimation(() => {
|
|
321
|
+
this.dispose();
|
|
322
|
+
execute(callback);
|
|
323
|
+
});
|
|
324
|
+
} // Private
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
_getElement() {
|
|
328
|
+
if (!this._element) {
|
|
329
|
+
const backdrop = document.createElement('div');
|
|
330
|
+
backdrop.className = CLASS_NAME_BACKDROP;
|
|
331
|
+
|
|
332
|
+
if (this._config.isAnimated) {
|
|
333
|
+
backdrop.classList.add(CLASS_NAME_FADE$1);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
this._element = backdrop;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return this._element;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
_getConfig(config) {
|
|
343
|
+
config = { ...Default$1,
|
|
344
|
+
...(typeof config === 'object' ? config : {})
|
|
345
|
+
};
|
|
346
|
+
typeCheckConfig(NAME$1, config, DefaultType$1);
|
|
347
|
+
return config;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
_append() {
|
|
351
|
+
if (this._isAppended) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
this._config.rootElement.appendChild(this._getElement());
|
|
356
|
+
|
|
357
|
+
EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
|
|
358
|
+
execute(this._config.clickCallback);
|
|
359
|
+
});
|
|
360
|
+
this._isAppended = true;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
dispose() {
|
|
364
|
+
if (!this._isAppended) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
|
|
369
|
+
|
|
370
|
+
this._getElement().parentNode.removeChild(this._element);
|
|
371
|
+
|
|
372
|
+
this._isAppended = false;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
_emulateAnimation(callback) {
|
|
376
|
+
if (!this._config.isAnimated) {
|
|
377
|
+
execute(callback);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const backdropTransitionDuration = getTransitionDurationFromElement(this._getElement());
|
|
382
|
+
EventHandler__default['default'].one(this._getElement(), 'transitionend', () => execute(callback));
|
|
383
|
+
emulateTransitionEnd(this._getElement(), backdropTransitionDuration);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* --------------------------------------------------------------------------
|
|
390
|
+
* Bootstrap (v5.0.0): modal.js
|
|
391
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
392
|
+
* --------------------------------------------------------------------------
|
|
393
|
+
*/
|
|
147
394
|
/**
|
|
148
395
|
* ------------------------------------------------------------------------
|
|
149
396
|
* Constants
|
|
150
397
|
* ------------------------------------------------------------------------
|
|
151
398
|
*/
|
|
152
399
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
var Default = {
|
|
400
|
+
const NAME = 'modal';
|
|
401
|
+
const DATA_KEY = 'bs.modal';
|
|
402
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
403
|
+
const DATA_API_KEY = '.data-api';
|
|
404
|
+
const ESCAPE_KEY = 'Escape';
|
|
405
|
+
const Default = {
|
|
160
406
|
backdrop: true,
|
|
161
407
|
keyboard: true,
|
|
162
|
-
focus: true
|
|
163
|
-
show: true
|
|
408
|
+
focus: true
|
|
164
409
|
};
|
|
165
|
-
|
|
410
|
+
const DefaultType = {
|
|
166
411
|
backdrop: '(boolean|string)',
|
|
167
412
|
keyboard: 'boolean',
|
|
168
|
-
focus: 'boolean'
|
|
169
|
-
show: 'boolean'
|
|
413
|
+
focus: 'boolean'
|
|
170
414
|
};
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
var SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]';
|
|
192
|
-
var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]';
|
|
193
|
-
var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
|
194
|
-
var SELECTOR_STICKY_CONTENT = '.sticky-top';
|
|
415
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
416
|
+
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
|
|
417
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
418
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
419
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
420
|
+
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
|
|
421
|
+
const EVENT_RESIZE = `resize${EVENT_KEY}`;
|
|
422
|
+
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
|
|
423
|
+
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
|
|
424
|
+
const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`;
|
|
425
|
+
const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
|
|
426
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
427
|
+
const CLASS_NAME_OPEN = 'modal-open';
|
|
428
|
+
const CLASS_NAME_FADE = 'fade';
|
|
429
|
+
const CLASS_NAME_SHOW = 'show';
|
|
430
|
+
const CLASS_NAME_STATIC = 'modal-static';
|
|
431
|
+
const SELECTOR_DIALOG = '.modal-dialog';
|
|
432
|
+
const SELECTOR_MODAL_BODY = '.modal-body';
|
|
433
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
|
|
434
|
+
const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="modal"]';
|
|
195
435
|
/**
|
|
196
436
|
* ------------------------------------------------------------------------
|
|
197
437
|
* Class Definition
|
|
198
438
|
* ------------------------------------------------------------------------
|
|
199
439
|
*/
|
|
200
440
|
|
|
201
|
-
|
|
202
|
-
|
|
441
|
+
class Modal extends BaseComponent__default['default'] {
|
|
442
|
+
constructor(element, config) {
|
|
443
|
+
super(element);
|
|
203
444
|
this._config = this._getConfig(config);
|
|
204
|
-
this.
|
|
205
|
-
this.
|
|
206
|
-
this._backdrop = null;
|
|
445
|
+
this._dialog = SelectorEngine__default['default'].findOne(SELECTOR_DIALOG, this._element);
|
|
446
|
+
this._backdrop = this._initializeBackDrop();
|
|
207
447
|
this._isShown = false;
|
|
208
|
-
this._isBodyOverflowing = false;
|
|
209
448
|
this._ignoreBackdropClick = false;
|
|
210
449
|
this._isTransitioning = false;
|
|
211
|
-
this._scrollbarWidth = 0;
|
|
212
|
-
Data__default['default'].setData(element, DATA_KEY, this);
|
|
213
450
|
} // Getters
|
|
214
451
|
|
|
215
452
|
|
|
216
|
-
|
|
453
|
+
static get Default() {
|
|
454
|
+
return Default;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
static get DATA_KEY() {
|
|
458
|
+
return DATA_KEY;
|
|
459
|
+
} // Public
|
|
217
460
|
|
|
218
|
-
// Public
|
|
219
|
-
_proto.toggle = function toggle(relatedTarget) {
|
|
220
|
-
return this._isShown ? this.hide() : this.show(relatedTarget);
|
|
221
|
-
};
|
|
222
461
|
|
|
223
|
-
|
|
224
|
-
|
|
462
|
+
toggle(relatedTarget) {
|
|
463
|
+
return this._isShown ? this.hide() : this.show(relatedTarget);
|
|
464
|
+
}
|
|
225
465
|
|
|
466
|
+
show(relatedTarget) {
|
|
226
467
|
if (this._isShown || this._isTransitioning) {
|
|
227
468
|
return;
|
|
228
469
|
}
|
|
229
470
|
|
|
230
|
-
if (this.
|
|
471
|
+
if (this._isAnimated()) {
|
|
231
472
|
this._isTransitioning = true;
|
|
232
473
|
}
|
|
233
474
|
|
|
234
|
-
|
|
235
|
-
relatedTarget
|
|
475
|
+
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
|
|
476
|
+
relatedTarget
|
|
236
477
|
});
|
|
237
478
|
|
|
238
479
|
if (this._isShown || showEvent.defaultPrevented) {
|
|
@@ -240,10 +481,8 @@
|
|
|
240
481
|
}
|
|
241
482
|
|
|
242
483
|
this._isShown = true;
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
this._setScrollbar();
|
|
484
|
+
hide();
|
|
485
|
+
document.body.classList.add(CLASS_NAME_OPEN);
|
|
247
486
|
|
|
248
487
|
this._adjustDialog();
|
|
249
488
|
|
|
@@ -251,25 +490,19 @@
|
|
|
251
490
|
|
|
252
491
|
this._setResizeEvent();
|
|
253
492
|
|
|
254
|
-
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS,
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if (event.target === _this._element) {
|
|
260
|
-
_this._ignoreBackdropClick = true;
|
|
493
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event));
|
|
494
|
+
EventHandler__default['default'].on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
|
|
495
|
+
EventHandler__default['default'].one(this._element, EVENT_MOUSEUP_DISMISS, event => {
|
|
496
|
+
if (event.target === this._element) {
|
|
497
|
+
this._ignoreBackdropClick = true;
|
|
261
498
|
}
|
|
262
499
|
});
|
|
263
500
|
});
|
|
264
501
|
|
|
265
|
-
this._showBackdrop(
|
|
266
|
-
|
|
267
|
-
});
|
|
268
|
-
};
|
|
269
|
-
|
|
270
|
-
_proto.hide = function hide(event) {
|
|
271
|
-
var _this2 = this;
|
|
502
|
+
this._showBackdrop(() => this._showElement(relatedTarget));
|
|
503
|
+
}
|
|
272
504
|
|
|
505
|
+
hide(event) {
|
|
273
506
|
if (event) {
|
|
274
507
|
event.preventDefault();
|
|
275
508
|
}
|
|
@@ -278,7 +511,7 @@
|
|
|
278
511
|
return;
|
|
279
512
|
}
|
|
280
513
|
|
|
281
|
-
|
|
514
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
|
|
282
515
|
|
|
283
516
|
if (hideEvent.defaultPrevented) {
|
|
284
517
|
return;
|
|
@@ -286,9 +519,9 @@
|
|
|
286
519
|
|
|
287
520
|
this._isShown = false;
|
|
288
521
|
|
|
289
|
-
|
|
522
|
+
const isAnimated = this._isAnimated();
|
|
290
523
|
|
|
291
|
-
if (
|
|
524
|
+
if (isAnimated) {
|
|
292
525
|
this._isTransitioning = true;
|
|
293
526
|
}
|
|
294
527
|
|
|
@@ -303,21 +536,18 @@
|
|
|
303
536
|
EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS);
|
|
304
537
|
EventHandler__default['default'].off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
|
|
305
538
|
|
|
306
|
-
if (
|
|
307
|
-
|
|
308
|
-
EventHandler__default['default'].one(this._element,
|
|
309
|
-
return _this2._hideModal(event);
|
|
310
|
-
});
|
|
539
|
+
if (isAnimated) {
|
|
540
|
+
const transitionDuration = getTransitionDurationFromElement(this._element);
|
|
541
|
+
EventHandler__default['default'].one(this._element, 'transitionend', event => this._hideModal(event));
|
|
311
542
|
emulateTransitionEnd(this._element, transitionDuration);
|
|
312
543
|
} else {
|
|
313
544
|
this._hideModal();
|
|
314
545
|
}
|
|
315
|
-
}
|
|
546
|
+
}
|
|
316
547
|
|
|
317
|
-
|
|
318
|
-
[window, this.
|
|
319
|
-
|
|
320
|
-
});
|
|
548
|
+
dispose() {
|
|
549
|
+
[window, this._dialog].forEach(htmlElement => EventHandler__default['default'].off(htmlElement, EVENT_KEY));
|
|
550
|
+
super.dispose();
|
|
321
551
|
/**
|
|
322
552
|
* `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
|
|
323
553
|
* Do not move `document` in `htmlElements` array
|
|
@@ -325,35 +555,43 @@
|
|
|
325
555
|
*/
|
|
326
556
|
|
|
327
557
|
EventHandler__default['default'].off(document, EVENT_FOCUSIN);
|
|
328
|
-
Data__default['default'].removeData(this._element, DATA_KEY);
|
|
329
558
|
this._config = null;
|
|
330
|
-
this._element = null;
|
|
331
559
|
this._dialog = null;
|
|
560
|
+
|
|
561
|
+
this._backdrop.dispose();
|
|
562
|
+
|
|
332
563
|
this._backdrop = null;
|
|
333
564
|
this._isShown = null;
|
|
334
|
-
this._isBodyOverflowing = null;
|
|
335
565
|
this._ignoreBackdropClick = null;
|
|
336
566
|
this._isTransitioning = null;
|
|
337
|
-
|
|
338
|
-
};
|
|
567
|
+
}
|
|
339
568
|
|
|
340
|
-
|
|
569
|
+
handleUpdate() {
|
|
341
570
|
this._adjustDialog();
|
|
342
571
|
} // Private
|
|
343
|
-
;
|
|
344
572
|
|
|
345
|
-
|
|
346
|
-
|
|
573
|
+
|
|
574
|
+
_initializeBackDrop() {
|
|
575
|
+
return new Backdrop({
|
|
576
|
+
isVisible: Boolean(this._config.backdrop),
|
|
577
|
+
// 'static' option will be translated to true, and booleans will keep their value
|
|
578
|
+
isAnimated: this._isAnimated()
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
_getConfig(config) {
|
|
583
|
+
config = { ...Default,
|
|
584
|
+
...Manipulator__default['default'].getDataAttributes(this._element),
|
|
585
|
+
...config
|
|
586
|
+
};
|
|
347
587
|
typeCheckConfig(NAME, config, DefaultType);
|
|
348
588
|
return config;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
_proto._showElement = function _showElement(relatedTarget) {
|
|
352
|
-
var _this3 = this;
|
|
589
|
+
}
|
|
353
590
|
|
|
354
|
-
|
|
591
|
+
_showElement(relatedTarget) {
|
|
592
|
+
const isAnimated = this._isAnimated();
|
|
355
593
|
|
|
356
|
-
|
|
594
|
+
const modalBody = SelectorEngine__default['default'].findOne(SELECTOR_MODAL_BODY, this._dialog);
|
|
357
595
|
|
|
358
596
|
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
|
|
359
597
|
// Don't move modal's DOM position
|
|
@@ -374,7 +612,7 @@
|
|
|
374
612
|
modalBody.scrollTop = 0;
|
|
375
613
|
}
|
|
376
614
|
|
|
377
|
-
if (
|
|
615
|
+
if (isAnimated) {
|
|
378
616
|
reflow(this._element);
|
|
379
617
|
}
|
|
380
618
|
|
|
@@ -384,71 +622,60 @@
|
|
|
384
622
|
this._enforceFocus();
|
|
385
623
|
}
|
|
386
624
|
|
|
387
|
-
|
|
388
|
-
if (
|
|
389
|
-
|
|
625
|
+
const transitionComplete = () => {
|
|
626
|
+
if (this._config.focus) {
|
|
627
|
+
this._element.focus();
|
|
390
628
|
}
|
|
391
629
|
|
|
392
|
-
|
|
393
|
-
EventHandler__default['default'].trigger(
|
|
394
|
-
relatedTarget
|
|
630
|
+
this._isTransitioning = false;
|
|
631
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
|
|
632
|
+
relatedTarget
|
|
395
633
|
});
|
|
396
634
|
};
|
|
397
635
|
|
|
398
|
-
if (
|
|
399
|
-
|
|
400
|
-
EventHandler__default['default'].one(this._dialog,
|
|
636
|
+
if (isAnimated) {
|
|
637
|
+
const transitionDuration = getTransitionDurationFromElement(this._dialog);
|
|
638
|
+
EventHandler__default['default'].one(this._dialog, 'transitionend', transitionComplete);
|
|
401
639
|
emulateTransitionEnd(this._dialog, transitionDuration);
|
|
402
640
|
} else {
|
|
403
641
|
transitionComplete();
|
|
404
642
|
}
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
_proto._enforceFocus = function _enforceFocus() {
|
|
408
|
-
var _this4 = this;
|
|
643
|
+
}
|
|
409
644
|
|
|
645
|
+
_enforceFocus() {
|
|
410
646
|
EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
|
|
411
647
|
|
|
412
|
-
EventHandler__default['default'].on(document, EVENT_FOCUSIN,
|
|
413
|
-
if (document !== event.target &&
|
|
414
|
-
|
|
648
|
+
EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => {
|
|
649
|
+
if (document !== event.target && this._element !== event.target && !this._element.contains(event.target)) {
|
|
650
|
+
this._element.focus();
|
|
415
651
|
}
|
|
416
652
|
});
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
_proto._setEscapeEvent = function _setEscapeEvent() {
|
|
420
|
-
var _this5 = this;
|
|
653
|
+
}
|
|
421
654
|
|
|
655
|
+
_setEscapeEvent() {
|
|
422
656
|
if (this._isShown) {
|
|
423
|
-
EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS,
|
|
424
|
-
if (
|
|
657
|
+
EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
|
658
|
+
if (this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
425
659
|
event.preventDefault();
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
_this5._triggerBackdropTransition();
|
|
660
|
+
this.hide();
|
|
661
|
+
} else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
662
|
+
this._triggerBackdropTransition();
|
|
430
663
|
}
|
|
431
664
|
});
|
|
432
665
|
} else {
|
|
433
666
|
EventHandler__default['default'].off(this._element, EVENT_KEYDOWN_DISMISS);
|
|
434
667
|
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
_proto._setResizeEvent = function _setResizeEvent() {
|
|
438
|
-
var _this6 = this;
|
|
668
|
+
}
|
|
439
669
|
|
|
670
|
+
_setResizeEvent() {
|
|
440
671
|
if (this._isShown) {
|
|
441
|
-
EventHandler__default['default'].on(window, EVENT_RESIZE,
|
|
442
|
-
return _this6._adjustDialog();
|
|
443
|
-
});
|
|
672
|
+
EventHandler__default['default'].on(window, EVENT_RESIZE, () => this._adjustDialog());
|
|
444
673
|
} else {
|
|
445
674
|
EventHandler__default['default'].off(window, EVENT_RESIZE);
|
|
446
675
|
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
_proto._hideModal = function _hideModal() {
|
|
450
|
-
var _this7 = this;
|
|
676
|
+
}
|
|
451
677
|
|
|
678
|
+
_hideModal() {
|
|
452
679
|
this._element.style.display = 'none';
|
|
453
680
|
|
|
454
681
|
this._element.setAttribute('aria-hidden', true);
|
|
@@ -459,261 +686,113 @@
|
|
|
459
686
|
|
|
460
687
|
this._isTransitioning = false;
|
|
461
688
|
|
|
462
|
-
this.
|
|
689
|
+
this._backdrop.hide(() => {
|
|
463
690
|
document.body.classList.remove(CLASS_NAME_OPEN);
|
|
464
691
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
_this7._resetScrollbar();
|
|
692
|
+
this._resetAdjustments();
|
|
468
693
|
|
|
469
|
-
|
|
694
|
+
reset();
|
|
695
|
+
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
|
|
470
696
|
});
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
_proto._removeBackdrop = function _removeBackdrop() {
|
|
474
|
-
this._backdrop.parentNode.removeChild(this._backdrop);
|
|
475
|
-
|
|
476
|
-
this._backdrop = null;
|
|
477
|
-
};
|
|
478
|
-
|
|
479
|
-
_proto._showBackdrop = function _showBackdrop(callback) {
|
|
480
|
-
var _this8 = this;
|
|
481
|
-
|
|
482
|
-
var animate = this._element.classList.contains(CLASS_NAME_FADE) ? CLASS_NAME_FADE : '';
|
|
483
|
-
|
|
484
|
-
if (this._isShown && this._config.backdrop) {
|
|
485
|
-
this._backdrop = document.createElement('div');
|
|
486
|
-
this._backdrop.className = CLASS_NAME_BACKDROP;
|
|
487
|
-
|
|
488
|
-
if (animate) {
|
|
489
|
-
this._backdrop.classList.add(animate);
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
document.body.appendChild(this._backdrop);
|
|
493
|
-
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, function (event) {
|
|
494
|
-
if (_this8._ignoreBackdropClick) {
|
|
495
|
-
_this8._ignoreBackdropClick = false;
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
if (event.target !== event.currentTarget) {
|
|
500
|
-
return;
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
_this8._triggerBackdropTransition();
|
|
504
|
-
});
|
|
697
|
+
}
|
|
505
698
|
|
|
506
|
-
|
|
507
|
-
|
|
699
|
+
_showBackdrop(callback) {
|
|
700
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, event => {
|
|
701
|
+
if (this._ignoreBackdropClick) {
|
|
702
|
+
this._ignoreBackdropClick = false;
|
|
703
|
+
return;
|
|
508
704
|
}
|
|
509
705
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
if (!animate) {
|
|
513
|
-
callback();
|
|
706
|
+
if (event.target !== event.currentTarget) {
|
|
514
707
|
return;
|
|
515
708
|
}
|
|
516
709
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
710
|
+
if (this._config.backdrop === true) {
|
|
711
|
+
this.hide();
|
|
712
|
+
} else if (this._config.backdrop === 'static') {
|
|
713
|
+
this._triggerBackdropTransition();
|
|
714
|
+
}
|
|
715
|
+
});
|
|
522
716
|
|
|
523
|
-
|
|
524
|
-
|
|
717
|
+
this._backdrop.show(callback);
|
|
718
|
+
}
|
|
525
719
|
|
|
526
|
-
|
|
527
|
-
|
|
720
|
+
_isAnimated() {
|
|
721
|
+
return this._element.classList.contains(CLASS_NAME_FADE);
|
|
722
|
+
}
|
|
528
723
|
|
|
529
|
-
|
|
530
|
-
|
|
724
|
+
_triggerBackdropTransition() {
|
|
725
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE_PREVENTED);
|
|
531
726
|
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
} else {
|
|
535
|
-
callbackRemove();
|
|
536
|
-
}
|
|
537
|
-
} else {
|
|
538
|
-
callback();
|
|
727
|
+
if (hideEvent.defaultPrevented) {
|
|
728
|
+
return;
|
|
539
729
|
}
|
|
540
|
-
};
|
|
541
730
|
|
|
542
|
-
|
|
543
|
-
var _this9 = this;
|
|
731
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
544
732
|
|
|
545
|
-
if (
|
|
546
|
-
|
|
733
|
+
if (!isModalOverflowing) {
|
|
734
|
+
this._element.style.overflowY = 'hidden';
|
|
735
|
+
}
|
|
547
736
|
|
|
548
|
-
|
|
549
|
-
return;
|
|
550
|
-
}
|
|
737
|
+
this._element.classList.add(CLASS_NAME_STATIC);
|
|
551
738
|
|
|
552
|
-
|
|
739
|
+
const modalTransitionDuration = getTransitionDurationFromElement(this._dialog);
|
|
740
|
+
EventHandler__default['default'].off(this._element, 'transitionend');
|
|
741
|
+
EventHandler__default['default'].one(this._element, 'transitionend', () => {
|
|
742
|
+
this._element.classList.remove(CLASS_NAME_STATIC);
|
|
553
743
|
|
|
554
744
|
if (!isModalOverflowing) {
|
|
555
|
-
this._element
|
|
745
|
+
EventHandler__default['default'].one(this._element, 'transitionend', () => {
|
|
746
|
+
this._element.style.overflowY = '';
|
|
747
|
+
});
|
|
748
|
+
emulateTransitionEnd(this._element, modalTransitionDuration);
|
|
556
749
|
}
|
|
750
|
+
});
|
|
751
|
+
emulateTransitionEnd(this._element, modalTransitionDuration);
|
|
557
752
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
var modalTransitionDuration = getTransitionDurationFromElement(this._dialog);
|
|
561
|
-
EventHandler__default['default'].off(this._element, TRANSITION_END);
|
|
562
|
-
EventHandler__default['default'].one(this._element, TRANSITION_END, function () {
|
|
563
|
-
_this9._element.classList.remove(CLASS_NAME_STATIC);
|
|
564
|
-
|
|
565
|
-
if (!isModalOverflowing) {
|
|
566
|
-
EventHandler__default['default'].one(_this9._element, TRANSITION_END, function () {
|
|
567
|
-
_this9._element.style.overflowY = '';
|
|
568
|
-
});
|
|
569
|
-
emulateTransitionEnd(_this9._element, modalTransitionDuration);
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
emulateTransitionEnd(this._element, modalTransitionDuration);
|
|
573
|
-
|
|
574
|
-
this._element.focus();
|
|
575
|
-
} else {
|
|
576
|
-
this.hide();
|
|
577
|
-
}
|
|
753
|
+
this._element.focus();
|
|
578
754
|
} // ----------------------------------------------------------------------
|
|
579
755
|
// the following methods are used to handle overflowing modals
|
|
580
756
|
// ----------------------------------------------------------------------
|
|
581
|
-
;
|
|
582
757
|
|
|
583
|
-
_proto._adjustDialog = function _adjustDialog() {
|
|
584
|
-
var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
585
758
|
|
|
586
|
-
|
|
587
|
-
|
|
759
|
+
_adjustDialog() {
|
|
760
|
+
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
|
|
761
|
+
const scrollbarWidth = getWidth();
|
|
762
|
+
const isBodyOverflowing = scrollbarWidth > 0;
|
|
763
|
+
|
|
764
|
+
if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
|
|
765
|
+
this._element.style.paddingLeft = `${scrollbarWidth}px`;
|
|
588
766
|
}
|
|
589
767
|
|
|
590
|
-
if (
|
|
591
|
-
this._element.style.paddingRight =
|
|
768
|
+
if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
|
|
769
|
+
this._element.style.paddingRight = `${scrollbarWidth}px`;
|
|
592
770
|
}
|
|
593
|
-
}
|
|
771
|
+
}
|
|
594
772
|
|
|
595
|
-
|
|
773
|
+
_resetAdjustments() {
|
|
596
774
|
this._element.style.paddingLeft = '';
|
|
597
775
|
this._element.style.paddingRight = '';
|
|
598
|
-
};
|
|
599
|
-
|
|
600
|
-
_proto._checkScrollbar = function _checkScrollbar() {
|
|
601
|
-
var rect = document.body.getBoundingClientRect();
|
|
602
|
-
this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;
|
|
603
|
-
this._scrollbarWidth = this._getScrollbarWidth();
|
|
604
|
-
};
|
|
605
|
-
|
|
606
|
-
_proto._setScrollbar = function _setScrollbar() {
|
|
607
|
-
var _this10 = this;
|
|
608
|
-
|
|
609
|
-
if (this._isBodyOverflowing) {
|
|
610
|
-
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
|
|
611
|
-
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
|
|
612
|
-
// Adjust fixed content padding
|
|
613
|
-
SelectorEngine__default['default'].find(SELECTOR_FIXED_CONTENT).forEach(function (element) {
|
|
614
|
-
var actualPadding = element.style.paddingRight;
|
|
615
|
-
var calculatedPadding = window.getComputedStyle(element)['padding-right'];
|
|
616
|
-
Manipulator__default['default'].setDataAttribute(element, 'padding-right', actualPadding);
|
|
617
|
-
element.style.paddingRight = parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px";
|
|
618
|
-
}); // Adjust sticky content margin
|
|
619
|
-
|
|
620
|
-
SelectorEngine__default['default'].find(SELECTOR_STICKY_CONTENT).forEach(function (element) {
|
|
621
|
-
var actualMargin = element.style.marginRight;
|
|
622
|
-
var calculatedMargin = window.getComputedStyle(element)['margin-right'];
|
|
623
|
-
Manipulator__default['default'].setDataAttribute(element, 'margin-right', actualMargin);
|
|
624
|
-
element.style.marginRight = parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px";
|
|
625
|
-
}); // Adjust body padding
|
|
626
|
-
|
|
627
|
-
var actualPadding = document.body.style.paddingRight;
|
|
628
|
-
var calculatedPadding = window.getComputedStyle(document.body)['padding-right'];
|
|
629
|
-
Manipulator__default['default'].setDataAttribute(document.body, 'padding-right', actualPadding);
|
|
630
|
-
document.body.style.paddingRight = parseFloat(calculatedPadding) + this._scrollbarWidth + "px";
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
document.body.classList.add(CLASS_NAME_OPEN);
|
|
634
|
-
};
|
|
635
|
-
|
|
636
|
-
_proto._resetScrollbar = function _resetScrollbar() {
|
|
637
|
-
// Restore fixed content padding
|
|
638
|
-
SelectorEngine__default['default'].find(SELECTOR_FIXED_CONTENT).forEach(function (element) {
|
|
639
|
-
var padding = Manipulator__default['default'].getDataAttribute(element, 'padding-right');
|
|
640
|
-
|
|
641
|
-
if (typeof padding !== 'undefined') {
|
|
642
|
-
Manipulator__default['default'].removeDataAttribute(element, 'padding-right');
|
|
643
|
-
element.style.paddingRight = padding;
|
|
644
|
-
}
|
|
645
|
-
}); // Restore sticky content and navbar-toggler margin
|
|
646
|
-
|
|
647
|
-
SelectorEngine__default['default'].find("" + SELECTOR_STICKY_CONTENT).forEach(function (element) {
|
|
648
|
-
var margin = Manipulator__default['default'].getDataAttribute(element, 'margin-right');
|
|
649
|
-
|
|
650
|
-
if (typeof margin !== 'undefined') {
|
|
651
|
-
Manipulator__default['default'].removeDataAttribute(element, 'margin-right');
|
|
652
|
-
element.style.marginRight = margin;
|
|
653
|
-
}
|
|
654
|
-
}); // Restore body padding
|
|
655
|
-
|
|
656
|
-
var padding = Manipulator__default['default'].getDataAttribute(document.body, 'padding-right');
|
|
657
|
-
|
|
658
|
-
if (typeof padding === 'undefined') {
|
|
659
|
-
document.body.style.paddingRight = '';
|
|
660
|
-
} else {
|
|
661
|
-
Manipulator__default['default'].removeDataAttribute(document.body, 'padding-right');
|
|
662
|
-
document.body.style.paddingRight = padding;
|
|
663
|
-
}
|
|
664
|
-
};
|
|
665
|
-
|
|
666
|
-
_proto._getScrollbarWidth = function _getScrollbarWidth() {
|
|
667
|
-
// thx d.walsh
|
|
668
|
-
var scrollDiv = document.createElement('div');
|
|
669
|
-
scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;
|
|
670
|
-
document.body.appendChild(scrollDiv);
|
|
671
|
-
var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
|
|
672
|
-
document.body.removeChild(scrollDiv);
|
|
673
|
-
return scrollbarWidth;
|
|
674
776
|
} // Static
|
|
675
|
-
;
|
|
676
777
|
|
|
677
|
-
Modal.jQueryInterface = function jQueryInterface(config, relatedTarget) {
|
|
678
|
-
return this.each(function () {
|
|
679
|
-
var data = Data__default['default'].getData(this, DATA_KEY);
|
|
680
778
|
|
|
681
|
-
|
|
779
|
+
static jQueryInterface(config, relatedTarget) {
|
|
780
|
+
return this.each(function () {
|
|
781
|
+
const data = Modal.getInstance(this) || new Modal(this, typeof config === 'object' ? config : {});
|
|
682
782
|
|
|
683
|
-
if (
|
|
684
|
-
|
|
783
|
+
if (typeof config !== 'string') {
|
|
784
|
+
return;
|
|
685
785
|
}
|
|
686
786
|
|
|
687
|
-
if (typeof config === '
|
|
688
|
-
|
|
689
|
-
throw new TypeError("No method named \"" + config + "\"");
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
data[config](relatedTarget);
|
|
693
|
-
} else if (_config.show) {
|
|
694
|
-
data.show(relatedTarget);
|
|
787
|
+
if (typeof data[config] === 'undefined') {
|
|
788
|
+
throw new TypeError(`No method named "${config}"`);
|
|
695
789
|
}
|
|
696
|
-
});
|
|
697
|
-
};
|
|
698
790
|
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
_createClass(Modal, null, [{
|
|
704
|
-
key: "VERSION",
|
|
705
|
-
get: function get() {
|
|
706
|
-
return VERSION;
|
|
707
|
-
}
|
|
708
|
-
}, {
|
|
709
|
-
key: "Default",
|
|
710
|
-
get: function get() {
|
|
711
|
-
return Default;
|
|
712
|
-
}
|
|
713
|
-
}]);
|
|
791
|
+
data[config](relatedTarget);
|
|
792
|
+
});
|
|
793
|
+
}
|
|
714
794
|
|
|
715
|
-
|
|
716
|
-
}();
|
|
795
|
+
}
|
|
717
796
|
/**
|
|
718
797
|
* ------------------------------------------------------------------------
|
|
719
798
|
* Data Api implementation
|
|
@@ -722,56 +801,35 @@
|
|
|
722
801
|
|
|
723
802
|
|
|
724
803
|
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
var target = getElementFromSelector(this);
|
|
804
|
+
const target = getElementFromSelector(this);
|
|
728
805
|
|
|
729
|
-
if (
|
|
806
|
+
if (['A', 'AREA'].includes(this.tagName)) {
|
|
730
807
|
event.preventDefault();
|
|
731
808
|
}
|
|
732
809
|
|
|
733
|
-
EventHandler__default['default'].one(target, EVENT_SHOW,
|
|
810
|
+
EventHandler__default['default'].one(target, EVENT_SHOW, showEvent => {
|
|
734
811
|
if (showEvent.defaultPrevented) {
|
|
735
812
|
// only register focus restorer if modal will actually get shown
|
|
736
813
|
return;
|
|
737
814
|
}
|
|
738
815
|
|
|
739
|
-
EventHandler__default['default'].one(target, EVENT_HIDDEN,
|
|
740
|
-
if (isVisible(
|
|
741
|
-
|
|
816
|
+
EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
|
|
817
|
+
if (isVisible(this)) {
|
|
818
|
+
this.focus();
|
|
742
819
|
}
|
|
743
820
|
});
|
|
744
821
|
});
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
if (!data) {
|
|
748
|
-
var config = _extends({}, Manipulator__default['default'].getDataAttributes(target), Manipulator__default['default'].getDataAttributes(this));
|
|
749
|
-
|
|
750
|
-
data = new Modal(target, config);
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
data.show(this);
|
|
822
|
+
const data = Modal.getInstance(target) || new Modal(target);
|
|
823
|
+
data.toggle(this);
|
|
754
824
|
});
|
|
755
|
-
var $ = getjQuery();
|
|
756
825
|
/**
|
|
757
826
|
* ------------------------------------------------------------------------
|
|
758
827
|
* jQuery
|
|
759
828
|
* ------------------------------------------------------------------------
|
|
760
|
-
* add .
|
|
829
|
+
* add .Modal to jQuery only if jQuery is present
|
|
761
830
|
*/
|
|
762
831
|
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
if ($) {
|
|
766
|
-
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
767
|
-
$.fn[NAME] = Modal.jQueryInterface;
|
|
768
|
-
$.fn[NAME].Constructor = Modal;
|
|
769
|
-
|
|
770
|
-
$.fn[NAME].noConflict = function () {
|
|
771
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
772
|
-
return Modal.jQueryInterface;
|
|
773
|
-
};
|
|
774
|
-
}
|
|
832
|
+
defineJQueryPlugin(NAME, Modal);
|
|
775
833
|
|
|
776
834
|
return Modal;
|
|
777
835
|
|