bootstrap 4.6.2.1 → 5.3.5

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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/CHANGELOG.md +7 -2
  4. data/Gemfile +1 -0
  5. data/README.md +33 -15
  6. data/Rakefile +1 -2
  7. data/assets/javascripts/bootstrap/alert.js +50 -147
  8. data/assets/javascripts/bootstrap/base-component.js +83 -0
  9. data/assets/javascripts/bootstrap/button.js +40 -190
  10. data/assets/javascripts/bootstrap/carousel.js +282 -537
  11. data/assets/javascripts/bootstrap/collapse.js +166 -314
  12. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  13. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  14. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  15. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  16. data/assets/javascripts/bootstrap/dropdown.js +297 -455
  17. data/assets/javascripts/bootstrap/modal.js +223 -566
  18. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  19. data/assets/javascripts/bootstrap/popover.js +59 -208
  20. data/assets/javascripts/bootstrap/scrollspy.js +213 -276
  21. data/assets/javascripts/bootstrap/tab.js +222 -200
  22. data/assets/javascripts/bootstrap/toast.js +137 -206
  23. data/assets/javascripts/bootstrap/tooltip.js +403 -747
  24. data/assets/javascripts/bootstrap/util/backdrop.js +138 -0
  25. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  26. data/assets/javascripts/bootstrap/util/config.js +67 -0
  27. data/assets/javascripts/bootstrap/util/focustrap.js +112 -0
  28. data/assets/javascripts/bootstrap/util/index.js +280 -0
  29. data/assets/javascripts/bootstrap/util/sanitizer.js +113 -0
  30. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  31. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  32. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  33. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  34. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  35. data/assets/javascripts/bootstrap-sprockets.js +21 -5
  36. data/assets/javascripts/bootstrap.js +3625 -3488
  37. data/assets/javascripts/bootstrap.min.js +3 -3
  38. data/assets/stylesheets/_bootstrap-grid.scss +53 -21
  39. data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
  40. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  41. data/assets/stylesheets/_bootstrap.scss +21 -13
  42. data/assets/stylesheets/bootstrap/_accordion.scss +153 -0
  43. data/assets/stylesheets/bootstrap/_alert.scss +32 -16
  44. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  45. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -24
  46. data/assets/stylesheets/bootstrap/_button-group.scss +32 -48
  47. data/assets/stylesheets/bootstrap/_buttons.scss +145 -71
  48. data/assets/stylesheets/bootstrap/_card.scss +67 -115
  49. data/assets/stylesheets/bootstrap/_carousel.scss +63 -37
  50. data/assets/stylesheets/bootstrap/_close.scss +53 -27
  51. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  52. data/assets/stylesheets/bootstrap/_dropdown.scss +129 -71
  53. data/assets/stylesheets/bootstrap/_forms.scss +9 -347
  54. data/assets/stylesheets/bootstrap/_functions.scss +135 -23
  55. data/assets/stylesheets/bootstrap/_grid.scss +18 -52
  56. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  57. data/assets/stylesheets/bootstrap/_list-group.scss +93 -48
  58. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  59. data/assets/stylesheets/bootstrap/_mixins.scss +10 -15
  60. data/assets/stylesheets/bootstrap/_modal.scss +112 -112
  61. data/assets/stylesheets/bootstrap/_nav.scss +100 -28
  62. data/assets/stylesheets/bootstrap/_navbar.scss +130 -173
  63. data/assets/stylesheets/bootstrap/_offcanvas.scss +147 -0
  64. data/assets/stylesheets/bootstrap/_pagination.scss +72 -37
  65. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  66. data/assets/stylesheets/bootstrap/_popover.scss +99 -73
  67. data/assets/stylesheets/bootstrap/_progress.scss +35 -14
  68. data/assets/stylesheets/bootstrap/_reboot.scss +319 -192
  69. data/assets/stylesheets/bootstrap/_root.scss +177 -9
  70. data/assets/stylesheets/bootstrap/_spinners.scss +43 -23
  71. data/assets/stylesheets/bootstrap/_tables.scss +101 -115
  72. data/assets/stylesheets/bootstrap/_toasts.scss +54 -27
  73. data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
  74. data/assets/stylesheets/bootstrap/_transitions.scss +3 -2
  75. data/assets/stylesheets/bootstrap/_type.scss +40 -59
  76. data/assets/stylesheets/bootstrap/_utilities.scss +806 -18
  77. data/assets/stylesheets/bootstrap/_variables-dark.scss +102 -0
  78. data/assets/stylesheets/bootstrap/_variables.scss +1210 -606
  79. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +97 -0
  80. data/assets/stylesheets/bootstrap/forms/_form-check.scss +189 -0
  81. data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
  82. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  83. data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
  84. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  85. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  86. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  87. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  88. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
  89. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
  90. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  91. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  92. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  93. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  94. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  95. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  96. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  97. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  98. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  99. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
  100. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  101. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  102. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
  103. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  104. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
  105. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -100
  106. data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
  107. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  108. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  109. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  110. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  111. data/assets/stylesheets/bootstrap/mixins/_forms.scss +64 -96
  112. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  113. data/assets/stylesheets/bootstrap/mixins/_grid.scss +118 -36
  114. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  115. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
  116. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  117. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
  118. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  119. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  120. data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
  121. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  122. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
  123. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  124. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +211 -91
  125. data/bootstrap.gemspec +6 -6
  126. data/lib/bootstrap/engine.rb +0 -1
  127. data/lib/bootstrap/version.rb +2 -2
  128. data/tasks/updater/js.rb +17 -5
  129. data/tasks/updater/network.rb +2 -2
  130. data/tasks/updater/scss.rb +2 -2
  131. data/tasks/updater.rb +2 -2
  132. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  133. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  134. data/test/dummy_rails/app/views/pages/root.html +89 -0
  135. data/test/dummy_rails/config/application.rb +0 -5
  136. data/test/dummy_rails/public/favicon.ico +0 -0
  137. data/test/gemfiles/rails_4_2.gemfile +2 -1
  138. data/test/gemfiles/rails_5_0.gemfile +1 -2
  139. data/test/gemfiles/rails_5_1.gemfile +1 -2
  140. data/test/gemfiles/rails_5_2.gemfile +7 -0
  141. data/test/gemfiles/rails_6_0.gemfile +1 -1
  142. data/test/gemfiles/rails_6_1.gemfile +7 -0
  143. data/test/gemfiles/rails_7_0_dartsass.gemfile +0 -1
  144. data/test/gemfiles/rails_7_0_sassc.gemfile +0 -1
  145. data/test/rails_test.rb +0 -5
  146. data/test/test_helper.rb +3 -2
  147. metadata +92 -86
  148. data/.travis.yml +0 -31
  149. data/assets/javascripts/bootstrap/util.js +0 -189
  150. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  151. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
  152. data/assets/stylesheets/bootstrap/_input-group.scss +0 -211
  153. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  154. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  155. data/assets/stylesheets/bootstrap/_print.scss +0 -132
  156. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
  157. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  158. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  159. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
  160. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  161. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  162. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  163. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  164. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  165. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  166. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  167. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  168. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  169. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  170. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  171. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  172. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  173. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  174. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  175. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
  176. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  177. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  178. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  179. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  180. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  181. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  182. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  183. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  184. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  185. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  186. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,661 +1,318 @@
