bootstrap 4.3.1 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +55 -0
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +28 -5
  5. data/assets/javascripts/bootstrap/alert.js +54 -163
  6. data/assets/javascripts/bootstrap/base-component.js +83 -0
  7. data/assets/javascripts/bootstrap/button.js +44 -152
  8. data/assets/javascripts/bootstrap/carousel.js +289 -569
  9. data/assets/javascripts/bootstrap/collapse.js +170 -349
  10. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  12. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  13. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  14. data/assets/javascripts/bootstrap/dropdown.js +303 -496
  15. data/assets/javascripts/bootstrap/modal.js +229 -559
  16. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  17. data/assets/javascripts/bootstrap/popover.js +61 -226
  18. data/assets/javascripts/bootstrap/scrollspy.js +217 -317
  19. data/assets/javascripts/bootstrap/tab.js +220 -212
  20. data/assets/javascripts/bootstrap/toast.js +145 -229
  21. data/assets/javascripts/bootstrap/tooltip.js +421 -782
  22. data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
  23. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  24. data/assets/javascripts/bootstrap/util/config.js +67 -0
  25. data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
  26. data/assets/javascripts/bootstrap/util/index.js +281 -0
  27. data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
  28. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  29. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  30. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  31. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  32. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  33. data/assets/javascripts/bootstrap-sprockets.js +23 -7
  34. data/assets/javascripts/bootstrap.js +3690 -3639
  35. data/assets/javascripts/bootstrap.min.js +4 -4
  36. data/assets/stylesheets/_bootstrap-grid.scss +53 -20
  37. data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
  38. data/assets/stylesheets/_bootstrap.scss +21 -13
  39. data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
  40. data/assets/stylesheets/bootstrap/_alert.scss +32 -15
  41. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  42. data/assets/stylesheets/bootstrap/_breadcrumb.scss +23 -24
  43. data/assets/stylesheets/bootstrap/_button-group.scss +27 -48
  44. data/assets/stylesheets/bootstrap/_buttons.scss +139 -69
  45. data/assets/stylesheets/bootstrap/_card.scss +91 -141
  46. data/assets/stylesheets/bootstrap/_carousel.scss +86 -39
  47. data/assets/stylesheets/bootstrap/_close.scss +51 -29
  48. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  49. data/assets/stylesheets/bootstrap/_dropdown.scss +131 -72
  50. data/assets/stylesheets/bootstrap/_forms.scss +9 -330
  51. data/assets/stylesheets/bootstrap/_functions.scss +244 -28
  52. data/assets/stylesheets/bootstrap/_grid.scss +18 -31
  53. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  54. data/assets/stylesheets/bootstrap/_images.scss +3 -3
  55. data/assets/stylesheets/bootstrap/_list-group.scss +101 -53
  56. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  57. data/assets/stylesheets/bootstrap/_mixins.scss +13 -18
  58. data/assets/stylesheets/bootstrap/_modal.scss +120 -112
  59. data/assets/stylesheets/bootstrap/_nav.scss +113 -24
  60. data/assets/stylesheets/bootstrap/_navbar.scss +145 -150
  61. data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
  62. data/assets/stylesheets/bootstrap/_pagination.scss +74 -38
  63. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  64. data/assets/stylesheets/bootstrap/_popover.scss +99 -74
  65. data/assets/stylesheets/bootstrap/_progress.scss +40 -15
  66. data/assets/stylesheets/bootstrap/_reboot.scss +342 -215
  67. data/assets/stylesheets/bootstrap/_root.scss +174 -9
  68. data/assets/stylesheets/bootstrap/_spinners.scss +52 -22
  69. data/assets/stylesheets/bootstrap/_tables.scss +101 -115
  70. data/assets/stylesheets/bootstrap/_toasts.scss +54 -25
  71. data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
  72. data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
  73. data/assets/stylesheets/bootstrap/_type.scss +42 -61
  74. data/assets/stylesheets/bootstrap/_utilities.scss +806 -17
  75. data/assets/stylesheets/bootstrap/_variables-dark.scss +85 -0
  76. data/assets/stylesheets/bootstrap/_variables.scss +1235 -615
  77. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +19 -0
  78. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +94 -0
  79. data/assets/stylesheets/bootstrap/forms/_form-check.scss +188 -0
  80. data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
  81. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  82. data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
  83. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  84. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  85. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  86. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  87. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +8 -0
  88. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
  89. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  90. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  91. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  92. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  93. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  94. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  95. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  96. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  97. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  98. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
  99. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  100. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  101. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  102. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  103. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
  104. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -97
  105. data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
  106. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  107. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  108. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  109. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  110. data/assets/stylesheets/bootstrap/mixins/_forms.scss +77 -116
  111. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  112. data/assets/stylesheets/bootstrap/mixins/_grid.scss +133 -33
  113. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  114. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
  115. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
  116. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  117. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  118. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  119. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  120. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
  121. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  122. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +276 -132
  123. data/bootstrap.gemspec +4 -6
  124. data/lib/bootstrap/version.rb +2 -2
  125. data/tasks/updater/js.rb +31 -7
  126. data/tasks/updater/network.rb +10 -4
  127. data/tasks/updater/scss.rb +1 -1
  128. data/tasks/updater.rb +2 -2
  129. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  130. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  131. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  132. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  133. data/test/dummy_rails/app/views/pages/root.html +89 -0
  134. data/test/dummy_rails/config/application.rb +0 -3
  135. data/test/gemfiles/rails_5_2.gemfile +8 -0
  136. data/test/gemfiles/rails_6_0.gemfile +7 -0
  137. data/test/gemfiles/rails_6_1.gemfile +7 -0
  138. data/test/gemfiles/rails_7_0.gemfile +7 -0
  139. data/test/support/dummy_rails_integration.rb +3 -1
  140. data/test/test_helper.rb +18 -12
  141. metadata +86 -84
  142. data/.travis.yml +0 -17
  143. data/assets/javascripts/bootstrap/util.js +0 -171
  144. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  145. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -507
  146. data/assets/stylesheets/bootstrap/_input-group.scss +0 -193
  147. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  148. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  149. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  150. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  151. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  152. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  153. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -66
  154. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  155. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  156. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  157. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  158. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  159. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -16
  160. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  161. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  162. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  163. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  164. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  165. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  166. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  167. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  168. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  169. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  170. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  171. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  172. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  173. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  174. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  175. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  176. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  177. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  178. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  179. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,648 +1,318 @@
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.3.0 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 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';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));
10
+ })(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';
11
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);
22
- }
23
- }
24
-
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
30
-
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
- });
39
- } else {
40
- obj[key] = value;
41
- }
42
-
43
- return obj;
44
- }
45
-
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);
50
-
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
55
- }
56
-
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
59
- });
60
- }
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap modal.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
61
18
 
