bootstrap 4.3.1 → 5.1.3

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 +172 -136
  6. data/assets/javascripts/bootstrap/base-component.js +182 -0
  7. data/assets/javascripts/bootstrap/button.js +101 -142
  8. data/assets/javascripts/bootstrap/carousel.js +483 -408
  9. data/assets/javascripts/bootstrap/collapse.js +340 -273
  10. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +321 -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 +491 -399
  15. data/assets/javascripts/bootstrap/modal.js +841 -449
  16. data/assets/javascripts/bootstrap/offcanvas.js +866 -0
  17. data/assets/javascripts/bootstrap/popover.js +121 -198
  18. data/assets/javascripts/bootstrap/scrollspy.js +256 -240
  19. data/assets/javascripts/bootstrap/tab.js +218 -154
  20. data/assets/javascripts/bootstrap/toast.js +329 -189
  21. data/assets/javascripts/bootstrap/tooltip.js +651 -552
  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 +3503 -2892
  26. data/assets/javascripts/bootstrap.min.js +4 -4
  27. data/assets/stylesheets/_bootstrap-grid.scss +56 -18
  28. data/assets/stylesheets/_bootstrap-reboot.scss +5 -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 +243 -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 +43 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  59. data/assets/stylesheets/bootstrap/_tables.scss +84 -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 +1007 -489
  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 +72 -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 +132 -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 +278 -128
  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,713 @@
1
1
  /*!
2
- * Bootstrap modal.js v4.3.1 (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.3 (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
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
+
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
17
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
+
19
+ /**
20
+ * --------------------------------------------------------------------------
21
+ * Bootstrap (v5.1.3): 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.3): 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.3): util/backdrop.js
360
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/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}`;
50
383
 
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
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
+ }
449
+
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);
477
+ }
478
+
479
+ }
480
+
481
+ /**
482
+ * --------------------------------------------------------------------------
483
+ * Bootstrap (v5.1.3): util/focustrap.js
484
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/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;
60
580
  }
61
581
 
62
- return target;
63
582
  }
64
583
 
584
+ /**
585
+ * --------------------------------------------------------------------------
586
+ * Bootstrap (v5.1.3): 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.3): 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.1';
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 OPEN_SELECTOR = '.modal.show';
653
+ const SELECTOR_DIALOG = '.modal-dialog';
654
+ const SELECTOR_MODAL_BODY = '.modal-body';
655
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
656
+ /**
657
+ * ------------------------------------------------------------------------
658
+ * Class Definition
659
+ * ------------------------------------------------------------------------
660
+ */
126
661
 