1
1
  /*!
2
- * Bootstrap modal.js v4.6.2 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap modal.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', './util'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.jQuery, global.Util));
10
- })(this, (function ($, Util) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./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
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
-
14
- var $__default = /*#__PURE__*/_interopDefaultLegacy($);
15
- var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
16
-
17
- function _defineProperties(target, props) {
18
- for (var i = 0; i < props.length; i++) {
19
- var descriptor = props[i];
20
- descriptor.enumerable = descriptor.enumerable || false;
21
- descriptor.configurable = true;
22
- if ("value" in descriptor) descriptor.writable = true;
23
- Object.defineProperty(target, descriptor.key, descriptor);
24
- }
25
- }
26
-
27
- function _createClass(Constructor, protoProps, staticProps) {
28
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
29
- if (staticProps) _defineProperties(Constructor, staticProps);
30
- Object.defineProperty(Constructor, "prototype", {
31
- writable: false
32
- });
33
- return Constructor;
34
- }
35
-
36
- function _extends() {
37
- _extends = Object.assign ? Object.assign.bind() : function (target) {
38
- for (var i = 1; i < arguments.length; i++) {
39
- var source = arguments[i];
40
-
41
- for (var key in source) {
42
- if (Object.prototype.hasOwnProperty.call(source, key)) {
43
- target[key] = source[key];
44
- }
45
- }
46
- }
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap modal.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
47
18
 
48
- return target;
49
- };
50
- return _extends.apply(this, arguments);
51
- }
52
19
 
