bootstrap 4.3.0 → 5.1.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +17 -2
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +7 -4
  5. data/assets/javascripts/bootstrap/alert.js +173 -137
  6. data/assets/javascripts/bootstrap/base-component.js +182 -0
  7. data/assets/javascripts/bootstrap/button.js +102 -143
  8. data/assets/javascripts/bootstrap/carousel.js +481 -410
  9. data/assets/javascripts/bootstrap/collapse.js +340 -274
  10. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
  12. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  13. data/assets/javascripts/bootstrap/dom/selector-engine.js +127 -0
  14. data/assets/javascripts/bootstrap/dropdown.js +494 -400
  15. data/assets/javascripts/bootstrap/modal.js +834 -450
  16. data/assets/javascripts/bootstrap/offcanvas.js +866 -0
  17. data/assets/javascripts/bootstrap/popover.js +122 -199
  18. data/assets/javascripts/bootstrap/scrollspy.js +257 -241
  19. data/assets/javascripts/bootstrap/tab.js +219 -155
  20. data/assets/javascripts/bootstrap/toast.js +330 -190
  21. data/assets/javascripts/bootstrap/tooltip.js +710 -472
  22. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  23. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  24. data/assets/javascripts/bootstrap-sprockets.js +8 -1
  25. data/assets/javascripts/bootstrap.js +3547 -2809
  26. data/assets/javascripts/bootstrap.min.js +4 -4
  27. data/assets/stylesheets/_bootstrap-grid.scss +54 -18
  28. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  29. data/assets/stylesheets/_bootstrap.scss +20 -11
  30. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  31. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  32. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  33. data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
  34. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  35. data/assets/stylesheets/bootstrap/_buttons.scss +28 -54
  36. data/assets/stylesheets/bootstrap/_card.scss +52 -125
  37. data/assets/stylesheets/bootstrap/_carousel.scss +70 -38
  38. data/assets/stylesheets/bootstrap/_close.scss +30 -31
  39. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  40. data/assets/stylesheets/bootstrap/_dropdown.scss +88 -39
  41. data/assets/stylesheets/bootstrap/_forms.scss +9 -330
  42. data/assets/stylesheets/bootstrap/_functions.scss +237 -27
  43. data/assets/stylesheets/bootstrap/_grid.scss +14 -33
  44. data/assets/stylesheets/bootstrap/_helpers.scss +9 -0
  45. data/assets/stylesheets/bootstrap/_images.scss +3 -3
  46. data/assets/stylesheets/bootstrap/_list-group.scss +61 -36
  47. data/assets/stylesheets/bootstrap/_mixins.scss +12 -16
  48. data/assets/stylesheets/bootstrap/_modal.scss +64 -84
  49. data/assets/stylesheets/bootstrap/_nav.scss +29 -10
  50. data/assets/stylesheets/bootstrap/_navbar.scss +93 -52
  51. data/assets/stylesheets/bootstrap/_offcanvas.scss +83 -0
  52. data/assets/stylesheets/bootstrap/_pagination.scss +13 -22
  53. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  54. data/assets/stylesheets/bootstrap/_popover.scss +29 -42
  55. data/assets/stylesheets/bootstrap/_progress.scss +10 -5
  56. data/assets/stylesheets/bootstrap/_reboot.scss +350 -208
  57. data/assets/stylesheets/bootstrap/_root.scss +42 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  59. data/assets/stylesheets/bootstrap/_tables.scss +80 -114
  60. data/assets/stylesheets/bootstrap/_toasts.scss +21 -14
  61. data/assets/stylesheets/bootstrap/_tooltip.scss +21 -21
  62. data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
  63. data/assets/stylesheets/bootstrap/_type.scss +40 -61
  64. data/assets/stylesheets/bootstrap/_utilities.scss +630 -17
  65. data/assets/stylesheets/bootstrap/_variables.scss +993 -487
  66. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +63 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +70 -0
  72. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  74. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  75. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  76. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  77. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  78. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  79. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  80. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  81. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  82. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  83. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  84. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  85. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  86. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  87. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  88. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  89. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  90. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -51
  91. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  92. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  93. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  94. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  95. data/assets/stylesheets/bootstrap/mixins/_forms.scss +67 -115
  96. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  97. data/assets/stylesheets/bootstrap/mixins/_grid.scss +131 -32
  98. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  99. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  100. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
  101. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  102. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  103. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  104. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +89 -0
  105. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  106. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  107. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +274 -132
  108. data/bootstrap.gemspec +4 -6
  109. data/lib/bootstrap/version.rb +2 -2
  110. data/tasks/updater/js.rb +25 -6
  111. data/tasks/updater/network.rb +8 -2
  112. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  113. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  114. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  115. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  116. data/test/dummy_rails/app/views/pages/root.html +89 -0
  117. data/test/dummy_rails/config/application.rb +0 -3
  118. data/test/gemfiles/rails_6_0.gemfile +7 -0
  119. data/test/gemfiles/rails_6_1.gemfile +7 -0
  120. data/test/support/dummy_rails_integration.rb +3 -1
  121. data/test/test_helper.rb +18 -13
  122. metadata +61 -79
  123. data/assets/javascripts/bootstrap/util.js +0 -171
  124. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  125. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -507
  126. data/assets/stylesheets/bootstrap/_input-group.scss +0 -193
  127. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  128. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  129. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  130. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  131. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  132. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  133. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -66
  134. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  135. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  136. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  137. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  138. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  139. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -16
  140. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  141. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  142. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  143. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  144. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  145. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  146. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  147. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  148. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  149. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  150. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  151. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  152. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  153. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  154. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  155. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  156. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  157. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  158. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -1,177 +1,712 @@