62
- return target;
63
- }
64
19
 
65
20
  /**
66
- * ------------------------------------------------------------------------
67
21
  * Constants
68
- * ------------------------------------------------------------------------
69
22
  */
70
23
 
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 = {
24
+ const NAME = 'modal';
25
+ const DATA_KEY = 'bs.modal';
26
+ const EVENT_KEY = `.${DATA_KEY}`;
27
+ const DATA_API_KEY = '.data-api';
28
+ const ESCAPE_KEY = 'Escape';
29
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
30
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
31
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
32
+ const EVENT_SHOW = `show${EVENT_KEY}`;
33
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
34
+ const EVENT_RESIZE = `resize${EVENT_KEY}`;
35
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
36
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;
37
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
38
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
39
+ const CLASS_NAME_OPEN = 'modal-open';
40
+ const CLASS_NAME_FADE = 'fade';
41
+ const CLASS_NAME_SHOW = 'show';
42
+ const CLASS_NAME_STATIC = 'modal-static';
43
+ const OPEN_SELECTOR = '.modal.show';
44
+ const SELECTOR_DIALOG = '.modal-dialog';
45
+ const SELECTOR_MODAL_BODY = '.modal-body';
46
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]';
47
+ const Default = {
80
48
  backdrop: true,
81
- keyboard: true,
82
49
  focus: true,
83
- show: true
50
+ keyboard: true
84
51
  };