127
- var Modal =
128
- /*#__PURE__*/
129
- function () {
130
- function Modal(element, config) {
662
+ class Modal extends BaseComponent__default.default {
663
+ constructor(element, config) {
664
+ super(element);
131
665
  this._config = this._getConfig(config);
132
- this._element = element;
133
- this._dialog = element.querySelector(Selector.DIALOG);
134
- this._backdrop = null;
666
+ this._dialog = SelectorEngine__default.default.findOne(SELECTOR_DIALOG, this._element);
667
+ this._backdrop = this._initializeBackDrop();
668
+ this._focustrap = this._initializeFocusTrap();
135
669
  this._isShown = false;
136
- this._isBodyOverflowing = false;
137
670
  this._ignoreBackdropClick = false;
138
671
  this._isTransitioning = false;
139
- this._scrollbarWidth = 0;
672
+ this._scrollBar = new ScrollBarHelper();
140
673
  } // Getters
141
674
 
142
675
 
143
- var _proto = Modal.prototype;
676
+ static get Default() {
677
+ return Default;
678
+ }
144
679
 
145
- // Public
146
- _proto.toggle = function toggle(relatedTarget) {
147
- return this._isShown ? this.hide() : this.show(relatedTarget);
148
- };
680
+ static get NAME() {
681
+ return NAME;
682
+ } // Public
149
683
 
150
- _proto.show = function show(relatedTarget) {
151
- var _this = this;
152
684
 
685
+ toggle(relatedTarget) {
686
+ return this._isShown ? this.hide() : this.show(relatedTarget);
687
+ }
688
+
689
+ show(relatedTarget) {
153
690
  if (this._isShown || this._isTransitioning) {
154
691
  return;
155
692
  }
156
693
 
157
- if ($(this._element).hasClass(ClassName.FADE)) {
158
- this._isTransitioning = true;
159
- }
160
-
161
- var showEvent = $.Event(Event.SHOW, {
162
- relatedTarget: relatedTarget
694
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
695
+ relatedTarget
163
696
  });
164
- $(this._element).trigger(showEvent);
165
697
 
166
- if (this._isShown || showEvent.isDefaultPrevented()) {
698
+ if (showEvent.defaultPrevented) {
167
699
  return;
168
700
  }
169
701
 
170
702
  this._isShown = true;
171
703
 
172
- this._checkScrollbar();
704
+ if (this._isAnimated()) {
705
+ this._isTransitioning = true;
706
+ }
707
+
708
+ this._scrollBar.hide();
173
709
 
174
- this._setScrollbar();
710
+ document.body.classList.add(CLASS_NAME_OPEN);
175
711
 
176
712
  this._adjustDialog();
177
713
 
@@ -179,44 +715,33 @@
179
715
 
180
716
  this._setResizeEvent();
181
717
 
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;
718
+ EventHandler__default.default.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
719
+ EventHandler__default.default.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
720
+ if (event.target === this._element) {
721
+ this._ignoreBackdropClick = true;
189
722
  }
190
723
  });
191
724
  });
192
725
 
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
- }
726
+ this._showBackdrop(() => this._showElement(relatedTarget));
727
+ }
204
728
 
