bootstrap 4.5.3 → 5.2.3

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