85
- var DefaultType = {
52
+ const DefaultType = {
86
53
  backdrop: '(boolean|string)',
87
- keyboard: 'boolean',
88
54
  focus: 'boolean',
89
- show: 'boolean'
55
+ keyboard: 'boolean'
90
56
  };
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
57
 
125
- };
58
+ /**
59
+ * Class definition
60
+ */
126
61
 
127
- var Modal =
128
- /*#__PURE__*/
129
- function () {
130
- function Modal(element, config) {
131
- this._config = this._getConfig(config);
132
- this._element = element;
133
- this._dialog = element.querySelector(Selector.DIALOG);
134
- this._backdrop = null;
62
+ class Modal extends BaseComponent {
63
+ constructor(element, config) {
64
+ super(element, config);
65
+ this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
66
+ this._backdrop = this._initializeBackDrop();
67
+ this._focustrap = this._initializeFocusTrap();
135
68
  this._isShown = false;
136
- this._isBodyOverflowing = false;
137
- this._ignoreBackdropClick = false;
138
69
  this._isTransitioning = false;
139
- this._scrollbarWidth = 0;
140
- } // Getters
141
-
70
+ this._scrollBar = new ScrollBarHelper();
71
+ this._addEventListeners();
72
+ }
142
73
 
143
- var _proto = Modal.prototype;
74
+ // Getters
75
+ static get Default() {
76
+ return Default;
77
+ }
78
+ static get DefaultType() {
79
+ return DefaultType;
80
+ }
81
+ static get NAME() {
82
+ return NAME;
83
+ }
144
84
 
145
85
  // Public
146
- _proto.toggle = function toggle(relatedTarget) {
86
+ toggle(relatedTarget) {
147
87
  return this._isShown ? this.hide() : this.show(relatedTarget);
148
- };
149
-
150
- _proto.show = function show(relatedTarget) {
151
- var _this = this;
152
-
88
+ }
89
+ show(relatedTarget) {
153
90
  if (this._isShown || this._isTransitioning) {
154
91
  return;
155
92
  }
156
-
157
- if ($(this._element).hasClass(ClassName.FADE)) {
158
- this._isTransitioning = true;
159
- }
160
-
161
- var showEvent = $.Event(Event.SHOW, {
162
- relatedTarget: relatedTarget
93
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
94
+ relatedTarget
163
95
  });
164
- $(this._element).trigger(showEvent);
165
-
166
- if (this._isShown || showEvent.isDefaultPrevented()) {
96
+ if (showEvent.defaultPrevented) {
167
97
  return;
168
98
  }
169
-
170
99
  this._isShown = true;
171
-
172
- this._checkScrollbar();
173
-
174
- this._setScrollbar();
175
-
100
+ this._isTransitioning = true;
101
+ this._scrollBar.hide();
102
+ document.body.classList.add(CLASS_NAME_OPEN);
176
103
  this._adjustDialog();
177
-
178
- this._setEscapeEvent();
179
-
180
- this._setResizeEvent();
181
-
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;
189
- }
190
- });
191
- });
192
-
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
- }
204
-
104
+ this._backdrop.show(() => this._showElement(relatedTarget));
105
+ }
106
+ hide() {
205
107
  if (!this._isShown || this._isTransitioning) {
206
108
  return;
207
109
  }
208
-
209
- var hideEvent = $.Event(Event.HIDE);
210
- $(this._element).trigger(hideEvent);
211
-
212
- if (!this._isShown || hideEvent.isDefaultPrevented()) {
110
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
111
+ if (hideEvent.defaultPrevented) {
213
112
  return;
214
113
  }
215
-
216
114
  this._isShown = false;
217
- var transition = $(this._element).hasClass(ClassName.FADE);
218
-
219
- if (transition) {
220
- this._isTransitioning = true;
221
- }
222
-
223
- this._setEscapeEvent();
224
-
225
- this._setResizeEvent();
226
-
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);
231
-
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
- };
241
-
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
- };
264
-
265
- _proto.handleUpdate = function handleUpdate() {
115
+ this._isTransitioning = true;
116
+ this._focustrap.deactivate();
117
+ this._element.classList.remove(CLASS_NAME_SHOW);
118
+ this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
119
+ }
120
+ dispose() {
121
+ EventHandler.off(window, EVENT_KEY);
122
+ EventHandler.off(this._dialog, EVENT_KEY);
123
+ this._backdrop.dispose();
124
+ this._focustrap.deactivate();
125
+ super.dispose();
126
+ }
127
+ handleUpdate() {
266
128
  this._adjustDialog();
267
- } // Private
268
- ;
269
-
270
- _proto._getConfig = function _getConfig(config) {
271
- config = _objectSpread({}, Default, config);
272
- Util.typeCheckConfig(NAME, config, DefaultType);
273
- return config;
274
- };
275
-
276
- _proto._showElement = function _showElement(relatedTarget) {
277
- var _this3 = this;
278
-
279
- var transition = $(this._element).hasClass(ClassName.FADE);
129
+ }
280
130
 
