bootstrap 5.0.0.beta2 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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