53
20
  /**
54
21
  * Constants
55
22
  */
56
23
 
57
- var NAME = 'modal';
58
- var VERSION = '4.6.2';
59
- var DATA_KEY = 'bs.modal';
60
- var EVENT_KEY = "." + DATA_KEY;
61
- var DATA_API_KEY = '.data-api';
62
- var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME];
63
- var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
64
-
65
- var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable';
66
- var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';
67
- var CLASS_NAME_BACKDROP = 'modal-backdrop';
68
- var CLASS_NAME_OPEN = 'modal-open';
69
- var CLASS_NAME_FADE = 'fade';
70
- var CLASS_NAME_SHOW = 'show';
71
- var CLASS_NAME_STATIC = 'modal-static';
72
- var EVENT_HIDE = "hide" + EVENT_KEY;
73
- var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY;
74
- var EVENT_HIDDEN = "hidden" + EVENT_KEY;
75
- var EVENT_SHOW = "show" + EVENT_KEY;
76
- var EVENT_SHOWN = "shown" + EVENT_KEY;
77
- var EVENT_FOCUSIN = "focusin" + EVENT_KEY;
78
- var EVENT_RESIZE = "resize" + EVENT_KEY;
79
- var EVENT_CLICK_DISMISS = "click.dismiss" + EVENT_KEY;
80
- var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY;
81
- var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY;
82
- var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY;
83
- var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
84
- var SELECTOR_DIALOG = '.modal-dialog';
85
- var SELECTOR_MODAL_BODY = '.modal-body';
86
- var SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]';
87
- var SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]';
88
- var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
89
- var SELECTOR_STICKY_CONTENT = '.sticky-top';
90
- 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 = {
91
48
  backdrop: true,
92
- keyboard: true,
93
49
  focus: true,
94
- show: true
50
+ keyboard: true
95
51
  };
96
- var DefaultType = {
52
+ const DefaultType = {
97
53
  backdrop: '(boolean|string)',
98
- keyboard: 'boolean',
99
54
  focus: 'boolean',
100
- show: 'boolean'
55
+ keyboard: 'boolean'
101
56
  };
57
+
102
58
  /**
103
59
  * Class definition
104
60
  */
105
61
 
106
- var Modal = /*#__PURE__*/function () {
107
- function Modal(element, config) {
108
- this._config = this._getConfig(config);
109
- this._element = element;
110
- this._dialog = element.querySelector(SELECTOR_DIALOG);
111
- 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();
112
68
  this._isShown = false;
113
- this._isBodyOverflowing = false;
114
- this._ignoreBackdropClick = false;
115
69
  this._isTransitioning = false;
116
- this._scrollbarWidth = 0;
117
- } // Getters
118
-
70
+ this._scrollBar = new ScrollBarHelper();
71
+ this._addEventListeners();
72
+ }
119
73
 
120
- 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
+ }
121
84
 
122
85
  // Public