281
- if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
282
- // Don't move modal's DOM position
283
- document.body.appendChild(this._element);
131
+ // Private
132
+ _initializeBackDrop() {
133
+ return new Backdrop({
134
+ isVisible: Boolean(this._config.backdrop),
135
+ // 'static' option will be translated to true, and booleans will keep their value,
136
+ isAnimated: this._isAnimated()
137
+ });
138
+ }
139
+ _initializeFocusTrap() {
140
+ return new FocusTrap({
141
+ trapElement: this._element
142
+ });
143
+ }
144
+ _showElement(relatedTarget) {
145
+ // try to append dynamic modal
146
+ if (!document.body.contains(this._element)) {
147
+ document.body.append(this._element);
284
148
  }
285
-
286
149
  this._element.style.display = 'block';
287
-
288
150
  this._element.removeAttribute('aria-hidden');
289
-
290
151
  this._element.setAttribute('aria-modal', true);
291
-
292
- if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {
293
- this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0;
294
- } else {
295
- this._element.scrollTop = 0;
152
+ this._element.setAttribute('role', 'dialog');
153
+ this._element.scrollTop = 0;
154
+ const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
155
+ if (modalBody) {
156
+ modalBody.scrollTop = 0;
296
157
  }
297
-
298
- if (transition) {
299
- Util.reflow(this._element);
300
- }
301
-
302
- $(this._element).addClass(ClassName.SHOW);
303
-
304
- if (this._config.focus) {
305
- this._enforceFocus();
306
- }
307
-
308
- var shownEvent = $.Event(Event.SHOWN, {
309
- relatedTarget: relatedTarget
310
- });
311
-
312
- var transitionComplete = function transitionComplete() {
313
- if (_this3._config.focus) {
314
- _this3._element.focus();
158
+ index_js.reflow(this._element);
159
+ this._element.classList.add(CLASS_NAME_SHOW);
160
+ const transitionComplete = () => {
161
+ if (this._config.focus) {
162
+ this._focustrap.activate();
315
163
  }
316
-
317
- _this3._isTransitioning = false;
318
- $(_this3._element).trigger(shownEvent);
164
+ this._isTransitioning = false;
165
+ EventHandler.trigger(this._element, EVENT_SHOWN, {
166
+ relatedTarget
167
+ });
319
168
  };
320
-
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();
169
+ this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
170
+ }
171
+ _addEventListeners() {
172
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
173
+ if (event.key !== ESCAPE_KEY) {
174
+ return;
336
175
  }
176
+ if (this._config.keyboard) {
177
+ this.hide();
178
+ return;
179
+ }
180
+ this._triggerBackdropTransition();
337
181
  });
338
- };
339
-
340
- _proto._setEscapeEvent = function _setEscapeEvent() {
341
- var _this5 = this;
342
-
343
- if (this._isShown && this._config.keyboard) {
344
- $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
345
- if (event.which === ESCAPE_KEYCODE) {
346
- event.preventDefault();
347
-
348
- _this5.hide();
182
+ EventHandler.on(window, EVENT_RESIZE, () => {
183
+ if (this._isShown && !this._isTransitioning) {
184
+ this._adjustDialog();
185
+ }
186
+ });
187
+ EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
188
+ // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
189
+ EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
190
+ if (this._element !== event.target || this._element !== event2.target) {
191
+ return;
192
+ }
193
+ if (this._config.backdrop === 'static') {
194
+ this._triggerBackdropTransition();
195
+ return;
196
+ }
197
+ if (this._config.backdrop) {
198
+ this.hide();
349
199
  }
350
200
  });
351
- } else if (!this._isShown) {
352
- $(this._element).off(Event.KEYDOWN_DISMISS);
353
- }
354
- };
355
-
356
- _proto._setResizeEvent = function _setResizeEvent() {
357
- var _this6 = this;
358
-
359
- if (this._isShown) {
360
- $(window).on(Event.RESIZE, function (event) {
361
- return _this6.handleUpdate(event);
362
- });
363
- } else {
364
- $(window).off(Event.RESIZE);
365
- }
366
- };
367
-
368
- _proto._hideModal = function _hideModal() {
369
- var _this7 = this;
370
-
201
+ });
202
+ }
203
+ _hideModal() {
371
204
  this._element.style.display = 'none';
372
-
373
205
  this._element.setAttribute('aria-hidden', true);
374
-
375
206
  this._element.removeAttribute('aria-modal');
376
-
207
+ this._element.removeAttribute('role');
377
208
  this._isTransitioning = false;
378
-
379
- this._showBackdrop(function () {
380
- $(document.body).removeClass(ClassName.OPEN);
381
-
382
- _this7._resetAdjustments();
383
-
384
- _this7._resetScrollbar();
385
-
386
- $(_this7._element).trigger(Event.HIDDEN);
209
+ this._backdrop.hide(() => {
210
+ document.body.classList.remove(CLASS_NAME_OPEN);
211
+ this._resetAdjustments();
212
+ this._scrollBar.reset();
213
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
387
214
  });
388
- };
389
-
390
- _proto._removeBackdrop = function _removeBackdrop() {
391
- if (this._backdrop) {
392
- $(this._backdrop).remove();
393
- this._backdrop = null;
215
+ }
216
+ _isAnimated() {
217
+ return this._element.classList.contains(CLASS_NAME_FADE);
218
+ }
219
+ _triggerBackdropTransition() {
220
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
221
+ if (hideEvent.defaultPrevented) {
222
+ return;
394
223
  }
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);
433
-
434
- if (!callback) {
435
- return;
436
- }
437
-
438
- if (!animate) {
439
- callback();
440
- return;
441
- }
442
-
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);
447
-
448
- var callbackRemove = function callbackRemove() {
449
- _this8._removeBackdrop();
450
-
451
- if (callback) {
452
- callback();
453
- }
454
- };
455
-
456
- if ($(this._element).hasClass(ClassName.FADE)) {
457
- var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
458
-
459
- $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
460
- } else {
461
- callbackRemove();
462
- }
463
- } else if (callback) {
464
- callback();
224
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
225
+ const initialOverflowY = this._element.style.overflowY;
226
+ // return if the following background transition hasn't yet completed
227
+ if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
228
+ return;
465
229
  }
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
- ;
230
+ if (!isModalOverflowing) {
231
+ this._element.style.overflowY = 'hidden';
232
+ }
233
+ this._element.classList.add(CLASS_NAME_STATIC);
234
+ this._queueCallback(() => {
235
+ this._element.classList.remove(CLASS_NAME_STATIC);
236
+ this._queueCallback(() => {
237
+ this._element.style.overflowY = initialOverflowY;
238
+ }, this._dialog);
239
+ }, this._dialog);
240
+ this._element.focus();
241
+ }
471
242
 
