bootstrap 5.1.1 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/assets/javascripts/bootstrap/alert.js +18 -153
  4. data/assets/javascripts/bootstrap/base-component.js +44 -127
  5. data/assets/javascripts/bootstrap/button.js +16 -80
  6. data/assets/javascripts/bootstrap/carousel.js +225 -497
  7. data/assets/javascripts/bootstrap/collapse.js +79 -262
  8. data/assets/javascripts/bootstrap/dom/data.js +6 -8
  9. data/assets/javascripts/bootstrap/dom/event-handler.js +95 -133
  10. data/assets/javascripts/bootstrap/dom/manipulator.js +25 -29
  11. data/assets/javascripts/bootstrap/dom/selector-engine.js +17 -59
  12. data/assets/javascripts/bootstrap/dropdown.js +124 -342
  13. data/assets/javascripts/bootstrap/modal.js +122 -767
  14. data/assets/javascripts/bootstrap/offcanvas.js +102 -671
  15. data/assets/javascripts/bootstrap/popover.js +42 -124
  16. data/assets/javascripts/bootstrap/scrollspy.js +186 -269
  17. data/assets/javascripts/bootstrap/tab.js +222 -221
  18. data/assets/javascripts/bootstrap/toast.js +41 -227
  19. data/assets/javascripts/bootstrap/tooltip.js +283 -629
  20. data/assets/javascripts/bootstrap/util/backdrop.js +165 -0
  21. data/assets/javascripts/bootstrap/util/component-functions.js +46 -0
  22. data/assets/javascripts/bootstrap/util/config.js +79 -0
  23. data/assets/javascripts/bootstrap/util/focustrap.js +129 -0
  24. data/assets/javascripts/bootstrap/util/index.js +350 -0
  25. data/assets/javascripts/bootstrap/util/sanitizer.js +122 -0
  26. data/assets/javascripts/bootstrap/util/scrollbar.js +138 -0
  27. data/assets/javascripts/bootstrap/util/swipe.js +155 -0
  28. data/assets/javascripts/bootstrap/util/template-factory.js +177 -0
  29. data/assets/javascripts/bootstrap-global-this-define.js +1 -1
  30. data/assets/javascripts/bootstrap-sprockets.js +16 -7
  31. data/assets/javascripts/bootstrap.js +2094 -1891
  32. data/assets/javascripts/bootstrap.min.js +3 -3
  33. data/assets/stylesheets/_bootstrap-grid.scss +3 -6
  34. data/assets/stylesheets/_bootstrap-reboot.scss +3 -7
  35. data/assets/stylesheets/_bootstrap.scss +4 -6
  36. data/assets/stylesheets/bootstrap/_accordion.scss +52 -24
  37. data/assets/stylesheets/bootstrap/_alert.scss +18 -4
  38. data/assets/stylesheets/bootstrap/_badge.scss +14 -5
  39. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -10
  40. data/assets/stylesheets/bootstrap/_button-group.scss +3 -0
  41. data/assets/stylesheets/bootstrap/_buttons.scss +97 -22
  42. data/assets/stylesheets/bootstrap/_card.scss +55 -37
  43. data/assets/stylesheets/bootstrap/_close.scss +1 -1
  44. data/assets/stylesheets/bootstrap/_containers.scss +1 -1
  45. data/assets/stylesheets/bootstrap/_dropdown.scss +83 -75
  46. data/assets/stylesheets/bootstrap/_functions.scss +7 -7
  47. data/assets/stylesheets/bootstrap/_grid.scss +3 -3
  48. data/assets/stylesheets/bootstrap/_helpers.scss +1 -0
  49. data/assets/stylesheets/bootstrap/_list-group.scss +44 -27
  50. data/assets/stylesheets/bootstrap/_maps.scss +54 -0
  51. data/assets/stylesheets/bootstrap/_modal.scss +71 -43
  52. data/assets/stylesheets/bootstrap/_nav.scss +53 -20
  53. data/assets/stylesheets/bootstrap/_navbar.scss +91 -150
  54. data/assets/stylesheets/bootstrap/_offcanvas.scss +119 -59
  55. data/assets/stylesheets/bootstrap/_pagination.scss +66 -21
  56. data/assets/stylesheets/bootstrap/_placeholders.scss +1 -1
  57. data/assets/stylesheets/bootstrap/_popover.scss +90 -52
  58. data/assets/stylesheets/bootstrap/_progress.scss +20 -9
  59. data/assets/stylesheets/bootstrap/_reboot.scss +25 -40
  60. data/assets/stylesheets/bootstrap/_root.scss +40 -21
  61. data/assets/stylesheets/bootstrap/_spinners.scss +38 -22
  62. data/assets/stylesheets/bootstrap/_tables.scss +38 -25
  63. data/assets/stylesheets/bootstrap/_toasts.scss +35 -16
  64. data/assets/stylesheets/bootstrap/_tooltip.scss +61 -56
  65. data/assets/stylesheets/bootstrap/_type.scss +2 -0
  66. data/assets/stylesheets/bootstrap/_utilities.scss +43 -26
  67. data/assets/stylesheets/bootstrap/_variables.scss +118 -124
  68. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +3 -6
  69. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +14 -3
  70. data/assets/stylesheets/bootstrap/forms/_form-check.scss +28 -5
  71. data/assets/stylesheets/bootstrap/forms/_form-control.scss +12 -37
  72. data/assets/stylesheets/bootstrap/forms/_form-select.scss +2 -1
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +15 -7
  74. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +10 -0
  75. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
  76. data/assets/stylesheets/bootstrap/helpers/_position.scss +7 -1
  77. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
  78. data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
  79. data/assets/stylesheets/bootstrap/mixins/_alert.scss +7 -3
  80. data/assets/stylesheets/bootstrap/mixins/_banner.scss +9 -0
  81. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +8 -8
  82. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +32 -95
  83. data/assets/stylesheets/bootstrap/mixins/_container.scss +4 -2
  84. data/assets/stylesheets/bootstrap/mixins/_forms.scss +8 -0
  85. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
  86. data/assets/stylesheets/bootstrap/mixins/_grid.scss +13 -12
  87. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +4 -25
  88. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  89. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +12 -9
  90. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +12 -4
  91. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +1 -1
  92. data/bootstrap.gemspec +1 -1
  93. data/lib/bootstrap/version.rb +2 -2
  94. data/tasks/updater/js.rb +9 -4
  95. metadata +16 -4
