bootstrap 5.0.0.alpha2 → 5.0.0

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