472
- _proto._adjustDialog = function _adjustDialog() {
473
- var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
243
+ /**
244
+ * The following methods are used to handle overflowing modals
245
+ */
474
246
 
475
- if (!this._isBodyOverflowing && isModalOverflowing) {
476
- this._element.style.paddingLeft = this._scrollbarWidth + "px";
247
+ _adjustDialog() {
248
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
249
+ const scrollbarWidth = this._scrollBar.getWidth();
250
+ const isBodyOverflowing = scrollbarWidth > 0;
251
+ if (isBodyOverflowing && !isModalOverflowing) {
252
+ const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight';
253
+ this._element.style[property] = `${scrollbarWidth}px`;
477
254
  }
478
-
479
- if (this._isBodyOverflowing && !isModalOverflowing) {
480
- this._element.style.paddingRight = this._scrollbarWidth + "px";
255
+ if (!isBodyOverflowing && isModalOverflowing) {
256
+ const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';
257
+ this._element.style[property] = `${scrollbarWidth}px`;
481
258
  }
482
- };
483
-
484
- _proto._resetAdjustments = function _resetAdjustments() {
259
+ }
260
+ _resetAdjustments() {
485
261
  this._element.style.paddingLeft = '';
486
262
  this._element.style.paddingRight = '';
487
- };
488
-
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
- };
494
-
495
- _proto._setScrollbar = function _setScrollbar() {
496
- var _this9 = this;
497
-
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
503
-
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
-
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
515
-
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
- }
520
-
521
- $(document.body).addClass(ClassName.OPEN);
522
- };
523
-
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
541
-
542
- var padding = $(document.body).data('padding-right');
543
- $(document.body).removeData('padding-right');
544
- document.body.style.paddingRight = padding ? padding : '';
545
- };
546
-
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;
555
- } // Static
556
- ;
263
+ }
557
264
 