@@ -1,622 +1,31 @@
1
1
  /*!
2
- * Bootstrap modal.js v5.1.1 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap modal.js v5.2.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/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';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./util/index'), require('./dom/event-handler'), require('./dom/selector-engine'), require('./util/scrollbar'), require('./base-component'), require('./util/backdrop'), require('./util/focustrap'), require('./util/component-functions')) :
8
+ typeof define === 'function' && define.amd ? define(['./util/index', './dom/event-handler', './dom/selector-engine', './util/scrollbar', './base-component', './util/backdrop', './util/focustrap', './util/component-functions'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.Index, global.EventHandler, global.SelectorEngine, global.Scrollbar, global.BaseComponent, global.Backdrop, global.Focustrap, global.ComponentFunctions));
10
+ })(this, (function (index, EventHandler, SelectorEngine, ScrollBarHelper, BaseComponent, Backdrop, FocusTrap, componentFunctions) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
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);
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
16
+ const ScrollBarHelper__default = /*#__PURE__*/_interopDefaultLegacy(ScrollBarHelper);
17
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
+ const Backdrop__default = /*#__PURE__*/_interopDefaultLegacy(Backdrop);
19
+ const FocusTrap__default = /*#__PURE__*/_interopDefaultLegacy(FocusTrap);
18
20
 