123
- _proto.toggle = function toggle(relatedTarget) {
86
+ toggle(relatedTarget) {
124
87
  return this._isShown ? this.hide() : this.show(relatedTarget);
125
- };
126
-
127
- _proto.show = function show(relatedTarget) {
128
- var _this = this;
129
-
88
+ }
89
+ show(relatedTarget) {
130
90
  if (this._isShown || this._isTransitioning) {
131
91
  return;
132
92
  }
133
-
134
- var showEvent = $__default["default"].Event(EVENT_SHOW, {
135
- relatedTarget: relatedTarget
93
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
94
+ relatedTarget
136
95
  });
137
- $__default["default"](this._element).trigger(showEvent);
138
-
139
- if (showEvent.isDefaultPrevented()) {
96
+ if (showEvent.defaultPrevented) {
140
97
  return;
141
98
  }
142
-
143
99
  this._isShown = true;
144
-
145
- if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE)) {
146
- this._isTransitioning = true;
147
- }
148
-
149
- this._checkScrollbar();
150
-
151
- this._setScrollbar();
152
-
100
+ this._isTransitioning = true;
101
+ this._scrollBar.hide();
102
+ document.body.classList.add(CLASS_NAME_OPEN);
153
103
  this._adjustDialog();
154
-
155
- this._setEscapeEvent();
156
-
157
- this._setResizeEvent();
158
-
159
- $__default["default"](this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, function (event) {
160
- return _this.hide(event);
161
- });
162
- $__default["default"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () {
163
- $__default["default"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) {
164
- if ($__default["default"](event.target).is(_this._element)) {
165
- _this._ignoreBackdropClick = true;
166
- }
167
- });
168
- });
169
-
170
- this._showBackdrop(function () {
171
- return _this._showElement(relatedTarget);
172
- });
173
- };
174
-
175
- _proto.hide = function hide(event) {
176
- var _this2 = this;
177
-
178
- if (event) {
179
- event.preventDefault();
180
- }
181
-
104
+ this._backdrop.show(() => this._showElement(relatedTarget));
105
+ }
106
+ hide() {
182
107
  if (!this._isShown || this._isTransitioning) {
183
108
  return;
184
109
  }
185
-
186
- var hideEvent = $__default["default"].Event(EVENT_HIDE);
187
- $__default["default"](this._element).trigger(hideEvent);
188
-
189
- if (!this._isShown || hideEvent.isDefaultPrevented()) {
110
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
111
+ if (hideEvent.defaultPrevented) {
190
112
  return;
191
113
  }
192
-
193
114
  this._isShown = false;
194
- var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE);
195
-
196
- if (transition) {
197
- this._isTransitioning = true;
198
- }
199
-
200
- this._setEscapeEvent();
201
-
202
- this._setResizeEvent();
203
-
204
- $__default["default"](document).off(EVENT_FOCUSIN);
205
- $__default["default"](this._element).removeClass(CLASS_NAME_SHOW);
206
- $__default["default"](this._element).off(EVENT_CLICK_DISMISS);
207
- $__default["default"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS);
208
-
209
- if (transition) {
210
- var transitionDuration = Util__default["default"].getTransitionDurationFromElement(this._element);
211
- $__default["default"](this._element).one(Util__default["default"].TRANSITION_END, function (event) {
212
- return _this2._hideModal(event);
213
- }).emulateTransitionEnd(transitionDuration);
214
- } else {
215
- this._hideModal();
216
- }
217
- };
218
-
219
- _proto.dispose = function dispose() {
220
- [window, this._element, this._dialog].forEach(function (htmlElement) {
221
- return $__default["default"](htmlElement).off(EVENT_KEY);
222
- });
223
- /**
224
- * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
225
- * Do not move `document` in `htmlElements` array
226
- * It will remove `EVENT_CLICK_DATA_API` event that should remain
227
- */
228
-
229
- $__default["default"](document).off(EVENT_FOCUSIN);
230
- $__default["default"].removeData(this._element, DATA_KEY);
231
- this._config = null;
232
- this._element = null;
233
- this._dialog = null;
234
- this._backdrop = null;
235
- this._isShown = null;
236
- this._isBodyOverflowing = null;
237
- this._ignoreBackdropClick = null;
238
- this._isTransitioning = null;
239
- this._scrollbarWidth = null;
240
- };
241
-
242
- _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() {
243
128
  this._adjustDialog();
244
- } // Private
245
- ;
246
-
247
- _proto._getConfig = function _getConfig(config) {
248
- config = _extends({}, Default, config);
249
- Util__default["default"].typeCheckConfig(NAME, config, DefaultType);
250
- return config;
251
- };
252
-
253
- _proto._triggerBackdropTransition = function _triggerBackdropTransition() {
254
- var _this3 = this;
255
-
256
- var hideEventPrevented = $__default["default"].Event(EVENT_HIDE_PREVENTED);
257
- $__default["default"](this._element).trigger(hideEventPrevented);
258
-
259
- if (hideEventPrevented.isDefaultPrevented()) {
260
- return;
261
- }
262
-
263
- var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
264
-
265
- if (!isModalOverflowing) {
266
- this._element.style.overflowY = 'hidden';
267
- }
268
-
269
- this._element.classList.add(CLASS_NAME_STATIC);
270
-
271
- var modalTransitionDuration = Util__default["default"].getTransitionDurationFromElement(this._dialog);
272
- $__default["default"](this._element).off(Util__default["default"].TRANSITION_END);
273
- $__default["default"](this._element).one(Util__default["default"].TRANSITION_END, function () {
274
- _this3._element.classList.remove(CLASS_NAME_STATIC);
275
-
276
- if (!isModalOverflowing) {
277
- $__default["default"](_this3._element).one(Util__default["default"].TRANSITION_END, function () {
278
- _this3._element.style.overflowY = '';
279
- }).emulateTransitionEnd(_this3._element, modalTransitionDuration);
280
- }
281
- }).emulateTransitionEnd(modalTransitionDuration);
282
-
283
- this._element.focus();
284
- };
285
-
286
- _proto._showElement = function _showElement(relatedTarget) {
287
- var _this4 = this;
288
-
289
- var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE);
290
- var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null;
129
+ }
291
130
 