558
- Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
265
+ // Static
266
+ static jQueryInterface(config, relatedTarget) {
559
267
  return this.each(function () {
560
- var data = $(this).data(DATA_KEY);
561
-
562
- var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {});
563
-
564
- if (!data) {
565
- data = new Modal(this, _config);
566
- $(this).data(DATA_KEY, data);
268
+ const data = Modal.getOrCreateInstance(this, config);
269
+ if (typeof config !== 'string') {
270
+ return;
567
271
  }
568
-
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);
272
+ if (typeof data[config] === 'undefined') {
273
+ throw new TypeError(`No method named "${config}"`);
577
274
  }
275
+ data[config](relatedTarget);
578
276
  });
579
- };
580
-
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
- }]);
277
+ }
278
+ }
592
279
 
593
- return Modal;
594
- }();
595
280
  /**
596
- * ------------------------------------------------------------------------
597
- * Data Api implementation
598
- * ------------------------------------------------------------------------
281
+ * Data API implementation
599
282
  */
600
283
 
601
-
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());
613
-
614
- if (this.tagName === 'A' || this.tagName === 'AREA') {
284
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
285
+ const target = SelectorEngine.getElementFromSelector(this);
286
+ if (['A', 'AREA'].includes(this.tagName)) {
615
287
  event.preventDefault();
616
288
  }
617
-
618
- var $target = $(target).one(Event.SHOW, function (showEvent) {
619
- if (showEvent.isDefaultPrevented()) {
620
- // Only register focus restorer if modal will actually get shown
289
+ EventHandler.one(target, EVENT_SHOW, showEvent => {
290
+ if (showEvent.defaultPrevented) {
291
+ // only register focus restorer if modal will actually get shown
621
292
  return;
622
293
  }
623
-
624
- $target.one(Event.HIDDEN, function () {
625
- if ($(_this10).is(':visible')) {
626
- _this10.focus();
294
+ EventHandler.one(target, EVENT_HIDDEN, () => {
295
+ if (index_js.isVisible(this)) {
296
+ this.focus();
627
297
  }
628
298
  });
629
299
  });
630
300
 
631
- Modal._jQueryInterface.call($(target), config, this);
301
+ // avoid conflict when clicking modal toggler while another one is open
302
+ const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
303
+ if (alreadyOpen) {
304
+ Modal.getInstance(alreadyOpen).hide();
305
+ }
306
+ const data = Modal.getOrCreateInstance(target);
307
+ data.toggle(this);
632
308
  });
309
+ componentFunctions_js.enableDismissTrigger(Modal);
310
+
633
311
  /**
634
- * ------------------------------------------------------------------------
635
312
  * jQuery
636
- * ------------------------------------------------------------------------
637
313
  */
638
314
 
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
- };
315
+ index_js.defineJQueryPlugin(Modal);
646
316
 
647
317
  return Modal;
648
318