729
+ hide() {
205
730
  if (!this._isShown || this._isTransitioning) {
206
731
  return;
207
732
  }
208
733
 
209
- var hideEvent = $.Event(Event.HIDE);
210
- $(this._element).trigger(hideEvent);
734
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
211
735
 
212
- if (!this._isShown || hideEvent.isDefaultPrevented()) {
736
+ if (hideEvent.defaultPrevented) {
213
737
  return;
214
738
  }
215
739
 
216
740
  this._isShown = false;
217
- var transition = $(this._element).hasClass(ClassName.FADE);
218
741
 
219
- if (transition) {
742
+ const isAnimated = this._isAnimated();
743
+
744
+ if (isAnimated) {
220
745
  this._isTransitioning = true;
221
746
  }
222
747
 
@@ -224,63 +749,62 @@
224
749
 
225
750
  this._setResizeEvent();
226
751
 
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);
752
+ this._focustrap.deactivate();
231
753
 
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
- };
754
+ this._element.classList.remove(CLASS_NAME_SHOW);
241
755
 
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
- };
756
+ EventHandler__default.default.off(this._element, EVENT_CLICK_DISMISS);
757
+ EventHandler__default.default.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
758
+
759
+ this._queueCallback(() => this._hideModal(), this._element, isAnimated);
760
+ }
761
+
762
+ dispose() {
763
+ [window, this._dialog].forEach(htmlElement => EventHandler__default.default.off(htmlElement, EVENT_KEY));
764
+
765
+ this._backdrop.dispose();
264
766
 
265
- _proto.handleUpdate = function handleUpdate() {
767
+ this._focustrap.deactivate();
768
+
769
+ super.dispose();
770
+ }
771
+
772
+ handleUpdate() {
266
773
  this._adjustDialog();
267
774
  } // Private
268
- ;
269
775
 
270
- _proto._getConfig = function _getConfig(config) {
271
- config = _objectSpread({}, Default, config);
272
- Util.typeCheckConfig(NAME, config, DefaultType);
776
+
777
+ _initializeBackDrop() {
778
+ return new Backdrop({
779
+ isVisible: Boolean(this._config.backdrop),
780
+ // 'static' option will be translated to true, and booleans will keep their value
781
+ isAnimated: this._isAnimated()
782
+ });
783
+ }
784
+
785
+ _initializeFocusTrap() {
786
+ return new FocusTrap({
787
+ trapElement: this._element
788
+ });
789
+ }
790
+
791
+ _getConfig(config) {
792
+ config = { ...Default,
793
+ ...Manipulator__default.default.getDataAttributes(this._element),
794
+ ...(typeof config === 'object' ? config : {})
795
+ };
796
+ typeCheckConfig(NAME, config, DefaultType);
273
797
  return config;
274
- };
798
+ }
275
799
 
276
- _proto._showElement = function _showElement(relatedTarget) {
277
- var _this3 = this;
800
+ _showElement(relatedTarget) {
801
+ const isAnimated = this._isAnimated();
278
802
 
279
- var transition = $(this._element).hasClass(ClassName.FADE);
803
+ const modalBody = SelectorEngine__default.default.findOne(SELECTOR_MODAL_BODY, this._dialog);
280
804
 
281
805
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
282
806
  // Don't move modal's DOM position
283
- document.body.appendChild(this._element);
807
+ document.body.append(this._element);
284
808
  }
285
809
 
286
810
  this._element.style.display = 'block';
@@ -289,309 +813,183 @@
289
813
 
290
814
  this._element.setAttribute('aria-modal', true);
291
815
 
292
- if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {
293
- this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
294
- } else {
295
- this._element.scrollTop = 0;
296
- }
816
+ this._element.setAttribute('role', 'dialog');
297
817
 
298
- if (transition) {
299
- Util.reflow(this._element);
300
- }
818
+ this._element.scrollTop = 0;
301
819
 
302
- $(this._element).addClass(ClassName.SHOW);
820
+ if (modalBody) {
821
+ modalBody.scrollTop = 0;
822
+ }
303
823
 
304
- if (this._config.focus) {
305
- this._enforceFocus();
824
+ if (isAnimated) {
825
+ reflow(this._element);
306
826
  }
307
827
 
308
- var shownEvent = $.Event(Event.SHOWN, {
309
- relatedTarget: relatedTarget
310
- });
828
+ this._element.classList.add(CLASS_NAME_SHOW);
311
829
 
312
- var transitionComplete = function transitionComplete() {
313
- if (_this3._config.focus) {
314
- _this3._element.focus();
830
+ const transitionComplete = () => {
831
+ if (this._config.focus) {
832
+ this._focustrap.activate();
315
833
  }
316
834
 
317
- _this3._isTransitioning = false;
318
- $(_this3._element).trigger(shownEvent);
835
+ this._isTransitioning = false;
836
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
837
+ relatedTarget
838
+ });
319
839
  };
320
840
 
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;
841
+ this._queueCallback(transitionComplete, this._dialog, isAnimated);
842
+ }
342
843
 
343
- if (this._isShown && this._config.keyboard) {
344
- $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
345
- if (event.which === ESCAPE_KEYCODE) {
844
+ _setEscapeEvent() {
845
+ if (this._isShown) {
846
+ EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
847
+ if (this._config.keyboard && event.key === ESCAPE_KEY) {
346
848
  event.preventDefault();
347
-
348
- _this5.hide();
849
+ this.hide();
850
+ } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
851
+ this._triggerBackdropTransition();
349
852
  }
350
853
  });
351
- } else if (!this._isShown) {
352
- $(this._element).off(Event.KEYDOWN_DISMISS);
854
+ } else {
855
+ EventHandler__default.default.off(this._element, EVENT_KEYDOWN_DISMISS);
353
856
  }
354
- };
355
-
356
- _proto._setResizeEvent = function _setResizeEvent() {
357
- var _this6 = this;
857
+ }
358
858
 
859
+ _setResizeEvent() {
359
860
  if (this._isShown) {
360
- $(window).on(Event.RESIZE, function (event) {
361
- return _this6.handleUpdate(event);
362
- });
861
+ EventHandler__default.default.on(window, EVENT_RESIZE, () => this._adjustDialog());
363
862
  } else {
364
- $(window).off(Event.RESIZE);
863
+ EventHandler__default.default.off(window, EVENT_RESIZE);
365
864
  }
366
- };
367
-
368
- _proto._hideModal = function _hideModal() {
369
- var _this7 = this;
865
+ }
370
866
 
867
+ _hideModal() {
371
868
  this._element.style.display = 'none';
372
869
 
373
870
  this._element.setAttribute('aria-hidden', true);
374
871
 
375
872
  this._element.removeAttribute('aria-modal');
376
873
 
874
+ this._element.removeAttribute('role');
875
+
377
876
  this._isTransitioning = false;
378
877
 
379
- this._showBackdrop(function () {
380
- $(document.body).removeClass(ClassName.OPEN);
878
+ this._backdrop.hide(() => {
879
+ document.body.classList.remove(CLASS_NAME_OPEN);
381
880
 
382
- _this7._resetAdjustments();
881
+ this._resetAdjustments();
383
882
 
384
- _this7._resetScrollbar();
883
+ this._scrollBar.reset();
385
884
 
386
- $(_this7._element).trigger(Event.HIDDEN);
885
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
387
886
  });
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);
887
+ }
433
888
 
434
- if (!callback) {
889
+ _showBackdrop(callback) {
890
+ EventHandler__default.default.on(this._element, EVENT_CLICK_DISMISS, event => {
891
+ if (this._ignoreBackdropClick) {
892
+ this._ignoreBackdropClick = false;
435
893
  return;
436
894
  }
437
895
 
438
- if (!animate) {
439
- callback();
896
+ if (event.target !== event.currentTarget) {
440
897
  return;
441
898
  }
442
899
 
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);
900
+ if (this._config.backdrop === true) {
901
+ this.hide();
902
+ } else if (this._config.backdrop === 'static') {
903
+ this._triggerBackdropTransition();
904
+ }
905
+ });
447
906
 
448
- var callbackRemove = function callbackRemove() {
449
- _this8._removeBackdrop();
907
+ this._backdrop.show(callback);
908
+ }
450
909
 
451
- if (callback) {
452
- callback();
453
- }
454
- };
910
+ _isAnimated() {
911
+ return this._element.classList.contains(CLASS_NAME_FADE);
912
+ }
455
913
 
456
- if ($(this._element).hasClass(ClassName.FADE)) {
457
- var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
914
+ _triggerBackdropTransition() {
915
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
458
916
 
459
- $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
460
- } else {
461
- callbackRemove();
462
- }
463
- } else if (callback) {
464
- callback();
917
+ if (hideEvent.defaultPrevented) {
918
+ return;
465
919
  }
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
920
 
472
- _proto._adjustDialog = function _adjustDialog() {
473
- var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
921
+ const {
922
+ classList,
923
+ scrollHeight,
924
+ style
925
+ } = this._element;
926
+ const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
474
927
 
475
- if (!this._isBodyOverflowing && isModalOverflowing) {
476
- this._element.style.paddingLeft = this._scrollbarWidth + "px";
928
+ if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
929
+ return;
477
930
  }
478
931
 
479
- if (this._isBodyOverflowing && !isModalOverflowing) {
480
- this._element.style.paddingRight = this._scrollbarWidth + "px";
932
+ if (!isModalOverflowing) {
933
+ style.overflowY = 'hidden';
481
934
  }
482
- };
483
935
 
484
- _proto._resetAdjustments = function _resetAdjustments() {
485
- this._element.style.paddingLeft = '';
486
- this._element.style.paddingRight = '';
487
- };
936
+ classList.add(CLASS_NAME_STATIC);
488
937
 
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
- };
938
+ this._queueCallback(() => {
939
+ classList.remove(CLASS_NAME_STATIC);
494
940
 
495
- _proto._setScrollbar = function _setScrollbar() {
496
- var _this9 = this;
941
+ if (!isModalOverflowing) {
942
+ this._queueCallback(() => {
943
+ style.overflowY = '';
944
+ }, this._dialog);
945
+ }
946
+ }, this._dialog);
497
947
 
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
948
+ this._element.focus();
949
+ } // ----------------------------------------------------------------------
950
+ // the following methods are used to handle overflowing modals
951
+ // ----------------------------------------------------------------------
503
952
 
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
953
 
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
954
+ _adjustDialog() {
955
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
515
956
 
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
- }
957
+ const scrollbarWidth = this._scrollBar.getWidth();
520
958
 
521
- $(document.body).addClass(ClassName.OPEN);
522
- };
959
+ const isBodyOverflowing = scrollbarWidth > 0;
523
960
 
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
961
+ if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
962
+ this._element.style.paddingLeft = `${scrollbarWidth}px`;
963
+ }
541
964
 
542
- var padding = $(document.body).data('padding-right');
543
- $(document.body).removeData('padding-right');
544
- document.body.style.paddingRight = padding ? padding : '';
545
- };
965
+ if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
966
+ this._element.style.paddingRight = `${scrollbarWidth}px`;
967
+ }
968
+ }
546
969
 
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;
970
+ _resetAdjustments() {
971
+ this._element.style.paddingLeft = '';
972
+ this._element.style.paddingRight = '';
555
973
  } // Static