19
21
  /**
20
22
  * --------------------------------------------------------------------------
21
- * Bootstrap (v5.1.1): util/index.js
23
+ * Bootstrap (v5.2.0): modal.js
22
24
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
23
25
  * --------------------------------------------------------------------------
24
26
  */
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}`;
31
- }
32
-
33
- return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
34
- };
35
-
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
27
  /**
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);
191
- } else {
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.1): 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;
353
- }
354
-
355
- }
356
-
357
- /**
358
- * --------------------------------------------------------------------------
359
- * Bootstrap (v5.1.1): 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
- }
449
-
450
- _append() {
451
- if (this._isAppended) {
452
- return;
453
- }
454
-
455
- this._config.rootElement.append(this._getElement());
456
-
457
- EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
458
- execute(this._config.clickCallback);
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.1): 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.1): 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.1): modal.js
613
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
614
- * --------------------------------------------------------------------------
615
- */
616
- /**
617
- * ------------------------------------------------------------------------
618
28
  * Constants
619
- * ------------------------------------------------------------------------
620
29
  */
621
30
 
622
31
  const NAME = 'modal';
@@ -624,26 +33,14 @@
624
33
  const EVENT_KEY = `.${DATA_KEY}`;
625
34
  const DATA_API_KEY = '.data-api';
626
35
  const ESCAPE_KEY = 'Escape';
627
- const Default = {
628
- backdrop: true,
629
- keyboard: true,
630
- focus: true
631
- };
632
- const DefaultType = {
633
- backdrop: '(boolean|string)',
634
- keyboard: 'boolean',
635
- focus: 'boolean'
636
- };
637
36
  const EVENT_HIDE = `hide${EVENT_KEY}`;
638
37
  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
639
38
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
640
39
  const EVENT_SHOW = `show${EVENT_KEY}`;
641
40
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
642
41
  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
42
  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
43
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
647
44
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
648
45
  const CLASS_NAME_OPEN = 'modal-open';
649
46
  const CLASS_NAME_FADE = 'fade';
@@ -653,23 +50,31 @@
653
50
  const SELECTOR_DIALOG = '.modal-dialog';
654
51
  const SELECTOR_MODAL_BODY = '.modal-body';
655
52
  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
53
+ const Default = {
54
+ backdrop: true,
55
+ focus: true,
56
+ keyboard: true
57
+ };
58
+ const DefaultType = {
59
+ backdrop: '(boolean|string)',
60
+ focus: 'boolean',
61
+ keyboard: 'boolean'
62
+ };
656
63
  /**
657
- * ------------------------------------------------------------------------
658
- * Class Definition
659
- * ------------------------------------------------------------------------
64
+ * Class definition
660
65
  */
661
66
 
662
- class Modal extends BaseComponent__default['default'] {
67
+ class Modal extends BaseComponent__default.default {
663
68
  constructor(element, config) {
664
- super(element);
665
- this._config = this._getConfig(config);
666
- this._dialog = SelectorEngine__default['default'].findOne(SELECTOR_DIALOG, this._element);
69
+ super(element, config);
70
+ this._dialog = SelectorEngine__default.default.findOne(SELECTOR_DIALOG, this._element);
667
71
  this._backdrop = this._initializeBackDrop();
668
72
  this._focustrap = this._initializeFocusTrap();
669
73
  this._isShown = false;
670
- this._ignoreBackdropClick = false;
671
74
  this._isTransitioning = false;
672
- this._scrollBar = new ScrollBarHelper();
75
+ this._scrollBar = new ScrollBarHelper__default.default();
76
+
77
+ this._addEventListeners();
673
78
  } // Getters
674
79
 
675
80
 
@@ -677,6 +82,10 @@
677
82
  return Default;
678
83
  }
679
84
 
85
+ static get DefaultType() {
86
+ return DefaultType;
87
+ }
88
+
680
89
  static get NAME() {
681
90
  return NAME;
682
91
  } // Public
@@ -691,7 +100,7 @@
691
100
  return;
692
101
  }
693
102
 
694
- const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
103
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
695
104
  relatedTarget
696
105
  });
697
106
 
@@ -700,10 +109,7 @@
700
109
  }
701
110
 
702
111
  this._isShown = true;
703
-
704
- if (this._isAnimated()) {
705
- this._isTransitioning = true;
706
- }
112
+ this._isTransitioning = true;
707
113
 
708
114
  this._scrollBar.hide();
709
115
 
@@ -711,19 +117,7 @@
711
117
 
712
118
  this._adjustDialog();
713
119
 
714
- this._setEscapeEvent();
715
-
716
- this._setResizeEvent();
717
-
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;
722
- }
723
- });
724
- });
725
-
726
- this._showBackdrop(() => this._showElement(relatedTarget));
120
+ this._backdrop.show(() => this._showElement(relatedTarget));
727
121
  }
728
122
 
729
123
  hide() {
@@ -731,36 +125,26 @@
731
125
  return;
732
126
  }
733
127
 
734
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
128
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
735
129
 
736
130
  if (hideEvent.defaultPrevented) {
737
131
  return;
738
132
  }
739
133
 
740
134
  this._isShown = false;
741
-
742
- const isAnimated = this._isAnimated();
743
-
744
- if (isAnimated) {
745
- this._isTransitioning = true;
746
- }
747
-
748
- this._setEscapeEvent();
749
-
750
- this._setResizeEvent();
135
+ this._isTransitioning = true;
751
136
 
752
137
  this._focustrap.deactivate();
753
138
 
754
139
  this._element.classList.remove(CLASS_NAME_SHOW);
755
140
 
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);
141
+ this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
760
142
  }
761
143
 
762
144
  dispose() {
763
- [window, this._dialog].forEach(htmlElement => EventHandler__default['default'].off(htmlElement, EVENT_KEY));
145
+ for (const htmlElement of [window, this._dialog]) {
146
+ EventHandler__default.default.off(htmlElement, EVENT_KEY);
147
+ }
764
148
 
765
149
  this._backdrop.dispose();
766
150
 
@@ -775,35 +159,22 @@
775
159
 
776
160
 
777
161
  _initializeBackDrop() {
778
- return new Backdrop({
162
+ return new Backdrop__default.default({
779
163
  isVisible: Boolean(this._config.backdrop),
780
- // 'static' option will be translated to true, and booleans will keep their value
164
+ // 'static' option will be translated to true, and booleans will keep their value,
781
165
  isAnimated: this._isAnimated()
782
166
  });
783
167
  }
784
168
 
785
169
  _initializeFocusTrap() {
786
- return new FocusTrap({
170
+ return new FocusTrap__default.default({
787
171
  trapElement: this._element
788
172
  });
789
173
  }
790
174
 
791
- _getConfig(config) {
792
- config = { ...Default,
793
- ...Manipulator__default['default'].getDataAttributes(this._element),
794
- ...(typeof config === 'object' ? config : {})
795
- };
796
- typeCheckConfig(NAME, config, DefaultType);
797
- return config;
798
- }
799
-
800
175
  _showElement(relatedTarget) {
801
- const isAnimated = this._isAnimated();
802
-
803
- const modalBody = SelectorEngine__default['default'].findOne(SELECTOR_MODAL_BODY, this._dialog);
804
-
805
- if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
806
- // Don't move modal's DOM position
176
+ // try to append dynamic modal
177
+ if (!document.body.contains(this._element)) {
807
178
  document.body.append(this._element);
808
179
  }
809
180
 
@@ -816,14 +187,13 @@
816
187
  this._element.setAttribute('role', 'dialog');
817
188
 
818
189
  this._element.scrollTop = 0;
190
+ const modalBody = SelectorEngine__default.default.findOne(SELECTOR_MODAL_BODY, this._dialog);
819
191
 
820
192
  if (modalBody) {
821
193
  modalBody.scrollTop = 0;
822
194
  }
823
195
 
824
- if (isAnimated) {
825
- reflow(this._element);
826
- }
196
+ index.reflow(this._element);
827
197
 
828
198
  this._element.classList.add(CLASS_NAME_SHOW);
829
199
 
@@ -833,35 +203,49 @@
833
203
  }
834
204
 
835
205
  this._isTransitioning = false;
836
- EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
206
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
837
207
  relatedTarget
838
208
  });
839
209
  };
840
210
 
841
- this._queueCallback(transitionComplete, this._dialog, isAnimated);
211
+ this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
842
212
  }
843
213
 
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) {
848
- event.preventDefault();
849
- this.hide();
850
- } else if (!this._config.keyboard && event.key === ESCAPE_KEY) {
851
- this._triggerBackdropTransition();
852
- }
853
- });
854
- } else {
855
- EventHandler__default['default'].off(this._element, EVENT_KEYDOWN_DISMISS);
856
- }
857
- }
214
+ _addEventListeners() {
215
+ EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
216
+ if (event.key !== ESCAPE_KEY) {
217
+ return;
218
+ }
858
219
 
859
- _setResizeEvent() {
860
- if (this._isShown) {
861
- EventHandler__default['default'].on(window, EVENT_RESIZE, () => this._adjustDialog());
862
- } else {
863
- EventHandler__default['default'].off(window, EVENT_RESIZE);
864
- }
220
+ if (this._config.keyboard) {
221
+ event.preventDefault();
222
+ this.hide();
223
+ return;
224
+ }
225
+
226
+ this._triggerBackdropTransition();
227
+ });
228
+ EventHandler__default.default.on(window, EVENT_RESIZE, () => {
229
+ if (this._isShown && !this._isTransitioning) {
230
+ this._adjustDialog();
231
+ }
232
+ });
233
+ EventHandler__default.default.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
234
+ if (event.target !== event.currentTarget) {
235
+ // click is inside modal-dialog
236
+ return;
237
+ }
238
+
239
+ if (this._config.backdrop === 'static') {
240
+ this._triggerBackdropTransition();
241
+
242
+ return;
243
+ }
244
+
245
+ if (this._config.backdrop) {
246
+ this.hide();
247
+ }
248
+ });
865
249
  }
866
250
 
867
251
  _hideModal() {
@@ -882,73 +266,47 @@
882
266
 
883
267
  this._scrollBar.reset();
884
268
 
885
- EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
269
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
886
270
  });
887
271
  }
888
272
 
889
- _showBackdrop(callback) {
890
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, event => {
891
- if (this._ignoreBackdropClick) {
892
- this._ignoreBackdropClick = false;
893
- return;
894
- }
895
-
896
- if (event.target !== event.currentTarget) {
897
- return;
898
- }
899
-
900
- if (this._config.backdrop === true) {
901
- this.hide();
902
- } else if (this._config.backdrop === 'static') {
903
- this._triggerBackdropTransition();
904
- }
905
- });
906
-
907
- this._backdrop.show(callback);
908
- }
909
-
910
273
  _isAnimated() {
911
274
  return this._element.classList.contains(CLASS_NAME_FADE);
912
275
  }
913
276
 
914
277
  _triggerBackdropTransition() {
915
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE_PREVENTED);
278
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
916
279
 
917
280
  if (hideEvent.defaultPrevented) {
918
281
  return;
919
282
  }
920
283
 
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
284
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
285
+ const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed
927
286
 
928
- if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
287
+ if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
929
288
  return;
930
289
  }
931
290
 
932
291
  if (!isModalOverflowing) {
933
- style.overflowY = 'hidden';
292
+ this._element.style.overflowY = 'hidden';
934
293
  }
935
294
 
936
- classList.add(CLASS_NAME_STATIC);
295
+ this._element.classList.add(CLASS_NAME_STATIC);
937
296
 
938
297
  this._queueCallback(() => {
939
- classList.remove(CLASS_NAME_STATIC);
298
+ this._element.classList.remove(CLASS_NAME_STATIC);
940
299
 
941
- if (!isModalOverflowing) {
942
- this._queueCallback(() => {
943
- style.overflowY = '';
944
- }, this._dialog);
945
- }
300
+ this._queueCallback(() => {
301
+ this._element.style.overflowY = initialOverflowY;
302
+ }, this._dialog);
946
303
  }, this._dialog);
947
304
 
948
305
  this._element.focus();
949
- } // ----------------------------------------------------------------------
950
- // the following methods are used to handle overflowing modals
951
- // ----------------------------------------------------------------------
306
+ }
307
+ /**
308
+ * The following methods are used to handle overflowing modals
309
+ */
952
310
 
953
311
 
954
312
  _adjustDialog() {
@@ -958,12 +316,14 @@
958
316
 
959
317
  const isBodyOverflowing = scrollbarWidth > 0;
960
318
 
961
- if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
962
- this._element.style.paddingLeft = `${scrollbarWidth}px`;
319
+ if (isBodyOverflowing && !isModalOverflowing) {
320
+ const property = index.isRTL() ? 'paddingLeft' : 'paddingRight';
321
+ this._element.style[property] = `${scrollbarWidth}px`;
963
322
  }
964
323
 
965
- if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
966
- this._element.style.paddingRight = `${scrollbarWidth}px`;
324
+ if (!isBodyOverflowing && isModalOverflowing) {
325
+ const property = index.isRTL() ? 'paddingRight' : 'paddingLeft';
326
+ this._element.style[property] = `${scrollbarWidth}px`;
967
327
  }
968
328
  }
969
329
 
@@ -991,51 +351,46 @@
991
351
 
992
352
  }
993
353
  /**
994
- * ------------------------------------------------------------------------
995
- * Data Api implementation
996
- * ------------------------------------------------------------------------
354
+ * Data API implementation
997
355
  */
998
356
 
999
357
 
1000
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1001
- const target = getElementFromSelector(this);
358
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
359
+ const target = index.getElementFromSelector(this);
1002
360
 
1003
361
  if (['A', 'AREA'].includes(this.tagName)) {
1004
362
  event.preventDefault();
1005
363
  }
1006
364
 
1007
- EventHandler__default['default'].one(target, EVENT_SHOW, showEvent => {
365
+ EventHandler__default.default.one(target, EVENT_SHOW, showEvent => {
1008
366
  if (showEvent.defaultPrevented) {
1009
367
  // only register focus restorer if modal will actually get shown
1010
368
  return;
1011
369
  }
1012
370
 
1013
- EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
1014
- if (isVisible(this)) {
371
+ EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
372
+ if (index.isVisible(this)) {
1015
373
  this.focus();
1016
374
  }
1017
375
  });
1018
- }); // avoid conflict when clicking moddal toggler while another one is open
376
+ }); // avoid conflict when clicking modal toggler while another one is open
1019
377
 
1020
- const allReadyOpen = SelectorEngine__default['default'].findOne(OPEN_SELECTOR);
378
+ const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
1021
379
 
1022
- if (allReadyOpen) {
1023
- Modal.getInstance(allReadyOpen).hide();
380
+ if (alreadyOpen) {
381
+ Modal.getInstance(alreadyOpen).hide();
1024
382
  }
1025
383
 
1026
384
  const data = Modal.getOrCreateInstance(target);
1027
385
  data.toggle(this);
1028
386
  });
1029
- enableDismissTrigger(Modal);
387
+ componentFunctions.enableDismissTrigger(Modal);
1030
388
  /**
1031
- * ------------------------------------------------------------------------
1032
389
  * jQuery
1033
- * ------------------------------------------------------------------------
1034
- * add .Modal to jQuery only if jQuery is present
1035
390
  */
1036
391
 
1037
- defineJQueryPlugin(Modal);
392
+ index.defineJQueryPlugin(Modal);
1038
393
 
1039
394
  return Modal;
1040
395
 
1041
- })));
396
+ }));