1
1
  /*!
2
- * Bootstrap modal.js v4.3.0 (https://getbootstrap.com/)
3
- * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2
+ * Bootstrap modal.js v5.1.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
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.js'], factory) :
9
- (global = global || self, global.Modal = factory(global.jQuery, global.Util));
10
- }(this, function ($, Util) { 'use strict';
11
-
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
14
-
15
- function _defineProperties(target, props) {
16
- for (var i = 0; i < props.length; i++) {
17
- var descriptor = props[i];
18
- descriptor.enumerable = descriptor.enumerable || false;
19
- descriptor.configurable = true;
20
- if ("value" in descriptor) descriptor.writable = true;
21
- Object.defineProperty(target, descriptor.key, descriptor);
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
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
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);
18
+
19
+ /**
20
+ * --------------------------------------------------------------------------
21
+ * Bootstrap (v5.1.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}`;
22
31
  }
23
- }
24
32
 
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
33
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
34
+ };
30
35
 
31
- function _defineProperty(obj, key, value) {
32
- if (key in obj) {
33
- Object.defineProperty(obj, key, {
34
- value: value,
35
- enumerable: true,
36
- configurable: true,
37
- writable: true
38
- });
36
+ const getSelector = element => {
37
+ let selector = element.getAttribute('data-bs-target');
38
+
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 => {
93
+ if (!obj || typeof obj !== 'object') {
94
+ return false;
95
+ }
96
+
97
+ if (typeof obj.jquery !== 'undefined') {
98
+ obj = obj[0];
99
+ }
100
+
101
+ return typeof obj.nodeType !== 'undefined';
102
+ };
103
+
104
+ const getElement = obj => {
105
+ if (isElement(obj)) {
106
+ // it's a jQuery object or a node element
107
+ return obj.jquery ? obj[0] : obj;
108
+ }
109
+
110
+ if (typeof obj === 'string' && obj.length > 0) {
111
+ return document.querySelector(obj);
112
+ }
113
+
114
+ return null;
115
+ };
116
+
117
+ const typeCheckConfig = (componentName, config, configTypes) => {
118
+ Object.keys(configTypes).forEach(property => {
119
+ const expectedTypes = configTypes[property];
120
+ const value = config[property];
121
+ const valueType = value && isElement(value) ? 'element' : toType(value);
122
+
123
+ if (!new RegExp(expectedTypes).test(valueType)) {
124
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
125
+ }
126
+ });
127
+ };
128
+
129
+ const isVisible = element => {
130
+ if (!isElement(element) || element.getClientRects().length === 0) {
131
+ return false;
132
+ }
133
+
134
+ return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
135
+ };
136
+
137
+ const isDisabled = element => {
138
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
139
+ return true;
140
+ }
141
+
142
+ if (element.classList.contains('disabled')) {
143
+ return true;
144
+ }
145
+
146
+ if (typeof element.disabled !== 'undefined') {
147
+ return element.disabled;
148
+ }
149
+
150
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
151
+ };
152
+ /**
153
+ * Trick to restart an element's animation
154
+ *
155
+ * @param {HTMLElement} element
156
+ * @return void
157
+ *
158
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
159
+ */
160
+
161
+
162
+ const reflow = element => {
163
+ // eslint-disable-next-line no-unused-expressions
164
+ element.offsetHeight;
165
+ };
166
+
167
+ const getjQuery = () => {
168
+ const {
169
+ jQuery
170
+ } = window;
171
+
172
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
173
+ return jQuery;
174
+ }
175
+
176
+ return null;
177
+ };
178
+
179
+ const DOMContentLoadedCallbacks = [];
180
+
181
+ const onDOMContentLoaded = callback => {
182
+ if (document.readyState === 'loading') {
183
+ // add listener on the first call when the document is in loading state
184
+ if (!DOMContentLoadedCallbacks.length) {
185
+ document.addEventListener('DOMContentLoaded', () => {
186
+ DOMContentLoadedCallbacks.forEach(callback => callback());
187
+ });
188
+ }
189
+
190
+ DOMContentLoadedCallbacks.push(callback);
39
191
  } else {
40
- obj[key] = value;
192
+ callback();
193
+ }
194
+ };
195
+
196
+ const isRTL = () => document.documentElement.dir === 'rtl';
197
+
198
+ const defineJQueryPlugin = plugin => {
199
+ onDOMContentLoaded(() => {
200
+ const $ = getjQuery();
201
+ /* istanbul ignore if */
202
+
203
+ if ($) {
204
+ const name = plugin.NAME;
205
+ const JQUERY_NO_CONFLICT = $.fn[name];
206
+ $.fn[name] = plugin.jQueryInterface;
207
+ $.fn[name].Constructor = plugin;
208
+
209
+ $.fn[name].noConflict = () => {
210
+ $.fn[name] = JQUERY_NO_CONFLICT;
211
+ return plugin.jQueryInterface;
212
+ };
213
+ }
214
+ });
215
+ };
216
+
217
+ const execute = callback => {
218
+ if (typeof callback === 'function') {
219
+ callback();
220
+ }
221
+ };
222
+
223
+ const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
224
+ if (!waitForTransition) {
225
+ execute(callback);
226
+ return;
227
+ }
228
+
229
+ const durationPadding = 5;
230
+ const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
231
+ let called = false;
232
+
233
+ const handler = ({
234
+ target
235
+ }) => {
236
+ if (target !== transitionElement) {
237
+ return;
238
+ }
239
+
240
+ called = true;
241
+ transitionElement.removeEventListener(TRANSITION_END, handler);
242
+ execute(callback);
243
+ };
244
+
245
+ transitionElement.addEventListener(TRANSITION_END, handler);
246
+ setTimeout(() => {
247
+ if (!called) {
248
+ triggerTransitionEnd(transitionElement);
249
+ }
250
+ }, emulatedDuration);
251
+ };
252
+
253
+ /**
254
+ * --------------------------------------------------------------------------
255
+ * Bootstrap (v5.1.0): util/scrollBar.js
256
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
257
+ * --------------------------------------------------------------------------
258
+ */
259
+ const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
260
+ const SELECTOR_STICKY_CONTENT = '.sticky-top';
261
+
262
+ class ScrollBarHelper {
263
+ constructor() {
264
+ this._element = document.body;
265
+ }
266
+
267
+ getWidth() {
268
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
269
+ const documentWidth = document.documentElement.clientWidth;
270
+ return Math.abs(window.innerWidth - documentWidth);
271
+ }
272
+
273
+ hide() {
274
+ const width = this.getWidth();
275
+
276
+ this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
277
+
278
+
279
+ this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
280
+
281
+
282
+ this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
283
+
284
+ this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
285
+ }
286
+
287
+ _disableOverFlow() {
288
+ this._saveInitialAttribute(this._element, 'overflow');
289
+
290
+ this._element.style.overflow = 'hidden';
291
+ }
292
+
293
+ _setElementAttributes(selector, styleProp, callback) {
294
+ const scrollbarWidth = this.getWidth();
295
+
296
+ const manipulationCallBack = element => {
297
+ if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
298
+ return;
299
+ }
300
+
301
+ this._saveInitialAttribute(element, styleProp);
302
+
303
+ const calculatedValue = window.getComputedStyle(element)[styleProp];
304
+ element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
305
+ };
306
+
307
+ this._applyManipulationCallback(selector, manipulationCallBack);
308
+ }
309
+
310
+ reset() {
311
+ this._resetElementAttributes(this._element, 'overflow');
312
+
313
+ this._resetElementAttributes(this._element, 'paddingRight');
314
+
315
+ this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
316
+
317
+ this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
318
+ }
319
+
320
+ _saveInitialAttribute(element, styleProp) {
321
+ const actualValue = element.style[styleProp];
322
+
323
+ if (actualValue) {
324
+ Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
325
+ }
326
+ }
327
+
328
+ _resetElementAttributes(selector, styleProp) {
329
+ const manipulationCallBack = element => {
330
+ const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
331
+
332
+ if (typeof value === 'undefined') {
333
+ element.style.removeProperty(styleProp);
334
+ } else {
335
+ Manipulator__default['default'].removeDataAttribute(element, styleProp);
336
+ element.style[styleProp] = value;
337
+ }
338
+ };
339
+
340
+ this._applyManipulationCallback(selector, manipulationCallBack);
341
+ }
342
+
343
+ _applyManipulationCallback(selector, callBack) {
344
+ if (isElement(selector)) {
345
+ callBack(selector);
346
+ } else {
347
+ SelectorEngine__default['default'].find(selector, this._element).forEach(callBack);
348
+ }
349
+ }
350
+
351
+ isOverflowing() {
352
+ return this.getWidth() > 0;
41
353
  }
