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