556
- ;
557
974
 
558
- Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
559
- return this.each(function () {
560
- var data = $(this).data(DATA_KEY);
561
975
 
562
- var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {});
976
+ static jQueryInterface(config, relatedTarget) {
977
+ return this.each(function () {
978
+ const data = Modal.getOrCreateInstance(this, config);
563
979
 
564
- if (!data) {
565
- data = new Modal(this, _config);
566
- $(this).data(DATA_KEY, data);
980
+ if (typeof config !== 'string') {
981
+ return;
567
982
  }
568
983
 
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);
984
+ if (typeof data[config] === 'undefined') {
985
+ throw new TypeError(`No method named "${config}"`);
577
986
  }
578
- });
579
- };
580
987
 
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
- }]);
988
+ data[config](relatedTarget);
989
+ });
990
+ }
592
991
 
593
- return Modal;
594
- }();
992
+ }
595
993
  /**
596
994
  * ------------------------------------------------------------------------
597
995
  * Data Api implementation
@@ -599,50 +997,44 @@
599
997
  */
600
998
 
601
999
 
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);
607
-
608
- if (selector) {
609
- target = document.querySelector(selector);
610
- }
611
-
612
- var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());
1000
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1001
+ const target = getElementFromSelector(this);
613
1002
 
614
- if (this.tagName === 'A' || this.tagName === 'AREA') {
1003
+ if (['A', 'AREA'].includes(this.tagName)) {
615
1004
  event.preventDefault();
616
1005
  }
617
1006
 
618
- var $target = $(target).one(Event.SHOW, function (showEvent) {
619
- if (showEvent.isDefaultPrevented()) {
620
- // Only register focus restorer if modal will actually get shown
1007
+ EventHandler__default.default.one(target, EVENT_SHOW, showEvent => {
1008
+ if (showEvent.defaultPrevented) {
1009
+ // only register focus restorer if modal will actually get shown
621
1010
  return;
622
1011
  }
623
1012
 
624
- $target.one(Event.HIDDEN, function () {
625
- if ($(_this10).is(':visible')) {
626
- _this10.focus();
1013
+ EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
1014
+ if (isVisible(this)) {
1015
+ this.focus();
627
1016
  }
628
1017
  });
629
- });
1018
+ }); // avoid conflict when clicking moddal toggler while another one is open
1019
+
1020
+ const allReadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
1021
+
1022
+ if (allReadyOpen) {
1023
+ Modal.getInstance(allReadyOpen).hide();
1024
+ }
630
1025
 
631
- Modal._jQueryInterface.call($(target), config, this);
1026
+ const data = Modal.getOrCreateInstance(target);
1027
+ data.toggle(this);
632
1028
  });
1029
+ enableDismissTrigger(Modal);
633
1030
  /**
634
1031
  * ------------------------------------------------------------------------
635
1032
  * jQuery
636
1033
  * ------------------------------------------------------------------------
1034
+ * add .Modal to jQuery only if jQuery is present
637
1035
  */
638
1036
 
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
- };
1037
+ defineJQueryPlugin(Modal);
646
1038
 
647
1039
  return Modal;
648
1040