bootstrap 5.0.0.beta2 → 5.0.2

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