42
354
 
43
- return obj;
44
355
  }
45
356
 
46
- function _objectSpread(target) {
47
- for (var i = 1; i < arguments.length; i++) {
48
- var source = arguments[i] != null ? arguments[i] : {};
49
- var ownKeys = Object.keys(source);
357
+ /**
358
+ * --------------------------------------------------------------------------
359
+ * Bootstrap (v5.1.0): util/backdrop.js
360
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
361
+ * --------------------------------------------------------------------------
362
+ */
363
+ const Default$2 = {
364
+ className: 'modal-backdrop',
365
+ isVisible: true,
366
+ // if false, we use the backdrop helper without adding any element to the dom
367
+ isAnimated: false,
368
+ rootElement: 'body',
369
+ // give the choice to place backdrop under different elements
370
+ clickCallback: null
371
+ };
372
+ const DefaultType$2 = {
373
+ className: 'string',
374
+ isVisible: 'boolean',
375
+ isAnimated: 'boolean',
376
+ rootElement: '(element|string)',
377
+ clickCallback: '(function|null)'
378
+ };
379
+ const NAME$2 = 'backdrop';
380
+ const CLASS_NAME_FADE$1 = 'fade';
381
+ const CLASS_NAME_SHOW$1 = 'show';
382
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$2}`;
383
+
384
+ class Backdrop {
385
+ constructor(config) {
386
+ this._config = this._getConfig(config);
387
+ this._isAppended = false;
388
+ this._element = null;
389
+ }
390
+
391
+ show(callback) {
392
+ if (!this._config.isVisible) {
393
+ execute(callback);
394
+ return;
395
+ }
396
+
397
+ this._append();
398
+
399
+ if (this._config.isAnimated) {
400
+ reflow(this._getElement());
401
+ }
402
+
403
+ this._getElement().classList.add(CLASS_NAME_SHOW$1);
404
+
405
+ this._emulateAnimation(() => {
406
+ execute(callback);
407
+ });
408
+ }
409
+
410
+ hide(callback) {
411
+ if (!this._config.isVisible) {
412
+ execute(callback);
413
+ return;
414
+ }
415
+
416
+ this._getElement().classList.remove(CLASS_NAME_SHOW$1);
417
+
418
+ this._emulateAnimation(() => {
419
+ this.dispose();
420
+ execute(callback);
421
+ });
422
+ } // Private
423
+
424
+
425
+ _getElement() {
426
+ if (!this._element) {
427
+ const backdrop = document.createElement('div');
428
+ backdrop.className = this._config.className;
429
+
430
+ if (this._config.isAnimated) {
431
+ backdrop.classList.add(CLASS_NAME_FADE$1);
432
+ }
433
+
434
+ this._element = backdrop;
435
+ }
436
+
437
+ return this._element;
438
+ }
439
+
440
+ _getConfig(config) {
441
+ config = { ...Default$2,
442
+ ...(typeof config === 'object' ? config : {})
443
+ }; // use getElement() with the default "body" to get a fresh Element on each instantiation
444
+
445
+ config.rootElement = getElement(config.rootElement);
446
+ typeCheckConfig(NAME$2, config, DefaultType$2);
447
+ return config;
448
+ }
50
449
 
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
450
+ _append() {
451
+ if (this._isAppended) {
452
+ return;
55
453
  }
56
454
 
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
455
+ this._config.rootElement.append(this._getElement());
456
+
457
+ EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
458
+ execute(this._config.clickCallback);
59
459
  });
460
+ this._isAppended = true;
461
+ }
462
+
463
+ dispose() {
464
+ if (!this._isAppended) {
465
+ return;
466
+ }
467
+
468
+ EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
469
+
470
+ this._element.remove();
471
+
472
+ this._isAppended = false;
473
+ }
474
+
475
+ _emulateAnimation(callback) {
476
+ executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
60
477
  }
61
478
 
62
- return target;
63
479
  }
64
480
 
481
+ /**
482
+ * --------------------------------------------------------------------------
483
+ * Bootstrap (v5.1.0): util/focustrap.js
484
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
485
+ * --------------------------------------------------------------------------
486
+ */
487
+ const Default$1 = {
488
+ trapElement: null,
489
+ // The element to trap focus inside of
490
+ autofocus: true
491
+ };
492
+ const DefaultType$1 = {
493
+ trapElement: 'element',
494
+ autofocus: 'boolean'
495
+ };
496
+ const NAME$1 = 'focustrap';
497
+ const DATA_KEY$1 = 'bs.focustrap';
498
+ const EVENT_KEY$1 = `.${DATA_KEY$1}`;
499
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
500
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
501
+ const TAB_KEY = 'Tab';
502
+ const TAB_NAV_FORWARD = 'forward';
503
+ const TAB_NAV_BACKWARD = 'backward';
504
+
505
+ class FocusTrap {
506
+ constructor(config) {
507
+ this._config = this._getConfig(config);
508
+ this._isActive = false;
509
+ this._lastTabNavDirection = null;
510
+ }
511
+
512
+ activate() {
513
+ const {
514
+ trapElement,
515
+ autofocus
516
+ } = this._config;
517
+
518
+ if (this._isActive) {
519
+ return;
520
+ }
521
+
522
+ if (autofocus) {
523
+ trapElement.focus();
524
+ }
525
+
526
+ EventHandler__default['default'].off(document, EVENT_KEY$1); // guard against infinite focus loop
527
+
528
+ EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
529
+ EventHandler__default['default'].on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
530
+ this._isActive = true;
531
+ }
532
+
533
+ deactivate() {
534
+ if (!this._isActive) {
535
+ return;
536
+ }
537
+
538
+ this._isActive = false;
539
+ EventHandler__default['default'].off(document, EVENT_KEY$1);
540
+ } // Private
541
+
542
+
543
+ _handleFocusin(event) {
544
+ const {
545
+ target
546
+ } = event;
547
+ const {
548
+ trapElement
549
+ } = this._config;
550
+
551
+ if (target === document || target === trapElement || trapElement.contains(target)) {
552
+ return;
553
+ }
554
+
555
+ const elements = SelectorEngine__default['default'].focusableChildren(trapElement);
556
+
557
+ if (elements.length === 0) {
558
+ trapElement.focus();
559
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
560
+ elements[elements.length - 1].focus();
561
+ } else {
562
+ elements[0].focus();
563
+ }
564
+ }
565
+
566
+ _handleKeydown(event) {
567
+ if (event.key !== TAB_KEY) {
568
+ return;
569
+ }
570
+
571
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
572
+ }
573
+
574
+ _getConfig(config) {
575
+ config = { ...Default$1,
576
+ ...(typeof config === 'object' ? config : {})
577
+ };
578
+ typeCheckConfig(NAME$1, config, DefaultType$1);
579
+ return config;
580
+ }
581
+
582
+ }
583
+
584
+ /**
585
+ * --------------------------------------------------------------------------
586
+ * Bootstrap (v5.1.0): util/component-functions.js
587
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
588
+ * --------------------------------------------------------------------------
589
+ */
590
+
591
+ const enableDismissTrigger = (component, method = 'hide') => {
592
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
593
+ const name = component.NAME;
594
+ EventHandler__default['default'].on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
595
+ if (['A', 'AREA'].includes(this.tagName)) {
596
+ event.preventDefault();
597
+ }
598
+
599
+ if (isDisabled(this)) {
600
+ return;
601
+ }
602
+
603
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
604
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
605
+
606
+ instance[method]();
607
+ });
608
+ };
609
+
610
+ /**
611
+ * --------------------------------------------------------------------------
612
+ * Bootstrap (v5.1.0): modal.js
613
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
614
+ * --------------------------------------------------------------------------
615
+ */
65
616
  /**
66
617
  * ------------------------------------------------------------------------
67
618
  * Constants
68
619
  * ------------------------------------------------------------------------
69
620
  */
70
621
 
71
- var NAME = 'modal';
72
- var VERSION = '4.3.0';
73
- var DATA_KEY = 'bs.modal';
74
- var EVENT_KEY = "." + DATA_KEY;
75
- var DATA_API_KEY = '.data-api';
76
- var JQUERY_NO_CONFLICT = $.fn[NAME];
77
- var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
78
-
79
- var Default = {
622
+ const NAME = 'modal';
623
+ const DATA_KEY = 'bs.modal';
624
+ const EVENT_KEY = `.${DATA_KEY}`;
625
+ const DATA_API_KEY = '.data-api';
626
+ const ESCAPE_KEY = 'Escape';
627
+ const Default = {
80
628
  backdrop: true,
81
629
  keyboard: true,
82
- focus: true,
83
- show: true
630
+ focus: true
84
631
  };
85
- var DefaultType = {
632
+ const DefaultType = {
86
633
  backdrop: '(boolean|string)',
87
634
  keyboard: 'boolean',
88
- focus: 'boolean',
89
- show: 'boolean'
90
- };
91
- var Event = {
92
- HIDE: "hide" + EVENT_KEY,
93
- HIDDEN: "hidden" + EVENT_KEY,
94
- SHOW: "show" + EVENT_KEY,
95
- SHOWN: "shown" + EVENT_KEY,
96
- FOCUSIN: "focusin" + EVENT_KEY,
97
- RESIZE: "resize" + EVENT_KEY,
98
- CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
99
- KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
100
- MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
101
- MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
102
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
103
- };
104
- var ClassName = {
105
- SCROLLABLE: 'modal-dialog-scrollable',
106
- SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
107
- BACKDROP: 'modal-backdrop',
108
- OPEN: 'modal-open',
109
- FADE: 'fade',
110
- SHOW: 'show'
111
- };
112
- var Selector = {
113
- DIALOG: '.modal-dialog',
114
- MODAL_BODY: '.modal-body',
115
- DATA_TOGGLE: '[data-toggle="modal"]',
116
- DATA_DISMISS: '[data-dismiss="modal"]',
117
- FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
118
- STICKY_CONTENT: '.sticky-top'
119
- /**
120
- * ------------------------------------------------------------------------
121
- * Class Definition
122
- * ------------------------------------------------------------------------
123
- */
124
-
635
+ focus: 'boolean'
125
636
  };
637
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
638
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
639
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
640
+ const EVENT_SHOW = `show${EVENT_KEY}`;
641
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
642
+ const EVENT_RESIZE = `resize${EVENT_KEY}`;
643
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
644
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
645
+ const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`;
646
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
647
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
648
+ const CLASS_NAME_OPEN = 'modal-open';
649
+ const CLASS_NAME_FADE = 'fade';
650
+ const CLASS_NAME_SHOW = 'show';
651
+ const CLASS_NAME_STATIC = 'modal-static';
652
+ const SELECTOR_DIALOG = '.modal-dialog';
653
+ const SELECTOR_MODAL_BODY = '.modal-body';
654
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
655
+ /**
656
+ * ------------------------------------------------------------------------
657
+ * Class Definition
658
+ * ------------------------------------------------------------------------
659
+ */
126
660
 
127
- var Modal =
128
- /*#__PURE__*/
129
- function () {
130
- function Modal(element, config) {
661
+ class Modal extends BaseComponent__default['default'] {
662
+ constructor(element, config) {
663
+ super(element);
131
664
  this._config = this._getConfig(config);
132
- this._element = element;
133
- this._dialog = element.querySelector(Selector.DIALOG);
134
- this._backdrop = null;
665
+ this._dialog = SelectorEngine__default['default'].findOne(SELECTOR_DIALOG, this._element);
666
+ this._backdrop = this._initializeBackDrop();
667
+ this._focustrap = this._initializeFocusTrap();
135
668
  this._isShown = false;
136
- this._isBodyOverflowing = false;
137
669
  this._ignoreBackdropClick = false;
138
670
  this._isTransitioning = false;
139
- this._scrollbarWidth = 0;
671
+ this._scrollBar = new ScrollBarHelper();
140
672
  } // Getters
141
673
 
142
674
 
143
- var _proto = Modal.prototype;
675
+ static get Default() {
676
+ return Default;
677
+ }
144
678
 
145
- // Public
146
- _proto.toggle = function toggle(relatedTarget) {
147
- return this._isShown ? this.hide() : this.show(relatedTarget);
148
- };
679
+ static get NAME() {
680
+ return NAME;
681
+ } // Public
149
682
 
150
- _proto.show = function show(relatedTarget) {
151
- var _this = this;
152
683
 
684
+ toggle(relatedTarget) {
685
+ return this._isShown ? this.hide() : this.show(relatedTarget);
686
+ }
687
+
688
+ show(relatedTarget) {
153
689
  if (this._isShown || this._isTransitioning) {
154
690
  return;
155
691
  }
156
692
 
157
- if ($(this._element).hasClass(ClassName.FADE)) {
158
- this._isTransitioning = true;
159
- }
160
-
161
- var showEvent = $.Event(Event.SHOW, {
162
- relatedTarget: relatedTarget
693
+ const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
694
+ relatedTarget
163
695
  });
164
- $(this._element).trigger(showEvent);
165
696
 
166
- if (this._isShown || showEvent.isDefaultPrevented()) {
697
+ if (showEvent.defaultPrevented) {
167
698
  return;
168
699
  }
169
700
 
170
701
  this._isShown = true;
171
702
 
172
- this._checkScrollbar();
703
+ if (this._isAnimated()) {
704
+ this._isTransitioning = true;
705
+ }
706
+
707
+ this._scrollBar.hide();
173
708
 
174
- this._setScrollbar();
709
+ document.body.classList.add(CLASS_NAME_OPEN);
175
710
 
176
711
  this._adjustDialog();
177
712
 
@@ -179,44 +714,33 @@
179
714
 
180
715
  this._setResizeEvent();
181
716
 
182
- $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
183
- return _this.hide(event);
184
- });
185
- $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
186
- $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
187
- if ($(event.target).is(_this._element)) {
188
- _this._ignoreBackdropClick = true;
717
+ EventHandler__default['default'].on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
718
+ EventHandler__default['default'].one(this._element, EVENT_MOUSEUP_DISMISS, event => {
719
+ if (event.target === this._element) {
720
+ this._ignoreBackdropClick = true;
189
721
  }
190
722
  });
191
723
  });
192
724
 
193
- this._showBackdrop(function () {
194
- return _this._showElement(relatedTarget);
195
- });
196
- };
197
-
198
- _proto.hide = function hide(event) {
199
- var _this2 = this;
200
-
201
- if (event) {
202
- event.preventDefault();
203
- }
725
+ this._showBackdrop(() => this._showElement(relatedTarget));
726
+ }
204
727
 
728
+ hide() {
205
729
  if (!this._isShown || this._isTransitioning) {
206
730
  return;
207
731
  }
208
732
 
209
- var hideEvent = $.Event(Event.HIDE);
210
- $(this._element).trigger(hideEvent);
733
+ const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
211
734
 
212
- if (!this._isShown || hideEvent.isDefaultPrevented()) {
735
+ if (hideEvent.defaultPrevented) {
213
736
  return;
214
737
  }
215
738
 
216
739
  this._isShown = false;
217
- var transition = $(this._element).hasClass(ClassName.FADE);
218
740
 
219
- if (transition) {
741
+ const isAnimated = this._isAnimated();
742
+
743
+ if (isAnimated) {
220
744
  this._isTransitioning = true;
221
745
  }
222
746
 
@@ -224,63 +748,62 @@
224
748
 
225
749
  this._setResizeEvent();
226
750
 
227
- $(document).off(Event.FOCUSIN);
228
- $(this._element).removeClass(ClassName.SHOW);
229
- $(this._element).off(Event.CLICK_DISMISS);
230
- $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
751
+ this._focustrap.deactivate();
231
752
 
232
- if (transition) {
233
- var transitionDuration = Util.getTransitionDurationFromElement(this._element);
234
- $(this._element).one(Util.TRANSITION_END, function (event) {
235
- return _this2._hideModal(event);
236
- }).emulateTransitionEnd(transitionDuration);
237
- } else {
238
- this._hideModal();
239
- }
240
- };
753
+ this._element.classList.remove(CLASS_NAME_SHOW);
241
754
 
242
- _proto.dispose = function dispose() {
243
- [window, this._element, this._dialog].forEach(function (htmlElement) {
244
- return $(htmlElement).off(EVENT_KEY);
245
- });
246
- /**
247
- * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`
248
- * Do not move `document` in `htmlElements` array
249
- * It will remove `Event.CLICK_DATA_API` event that should remain
250
- */
251
-
252
- $(document).off(Event.FOCUSIN);
253
- $.removeData(this._element, DATA_KEY);
254
- this._config = null;
255
- this._element = null;
256
- this._dialog = null;
257
- this._backdrop = null;
258
- this._isShown = null;
259
- this._isBodyOverflowing = null;
260
- this._ignoreBackdropClick = null;
261
- this._isTransitioning = null;
262
- this._scrollbarWidth = null;
263
- };
755
+ EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS);
756
+ EventHandler__default['default'].off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
757
+
758
+ this._queueCallback(() => this._hideModal(), this._element, isAnimated);
759
+ }
264
760
 
265
- _proto.handleUpdate = function handleUpdate() {
761
+ dispose() {
762
+ [window, this._dialog].forEach(htmlElement => EventHandler__default['default'].off(htmlElement, EVENT_KEY));
763
+
764
+ this._backdrop.dispose();
765
+
766
+ this._focustrap.deactivate();
767
+
768
+ super.dispose();
769
+ }
770
+
771
+ handleUpdate() {
266
772
  this._adjustDialog();
267
773
  } // Private
268
- ;
269
774
 
270
- _proto._getConfig = function _getConfig(config) {
271
- config = _objectSpread({}, Default, config);
272
- Util.typeCheckConfig(NAME, config, DefaultType);
775
+
776
+ _initializeBackDrop() {
777
+ return new Backdrop({
778
+ isVisible: Boolean(this._config.backdrop),
779
+ // 'static' option will be translated to true, and booleans will keep their value
780
+ isAnimated: this._isAnimated()
781
+ });
782
+ }
783
+
784
+ _initializeFocusTrap() {
785
+ return new FocusTrap({
786
+ trapElement: this._element
787
+ });
788
+ }
789
+
790
+ _getConfig(config) {
791
+ config = { ...Default,
792
+ ...Manipulator__default['default'].getDataAttributes(this._element),
793
+ ...(typeof config === 'object' ? config : {})
794
+ };
795
+ typeCheckConfig(NAME, config, DefaultType);
273
796
  return config;
274
- };
797
+ }
275
798
 
276
- _proto._showElement = function _showElement(relatedTarget) {
277
- var _this3 = this;
799
+ _showElement(relatedTarget) {
800
+ const isAnimated = this._isAnimated();
278
801
 
279
- var transition = $(this._element).hasClass(ClassName.FADE);
802
+ const modalBody = SelectorEngine__default['default'].findOne(SELECTOR_MODAL_BODY, this._dialog);
280
803
 
281
804
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
282
805
  // Don't move modal's DOM position
283
- document.body.appendChild(this._element);
806
+ document.body.append(this._element);
284
807
  }
285
808
 
286
809
  this._element.style.display = 'block';
@@ -289,309 +812,183 @@
289
812
 
290
813
  this._element.setAttribute('aria-modal', true);
291
814
 
292
- if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {
293
- this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
294
- } else {
295
- this._element.scrollTop = 0;
296
- }
815
+ this._element.setAttribute('role', 'dialog');
297
816
 
298
- if (transition) {
299
- Util.reflow(this._element);
300
- }
817
+ this._element.scrollTop = 0;
301
818
 
302
- $(this._element).addClass(ClassName.SHOW);
819
+ if (modalBody) {
820
+ modalBody.scrollTop = 0;
821
+ }
303
822
 
304
- if (this._config.focus) {
305
- this._enforceFocus();
823
+ if (isAnimated) {
824
+ reflow(this._element);
306
825
  }
307
826
 
308
- var shownEvent = $.Event(Event.SHOWN, {
309
- relatedTarget: relatedTarget
310
- });
827
+ this._element.classList.add(CLASS_NAME_SHOW);
311
828
 
312
- var transitionComplete = function transitionComplete() {
313
- if (_this3._config.focus) {
314
- _this3._element.focus();
829
+ const transitionComplete = () => {
830
+ if (this._config.focus) {
831
+ this._focustrap.activate();
315
832
  }
316
833
 
317
- _this3._isTransitioning = false;
318
- $(_this3._element).trigger(shownEvent);
834
+ this._isTransitioning = false;
835
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
836
+ relatedTarget
837
+ });
319
838
  };
320
839
 
321
- if (transition) {
322
- var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);
323
- $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
324
- } else {
325
- transitionComplete();
326
- }
327
- };
328
-
329
- _proto._enforceFocus = function _enforceFocus() {
330
- var _this4 = this;
331
-
332
- $(document).off(Event.FOCUSIN) // Guard against infinite focus loop
333
- .on(Event.FOCUSIN, function (event) {
334
- if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {
335
- _this4._element.focus();
336
- }
337
- });
338
- };
339
-
340
- _proto._setEscapeEvent = function _setEscapeEvent() {
341
- var _this5 = this;
840
+ this._queueCallback(transitionComplete, this._dialog, isAnimated);
841
+ }
342
842
 
343
- if (this._isShown && this._config.keyboard) {
344
- $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
345
- if (event.which === ESCAPE_KEYCODE) {
843
+ _setEscapeEvent() {
844
+ if (this._isShown) {
845
+ EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
846
+ if (this._config.keyboard && event.key === ESCAPE_KEY) {
346
847
  event.preventDefault();
347
-
348
- _this5.hide();
848
+ this.hide();
849
+ } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
850
+ this._triggerBackdropTransition();
349
851
  }
350
852
  });
351
- } else if (!this._isShown) {
352
- $(this._element).off(Event.KEYDOWN_DISMISS);
853
+ } else {
854
+ EventHandler__default['default'].off(this._element, EVENT_KEYDOWN_DISMISS);
353
855
  }
354
- };
355
-
356
- _proto._setResizeEvent = function _setResizeEvent() {
357
- var _this6 = this;
856
+ }
358
857
 
858
+ _setResizeEvent() {
359
859
  if (this._isShown) {
360
- $(window).on(Event.RESIZE, function (event) {
361
- return _this6.handleUpdate(event);
362
- });
860
+ EventHandler__default['default'].on(window, EVENT_RESIZE, () => this._adjustDialog());
363
861
  } else {
364
- $(window).off(Event.RESIZE);
862
+ EventHandler__default['default'].off(window, EVENT_RESIZE);
365
863
  }
366
- };
367
-
368
- _proto._hideModal = function _hideModal() {
369
- var _this7 = this;
864
+ }
370
865
 
866
+ _hideModal() {
371
867
  this._element.style.display = 'none';
372
868
 
373
869
  this._element.setAttribute('aria-hidden', true);
374
870
 
375
871
  this._element.removeAttribute('aria-modal');
376
872
 
873
+ this._element.removeAttribute('role');
874
+
377
875
  this._isTransitioning = false;
378
876
 
379
- this._showBackdrop(function () {
380
- $(document.body).removeClass(ClassName.OPEN);
877
+ this._backdrop.hide(() => {
878
+ document.body.classList.remove(CLASS_NAME_OPEN);
381
879
 
382
- _this7._resetAdjustments();
880
+ this._resetAdjustments();
383
881
 
384
- _this7._resetScrollbar();
882
+ this._scrollBar.reset();
385
883
 
386
- $(_this7._element).trigger(Event.HIDDEN);
884
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
387
885
  });
388
- };
389
-
390
- _proto._removeBackdrop = function _removeBackdrop() {
391
- if (this._backdrop) {
392
- $(this._backdrop).remove();
393
- this._backdrop = null;
394
- }
395
- };
396
-
397
- _proto._showBackdrop = function _showBackdrop(callback) {
398
- var _this8 = this;
399
-
400
- var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
401
-
402
- if (this._isShown && this._config.backdrop) {
403
- this._backdrop = document.createElement('div');
404
- this._backdrop.className = ClassName.BACKDROP;
405
-
406
- if (animate) {
407
- this._backdrop.classList.add(animate);
408
- }
409
-
410
- $(this._backdrop).appendTo(document.body);
411
- $(this._element).on(Event.CLICK_DISMISS, function (event) {
412
- if (_this8._ignoreBackdropClick) {
413
- _this8._ignoreBackdropClick = false;
414
- return;
415
- }
416
-
417
- if (event.target !== event.currentTarget) {
418
- return;
419
- }
420
-
421
- if (_this8._config.backdrop === 'static') {
422
- _this8._element.focus();
423
- } else {
424
- _this8.hide();
425
- }
426
- });
427
-
428
- if (animate) {
429
- Util.reflow(this._backdrop);
430
- }
431
-
432
- $(this._backdrop).addClass(ClassName.SHOW);
886
+ }
433
887
 
434
- if (!callback) {
888
+ _showBackdrop(callback) {
889
+ EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, event => {
890
+ if (this._ignoreBackdropClick) {
891
+ this._ignoreBackdropClick = false;
435
892
  return;
436
893
  }
437
894
 
438
- if (!animate) {
439
- callback();
895
+ if (event.target !== event.currentTarget) {
440
896
  return;
441
897
  }
442
898
 
443
- var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
444
- $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
445
- } else if (!this._isShown && this._backdrop) {
446
- $(this._backdrop).removeClass(ClassName.SHOW);
899
+ if (this._config.backdrop === true) {
900
+ this.hide();
901
+ } else if (this._config.backdrop === 'static') {
902
+ this._triggerBackdropTransition();
903
+ }
904
+ });
447
905
 
448
- var callbackRemove = function callbackRemove() {
449
- _this8._removeBackdrop();
906
+ this._backdrop.show(callback);
907
+ }
450
908
 
451
- if (callback) {
452
- callback();
453
- }
454
- };
909
+ _isAnimated() {
910
+ return this._element.classList.contains(CLASS_NAME_FADE);
911
+ }
455
912
 
456
- if ($(this._element).hasClass(ClassName.FADE)) {
457
- var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
913
+ _triggerBackdropTransition() {
914
+ const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE_PREVENTED);
458
915
 
459
- $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
460
- } else {
461
- callbackRemove();
462
- }
463
- } else if (callback) {
464
- callback();
916
+ if (hideEvent.defaultPrevented) {
917
+ return;
465
918
  }
466
- } // ----------------------------------------------------------------------
467
- // the following methods are used to handle overflowing modals
468
- // todo (fat): these should probably be refactored out of modal.js
469
- // ----------------------------------------------------------------------
470
- ;
471
919
 
472
- _proto._adjustDialog = function _adjustDialog() {
473
- var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
920
+ const {
921
+ classList,
922
+ scrollHeight,
923
+ style
924
+ } = this._element;
925
+ const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
474
926
 
475
- if (!this._isBodyOverflowing && isModalOverflowing) {
476
- this._element.style.paddingLeft = this._scrollbarWidth + "px";
927
+ if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
928
+ return;
477
929
  }
478
930
 
479
- if (this._isBodyOverflowing && !isModalOverflowing) {
480
- this._element.style.paddingRight = this._scrollbarWidth + "px";
931
+ if (!isModalOverflowing) {
932
+ style.overflowY = 'hidden';
481
933
  }
482
- };
483
934
 
484
- _proto._resetAdjustments = function _resetAdjustments() {
485
- this._element.style.paddingLeft = '';
486
- this._element.style.paddingRight = '';
487
- };
935
+ classList.add(CLASS_NAME_STATIC);
488
936
 
489
- _proto._checkScrollbar = function _checkScrollbar() {
490
- var rect = document.body.getBoundingClientRect();
491
- this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
492
- this._scrollbarWidth = this._getScrollbarWidth();
493
- };
937
+ this._queueCallback(() => {
938
+ classList.remove(CLASS_NAME_STATIC);
494
939
 
495
- _proto._setScrollbar = function _setScrollbar() {
496
- var _this9 = this;
940
+ if (!isModalOverflowing) {
941
+ this._queueCallback(() => {
942
+ style.overflowY = '';
943
+ }, this._dialog);
944
+ }
945
+ }, this._dialog);
497
946
 
498
- if (this._isBodyOverflowing) {
499
- // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
500
- // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
501
- var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
502
- var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding
947
+ this._element.focus();
948
+ } // ----------------------------------------------------------------------
949
+ // the following methods are used to handle overflowing modals
950
+ // ----------------------------------------------------------------------
503
951
 
504
- $(fixedContent).each(function (index, element) {
505
- var actualPadding = element.style.paddingRight;
506
- var calculatedPadding = $(element).css('padding-right');
507
- $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
508
- }); // Adjust sticky content margin
509
952
 
510
- $(stickyContent).each(function (index, element) {
511
- var actualMargin = element.style.marginRight;
512
- var calculatedMargin = $(element).css('margin-right');
513
- $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
514
- }); // Adjust body padding
953
+ _adjustDialog() {
954
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
515
955
 
516
- var actualPadding = document.body.style.paddingRight;
517
- var calculatedPadding = $(document.body).css('padding-right');
518
- $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
519
- }
956
+ const scrollbarWidth = this._scrollBar.getWidth();
520
957
 
521
- $(document.body).addClass(ClassName.OPEN);
522
- };
958
+ const isBodyOverflowing = scrollbarWidth > 0;
523
959
 
524
- _proto._resetScrollbar = function _resetScrollbar() {
525
- // Restore fixed content padding
526
- var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
527
- $(fixedContent).each(function (index, element) {
528
- var padding = $(element).data('padding-right');
529
- $(element).removeData('padding-right');
530
- element.style.paddingRight = padding ? padding : '';
531
- }); // Restore sticky content
532
-
533
- var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT));
534
- $(elements).each(function (index, element) {
535
- var margin = $(element).data('margin-right');
536
-
537
- if (typeof margin !== 'undefined') {
538
- $(element).css('margin-right', margin).removeData('margin-right');
539
- }
540
- }); // Restore body padding
960
+ if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
961
+ this._element.style.paddingLeft = `${scrollbarWidth}px`;
962
+ }
541
963
 
542
- var padding = $(document.body).data('padding-right');
543
- $(document.body).removeData('padding-right');
544
- document.body.style.paddingRight = padding ? padding : '';
545
- };
964
+ if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
965
+ this._element.style.paddingRight = `${scrollbarWidth}px`;
966
+ }
967
+ }
546
968
 
547
- _proto._getScrollbarWidth = function _getScrollbarWidth() {
548
- // thx d.walsh
549
- var scrollDiv = document.createElement('div');
550
- scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
551
- document.body.appendChild(scrollDiv);
552
- var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
553
- document.body.removeChild(scrollDiv);
554
- return scrollbarWidth;
969
+ _resetAdjustments() {
970
+ this._element.style.paddingLeft = '';
971
+ this._element.style.paddingRight = '';
555
972
  } // Static
556
- ;
557
973
 
558
- Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
559
- return this.each(function () {
560
- var data = $(this).data(DATA_KEY);
561
974
 
562
- var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {});
975
+ static jQueryInterface(config, relatedTarget) {
976
+ return this.each(function () {
977
+ const data = Modal.getOrCreateInstance(this, config);
563
978
 
564
- if (!data) {
565
- data = new Modal(this, _config);
566
- $(this).data(DATA_KEY, data);
979
+ if (typeof config !== 'string') {
980
+ return;
567
981
  }
568
982
 
569
- if (typeof config === 'string') {
570
- if (typeof data[config] === 'undefined') {
571
- throw new TypeError("No method named \"" + config + "\"");
572
- }
573
-
574
- data[config](relatedTarget);
575
- } else if (_config.show) {
576
- data.show(relatedTarget);
983
+ if (typeof data[config] === 'undefined') {
984
+ throw new TypeError(`No method named "${config}"`);
577
985
  }
578
- });
579
- };
580
986
 
581
- _createClass(Modal, null, [{
582
- key: "VERSION",
583
- get: function get() {
584
- return VERSION;
585
- }
586
- }, {
587
- key: "Default",
588
- get: function get() {
589
- return Default;
590
- }
591
- }]);
987
+ data[config](relatedTarget);
988
+ });
989
+ }
592
990
 
593
- return Modal;
594
- }();
991
+ }
595
992
  /**
596
993
  * ------------------------------------------------------------------------
597
994
  * Data Api implementation
@@ -599,51 +996,38 @@
599
996
  */
600
997
 
601
998
 
602
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
603
- var _this10 = this;
604
-
605
- var target;
606
- var selector = Util.getSelectorFromElement(this);
999
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1000
+ const target = getElementFromSelector(this);
607
1001
 
608
- if (selector) {
609
- target = document.querySelector(selector);
610
- }
611
-
612
- var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
613
-
614
- if (this.tagName === 'A' || this.tagName === 'AREA') {
1002
+ if (['A', 'AREA'].includes(this.tagName)) {
615
1003
  event.preventDefault();
616
1004
  }
617
1005
 
618
- var $target = $(target).one(Event.SHOW, function (showEvent) {
619
- if (showEvent.isDefaultPrevented()) {
620
- // Only register focus restorer if modal will actually get shown
1006
+ EventHandler__default['default'].one(target, EVENT_SHOW, showEvent => {
1007
+ if (showEvent.defaultPrevented) {
1008
+ // only register focus restorer if modal will actually get shown
621
1009
  return;
622
1010
  }
623
1011
 
624
- $target.one(Event.HIDDEN, function () {
625
- if ($(_this10).is(':visible')) {
626
- _this10.focus();
1012
+ EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
1013
+ if (isVisible(this)) {
1014
+ this.focus();
627
1015
  }
628
1016
  });
629
1017
  });
630
-
631
- Modal._jQueryInterface.call($(target), config, this);
1018
+ const data = Modal.getOrCreateInstance(target);
1019
+ data.toggle(this);
632
1020
  });
1021
+ enableDismissTrigger(Modal);
633
1022
  /**
634
1023
  * ------------------------------------------------------------------------
635
1024
  * jQuery
636
1025
  * ------------------------------------------------------------------------
1026
+ * add .Modal to jQuery only if jQuery is present
637
1027
  */
638
1028
 
639
- $.fn[NAME] = Modal._jQueryInterface;
640
- $.fn[NAME].Constructor = Modal;
641
-
642
- $.fn[NAME].noConflict = function () {
643
- $.fn[NAME] = JQUERY_NO_CONFLICT;
644
- return Modal._jQueryInterface;
645
- };
1029
+ defineJQueryPlugin(Modal);
646
1030
 
647
1031
  return Modal;
648
1032
 
649
- }));
1033
+ })));