292
- if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
293
- // Don't move modal's DOM position
294
- 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);
295
148
  }
296
-
297
149
  this._element.style.display = 'block';
298
-
299
150
  this._element.removeAttribute('aria-hidden');
300
-
301
151
  this._element.setAttribute('aria-modal', true);
302
-
303
152
  this._element.setAttribute('role', 'dialog');
304
-
305
- if ($__default["default"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) {
153
+ this._element.scrollTop = 0;
154
+ const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
155
+ if (modalBody) {
306
156
  modalBody.scrollTop = 0;
307
- } else {
308
- this._element.scrollTop = 0;
309
157
  }
310
-
311
- if (transition) {
312
- Util__default["default"].reflow(this._element);
313
- }
314
-
315
- $__default["default"](this._element).addClass(CLASS_NAME_SHOW);
316
-
317
- if (this._config.focus) {
318
- this._enforceFocus();
319
- }
320
-
321
- var shownEvent = $__default["default"].Event(EVENT_SHOWN, {
322
- relatedTarget: relatedTarget
323
- });
324
-
325
- var transitionComplete = function transitionComplete() {
326
- if (_this4._config.focus) {
327
- _this4._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();
328
163
  }
329
-
330
- _this4._isTransitioning = false;
331
- $__default["default"](_this4._element).trigger(shownEvent);
164
+ this._isTransitioning = false;
165
+ EventHandler.trigger(this._element, EVENT_SHOWN, {
166
+ relatedTarget
167
+ });
332
168
  };
333
-
334
- if (transition) {
335
- var transitionDuration = Util__default["default"].getTransitionDurationFromElement(this._dialog);
336
- $__default["default"](this._dialog).one(Util__default["default"].TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
337
- } else {
338
- transitionComplete();
339
- }
340
- };
341
-
342
- _proto._enforceFocus = function _enforceFocus() {
343
- var _this5 = this;
344
-
345
- $__default["default"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop
346
- .on(EVENT_FOCUSIN, function (event) {
347
- if (document !== event.target && _this5._element !== event.target && $__default["default"](_this5._element).has(event.target).length === 0) {
348
- _this5._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;
175
+ }
176
+ if (this._config.keyboard) {
177
+ this.hide();
178
+ return;
349
179
  }
180
+ this._triggerBackdropTransition();
350
181
  });
351
- };
352
-
353
- _proto._setEscapeEvent = function _setEscapeEvent() {
354
- var _this6 = this;
355
-
356
- if (this._isShown) {
357
- $__default["default"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) {
358
- if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {
359
- event.preventDefault();
360
-
361
- _this6.hide();
362
- } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) {
363
- _this6._triggerBackdropTransition();
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();
364
199
  }
365
200
  });
366
- } else if (!this._isShown) {
367
- $__default["default"](this._element).off(EVENT_KEYDOWN_DISMISS);
368
- }
369
- };
370
-
371
- _proto._setResizeEvent = function _setResizeEvent() {
372
- var _this7 = this;
373
-
374
- if (this._isShown) {
375
- $__default["default"](window).on(EVENT_RESIZE, function (event) {
376
- return _this7.handleUpdate(event);
377
- });
378
- } else {
379
- $__default["default"](window).off(EVENT_RESIZE);
380
- }
381
- };
382
-
383
- _proto._hideModal = function _hideModal() {
384
- var _this8 = this;
385
-
201
+ });
202
+ }
203
+ _hideModal() {
386
204
  this._element.style.display = 'none';
387
-
388
205
  this._element.setAttribute('aria-hidden', true);
389
-
390
206
  this._element.removeAttribute('aria-modal');
391
-
392
207
  this._element.removeAttribute('role');
393
-
394
208
  this._isTransitioning = false;
395
-
396
- this._showBackdrop(function () {
397
- $__default["default"](document.body).removeClass(CLASS_NAME_OPEN);
398
-
399
- _this8._resetAdjustments();
400
-
401
- _this8._resetScrollbar();
402
-
403
- $__default["default"](_this8._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);
404
214
  });
405
- };
406
-
407
- _proto._removeBackdrop = function _removeBackdrop() {
408
- if (this._backdrop) {
409
- $__default["default"](this._backdrop).remove();
410
- 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;
411
223
  }
412
- };
413
-
414
- _proto._showBackdrop = function _showBackdrop(callback) {
415
- var _this9 = this;
416
-
417
- var animate = $__default["default"](this._element).hasClass(CLASS_NAME_FADE) ? CLASS_NAME_FADE : '';
418
-
419
- if (this._isShown && this._config.backdrop) {
420
- this._backdrop = document.createElement('div');
421
- this._backdrop.className = CLASS_NAME_BACKDROP;
422
-
423
- if (animate) {
424
- this._backdrop.classList.add(animate);
425
- }
426
-
427
- $__default["default"](this._backdrop).appendTo(document.body);
428
- $__default["default"](this._element).on(EVENT_CLICK_DISMISS, function (event) {
429
- if (_this9._ignoreBackdropClick) {
430
- _this9._ignoreBackdropClick = false;
431
- return;
432
- }
433
-
434
- if (event.target !== event.currentTarget) {
435
- return;
436
- }
437
-
438
- if (_this9._config.backdrop === 'static') {
439
- _this9._triggerBackdropTransition();
440
- } else {
441
- _this9.hide();
442
- }
443
- });
444
-
445
- if (animate) {
446
- Util__default["default"].reflow(this._backdrop);
447
- }
448
-
449
- $__default["default"](this._backdrop).addClass(CLASS_NAME_SHOW);
450
-
451
- if (!callback) {
452
- return;
453
- }
454
-
455
- if (!animate) {
456
- callback();
457
- return;
458
- }
459
-
460
- var backdropTransitionDuration = Util__default["default"].getTransitionDurationFromElement(this._backdrop);
461
- $__default["default"](this._backdrop).one(Util__default["default"].TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
462
- } else if (!this._isShown && this._backdrop) {
463
- $__default["default"](this._backdrop).removeClass(CLASS_NAME_SHOW);
464
-
465
- var callbackRemove = function callbackRemove() {
466
- _this9._removeBackdrop();
467
-
468
- if (callback) {
469
- callback();
470
- }
471
- };
472
-
473
- if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE)) {
474
- var _backdropTransitionDuration = Util__default["default"].getTransitionDurationFromElement(this._backdrop);
475
-
476
- $__default["default"](this._backdrop).one(Util__default["default"].TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
477
- } else {
478
- callbackRemove();
479
- }
480
- } else if (callback) {
481
- 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;
482
229
  }
483
- } // ----------------------------------------------------------------------
484
- // the following methods are used to handle overflowing modals
485
- // todo (fat): these should probably be refactored out of modal.js
486
- // ----------------------------------------------------------------------
487
- ;
488
-
489
- _proto._adjustDialog = function _adjustDialog() {
490
- var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
491
-
492
- if (!this._isBodyOverflowing && isModalOverflowing) {
493
- this._element.style.paddingLeft = this._scrollbarWidth + "px";
230
+ if (!isModalOverflowing) {
231
+ this._element.style.overflowY = 'hidden';
494
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
+ }
495
242
 
496
- if (this._isBodyOverflowing && !isModalOverflowing) {
497
- this._element.style.paddingRight = this._scrollbarWidth + "px";
243
+ /**
244
+ * The following methods are used to handle overflowing modals
245
+ */
246
+
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`;
498
254
  }
499
- };
500
-
501
- _proto._resetAdjustments = function _resetAdjustments() {
255
+ if (!isBodyOverflowing && isModalOverflowing) {
256
+ const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';
257
+ this._element.style[property] = `${scrollbarWidth}px`;
258
+ }
259
+ }
260
+ _resetAdjustments() {
502
261
  this._element.style.paddingLeft = '';
503
262
  this._element.style.paddingRight = '';
504
- };
505
-
506
- _proto._checkScrollbar = function _checkScrollbar() {
507
- var rect = document.body.getBoundingClientRect();
508
- this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;
509
- this._scrollbarWidth = this._getScrollbarWidth();
510
- };
511
-
512
- _proto._setScrollbar = function _setScrollbar() {
513
- var _this10 = this;
514
-
515
- if (this._isBodyOverflowing) {
516
- // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
517
- // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
518
- var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
519
- var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding
520
-
521
- $__default["default"](fixedContent).each(function (index, element) {
522
- var actualPadding = element.style.paddingRight;
523
- var calculatedPadding = $__default["default"](element).css('padding-right');
524
- $__default["default"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px");
525
- }); // Adjust sticky content margin
526
-
527
- $__default["default"](stickyContent).each(function (index, element) {
528
- var actualMargin = element.style.marginRight;
529
- var calculatedMargin = $__default["default"](element).css('margin-right');
530
- $__default["default"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px");
531
- }); // Adjust body padding
532
-
533
- var actualPadding = document.body.style.paddingRight;
534
- var calculatedPadding = $__default["default"](document.body).css('padding-right');
535
- $__default["default"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
536
- }
537
-
538
- $__default["default"](document.body).addClass(CLASS_NAME_OPEN);
539
- };
540
-
541
- _proto._resetScrollbar = function _resetScrollbar() {
542
- // Restore fixed content padding
543
- var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT));
544
- $__default["default"](fixedContent).each(function (index, element) {
545
- var padding = $__default["default"](element).data('padding-right');
546
- $__default["default"](element).removeData('padding-right');
547
- element.style.paddingRight = padding ? padding : '';
548
- }); // Restore sticky content
549
-
550
- var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT));
551
- $__default["default"](elements).each(function (index, element) {
552
- var margin = $__default["default"](element).data('margin-right');
553
-
554
- if (typeof margin !== 'undefined') {
555
- $__default["default"](element).css('margin-right', margin).removeData('margin-right');
556
- }
557
- }); // Restore body padding
558
-
559
- var padding = $__default["default"](document.body).data('padding-right');
560
- $__default["default"](document.body).removeData('padding-right');
561
- document.body.style.paddingRight = padding ? padding : '';
562
- };
563
-
564
- _proto._getScrollbarWidth = function _getScrollbarWidth() {
565
- // thx d.walsh
566
- var scrollDiv = document.createElement('div');
567
- scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;
568
- document.body.appendChild(scrollDiv);
569
- var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
570
- document.body.removeChild(scrollDiv);
571
- return scrollbarWidth;
572
- } // Static
573
- ;
263
+ }
574
264
 
575
- Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
265
+ // Static
266
+ static jQueryInterface(config, relatedTarget) {
576
267
  return this.each(function () {
577
- var data = $__default["default"](this).data(DATA_KEY);
578
-
579
- var _config = _extends({}, Default, $__default["default"](this).data(), typeof config === 'object' && config ? config : {});
580
-
581
- if (!data) {
582
- data = new Modal(this, _config);
583
- $__default["default"](this).data(DATA_KEY, data);
268
+ const data = Modal.getOrCreateInstance(this, config);
269
+ if (typeof config !== 'string') {
270
+ return;
584
271
  }
585
-
586
- if (typeof config === 'string') {
587
- if (typeof data[config] === 'undefined') {
588
- throw new TypeError("No method named \"" + config + "\"");
589
- }
590
-
591
- data[config](relatedTarget);
592
- } else if (_config.show) {
593
- data.show(relatedTarget);
272
+ if (typeof data[config] === 'undefined') {
273
+ throw new TypeError(`No method named "${config}"`);
594
274
  }
275
+ data[config](relatedTarget);
595
276
  });
596
- };
597
-
598
- _createClass(Modal, null, [{
599
- key: "VERSION",
600
- get: function get() {
601
- return VERSION;
602
- }
603
- }, {
604
- key: "Default",
605
- get: function get() {
606
- return Default;
607
- }
608
- }]);
277
+ }
278
+ }
609
279
 
610
- return Modal;
611
- }();
612
280
  /**
613
281
  * Data API implementation
614
282
  */
615
283
 
616
-
617
- $__default["default"](document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
618
- var _this11 = this;
619
-
620
- var target;
621
- var selector = Util__default["default"].getSelectorFromElement(this);
622
-
623
- if (selector) {
624
- target = document.querySelector(selector);
625
- }
626
-
627
- var config = $__default["default"](target).data(DATA_KEY) ? 'toggle' : _extends({}, $__default["default"](target).data(), $__default["default"](this).data());
628
-
629
- 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)) {
630
287
  event.preventDefault();
631
288
  }
632
-
633
- var $target = $__default["default"](target).one(EVENT_SHOW, function (showEvent) {
634
- if (showEvent.isDefaultPrevented()) {
635
- // 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
636
292
  return;
637
293
  }
638
-
639
- $target.one(EVENT_HIDDEN, function () {
640
- if ($__default["default"](_this11).is(':visible')) {
641
- _this11.focus();
294
+ EventHandler.one(target, EVENT_HIDDEN, () => {
295
+ if (index_js.isVisible(this)) {
296
+ this.focus();
642
297
  }
643
298
  });
644
299
  });
645
300
 
646
- Modal._jQueryInterface.call($__default["default"](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);
647
308
  });
309
+ componentFunctions_js.enableDismissTrigger(Modal);
310
+
648
311
  /**
649
312
  * jQuery
650
313
  */
651
314
 
652
- $__default["default"].fn[NAME] = Modal._jQueryInterface;
653
- $__default["default"].fn[NAME].Constructor = Modal;
654
-
655
- $__default["default"].fn[NAME].noConflict = function () {
656
- $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
657
- return Modal._jQueryInterface;
658
- };
315
+ index_js.defineJQueryPlugin(Modal);
659
316
 
660
317
  return Modal;
661
318