bootstrap 4.6.0 → 5.3.2

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