bootstrap 4.4.1 → 5.0.1

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 (149) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -2
  3. data/README.md +7 -4
  4. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  5. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  6. data/assets/javascripts/bootstrap-sprockets.js +15 -8
  7. data/assets/javascripts/bootstrap.js +3244 -2770
  8. data/assets/javascripts/bootstrap.min.js +4 -4
  9. data/assets/javascripts/bootstrap/alert.js +130 -124
  10. data/assets/javascripts/bootstrap/base-component.js +168 -0
  11. data/assets/javascripts/bootstrap/button.js +85 -179
  12. data/assets/javascripts/bootstrap/carousel.js +430 -405
  13. data/assets/javascripts/bootstrap/collapse.js +325 -264
  14. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  15. data/assets/javascripts/bootstrap/dom/event-handler.js +315 -0
  16. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  17. data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
  18. data/assets/javascripts/bootstrap/dropdown.js +464 -400
  19. data/assets/javascripts/bootstrap/modal.js +604 -464
  20. data/assets/javascripts/bootstrap/offcanvas.js +671 -0
  21. data/assets/javascripts/bootstrap/popover.js +119 -192
  22. data/assets/javascripts/bootstrap/scrollspy.js +250 -238
  23. data/assets/javascripts/bootstrap/tab.js +189 -151
  24. data/assets/javascripts/bootstrap/toast.js +215 -192
  25. data/assets/javascripts/bootstrap/tooltip.js +604 -544
  26. data/assets/stylesheets/_bootstrap-grid.scss +54 -18
  27. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  28. data/assets/stylesheets/_bootstrap.scss +19 -11
  29. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  30. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  31. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  32. data/assets/stylesheets/bootstrap/_breadcrumb.scss +4 -18
  33. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  34. data/assets/stylesheets/bootstrap/_buttons.scss +27 -55
  35. data/assets/stylesheets/bootstrap/_card.scss +43 -106
  36. data/assets/stylesheets/bootstrap/_carousel.scss +65 -33
  37. data/assets/stylesheets/bootstrap/_close.scss +30 -31
  38. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  39. data/assets/stylesheets/bootstrap/_dropdown.scss +87 -38
  40. data/assets/stylesheets/bootstrap/_forms.scss +9 -338
  41. data/assets/stylesheets/bootstrap/_functions.scss +99 -28
  42. data/assets/stylesheets/bootstrap/_grid.scss +3 -50
  43. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  44. data/assets/stylesheets/bootstrap/_list-group.scss +38 -22
  45. data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
  46. data/assets/stylesheets/bootstrap/_modal.scss +45 -65
  47. data/assets/stylesheets/bootstrap/_nav.scss +28 -9
  48. data/assets/stylesheets/bootstrap/_navbar.scss +51 -69
  49. data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
  50. data/assets/stylesheets/bootstrap/_pagination.scss +11 -20
  51. data/assets/stylesheets/bootstrap/_popover.scss +15 -27
  52. data/assets/stylesheets/bootstrap/_progress.scss +6 -4
  53. data/assets/stylesheets/bootstrap/_reboot.scss +339 -200
  54. data/assets/stylesheets/bootstrap/_root.scss +5 -9
  55. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  56. data/assets/stylesheets/bootstrap/_tables.scss +80 -114
  57. data/assets/stylesheets/bootstrap/_toasts.scss +21 -14
  58. data/assets/stylesheets/bootstrap/_tooltip.scss +17 -17
  59. data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
  60. data/assets/stylesheets/bootstrap/_type.scss +38 -59
  61. data/assets/stylesheets/bootstrap/_utilities.scss +594 -17
  62. data/assets/stylesheets/bootstrap/_variables.scss +810 -489
  63. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  64. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  65. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  66. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  67. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  70. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  71. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  72. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  73. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  74. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  75. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  76. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  77. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  78. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  79. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  80. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  81. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  82. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  83. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  84. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +75 -52
  85. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  86. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  87. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  88. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  89. data/assets/stylesheets/bootstrap/mixins/_forms.scss +42 -75
  90. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  91. data/assets/stylesheets/bootstrap/mixins/_grid.scss +90 -34
  92. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  93. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  94. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  95. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
  96. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  97. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  98. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  99. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  100. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  101. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  102. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +234 -126
  103. data/bootstrap.gemspec +1 -3
  104. data/lib/bootstrap/version.rb +2 -2
  105. data/tasks/updater/js.rb +20 -5
  106. data/tasks/updater/network.rb +8 -2
  107. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  108. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  109. data/test/dummy_rails/app/views/pages/root.html +89 -0
  110. data/test/dummy_rails/config/application.rb +0 -3
  111. data/test/gemfiles/rails_6_0.gemfile +7 -0
  112. data/test/gemfiles/rails_6_1.gemfile +7 -0
  113. metadata +48 -73
  114. data/assets/javascripts/bootstrap/util.js +0 -188
  115. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  116. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -521
  117. data/assets/stylesheets/bootstrap/_input-group.scss +0 -191
  118. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  119. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  120. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  121. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -22
  122. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  123. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  124. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -71
  125. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  126. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  127. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  128. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  129. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  130. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  131. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  132. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  133. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  134. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  135. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  136. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  137. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  138. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  139. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  140. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  141. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  142. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  143. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  144. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  145. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  146. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  147. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  148. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  149. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -1,159 +1,112 @@
1
1
  /*!
2
- * Bootstrap button.js v4.4.1 (https://getbootstrap.com/)
3
- * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2
+ * Bootstrap button.js v5.0.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :
8
- typeof define === 'function' && define.amd ? define(['jquery'], factory) :
9
- (global = global || self, global.Button = factory(global.jQuery));
10
- }(this, (function ($) { 'use strict';
11
-
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
-
14
- function _defineProperties(target, props) {
15
- for (var i = 0; i < props.length; i++) {
16
- var descriptor = props[i];
17
- descriptor.enumerable = descriptor.enumerable || false;
18
- descriptor.configurable = true;
19
- if ("value" in descriptor) descriptor.writable = true;
20
- Object.defineProperty(target, descriptor.key, descriptor);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/selector-engine.js'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/data', './dom/event-handler', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Button = factory(global.SelectorEngine, global.Data, global.EventHandler, global.Base));
10
+ }(this, (function (SelectorEngine, Data, EventHandler, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
15
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
17
+
18
+ const getjQuery = () => {
19
+ const {
20
+ jQuery
21
+ } = window;
22
+
23
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
24
+ return jQuery;
21
25
  }
22
- }
23
26
 
24
- function _createClass(Constructor, protoProps, staticProps) {
25
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
26
- if (staticProps) _defineProperties(Constructor, staticProps);
27
- return Constructor;
28
- }
27
+ return null;
28
+ };
29
+
30
+ const onDOMContentLoaded = callback => {
31
+ if (document.readyState === 'loading') {
32
+ document.addEventListener('DOMContentLoaded', callback);
33
+ } else {
34
+ callback();
35
+ }
36
+ };
29
37
 
38
+ const defineJQueryPlugin = plugin => {
39
+ onDOMContentLoaded(() => {
40
+ const $ = getjQuery();
41
+ /* istanbul ignore if */
42
+
43
+ if ($) {
44
+ const name = plugin.NAME;
45
+ const JQUERY_NO_CONFLICT = $.fn[name];
46
+ $.fn[name] = plugin.jQueryInterface;
47
+ $.fn[name].Constructor = plugin;
48
+
49
+ $.fn[name].noConflict = () => {
50
+ $.fn[name] = JQUERY_NO_CONFLICT;
51
+ return plugin.jQueryInterface;
52
+ };
53
+ }
54
+ });
55
+ };
56
+
57
+ /**
58
+ * --------------------------------------------------------------------------
59
+ * Bootstrap (v5.0.1): button.js
60
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
61
+ * --------------------------------------------------------------------------
62
+ */
30
63
  /**
31
64
  * ------------------------------------------------------------------------
32
65
  * Constants
33
66
  * ------------------------------------------------------------------------
34
67
  */
35
68
 
36
- var NAME = 'button';
37
- var VERSION = '4.4.1';
38
- var DATA_KEY = 'bs.button';
39
- var EVENT_KEY = "." + DATA_KEY;
40
- var DATA_API_KEY = '.data-api';
41
- var JQUERY_NO_CONFLICT = $.fn[NAME];
42
- var ClassName = {
43
- ACTIVE: 'active',
44
- BUTTON: 'btn',
45
- FOCUS: 'focus'
46
- };
47
- var Selector = {
48
- DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
49
- DATA_TOGGLES: '[data-toggle="buttons"]',
50
- DATA_TOGGLE: '[data-toggle="button"]',
51
- DATA_TOGGLES_BUTTONS: '[data-toggle="buttons"] .btn',
52
- INPUT: 'input:not([type="hidden"])',
53
- ACTIVE: '.active',
54
- BUTTON: '.btn'
55
- };
56
- var Event = {
57
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
58
- FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY),
59
- LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
60
- };
69
+ const NAME = 'button';
70
+ const DATA_KEY = 'bs.button';
71
+ const EVENT_KEY = `.${DATA_KEY}`;
72
+ const DATA_API_KEY = '.data-api';
73
+ const CLASS_NAME_ACTIVE = 'active';
74
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]';
75
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
61
76
  /**
62
77
  * ------------------------------------------------------------------------
63
78
  * Class Definition
64
79
  * ------------------------------------------------------------------------
65
80
  */
66
81
 
67
- var Button =
68
- /*#__PURE__*/
69
- function () {
70
- function Button(element) {
71
- this._element = element;
72
- } // Getters
73
-
74
-
75
- var _proto = Button.prototype;
76
-
77
- // Public
78
- _proto.toggle = function toggle() {
79
- var triggerChangeEvent = true;
80
- var addAriaPressed = true;
81
- var rootElement = $(this._element).closest(Selector.DATA_TOGGLES)[0];
82
-
83
- if (rootElement) {
84
- var input = this._element.querySelector(Selector.INPUT);
85
-
86
- if (input) {
87
- if (input.type === 'radio') {
88
- if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) {
89
- triggerChangeEvent = false;
90
- } else {
91
- var activeElement = rootElement.querySelector(Selector.ACTIVE);
92
-
93
- if (activeElement) {
94
- $(activeElement).removeClass(ClassName.ACTIVE);
95
- }
96
- }
97
- } else if (input.type === 'checkbox') {
98
- if (this._element.tagName === 'LABEL' && input.checked === this._element.classList.contains(ClassName.ACTIVE)) {
99
- triggerChangeEvent = false;
100
- }
101
- } else {
102
- // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input
103
- triggerChangeEvent = false;
104
- }
105
-
106
- if (triggerChangeEvent) {
107
- input.checked = !this._element.classList.contains(ClassName.ACTIVE);
108
- $(input).trigger('change');
109
- }
110
-
111
- input.focus();
112
- addAriaPressed = false;
113
- }
114
- }
115
-
116
- if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) {
117
- if (addAriaPressed) {
118
- this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));
119
- }
82
+ class Button extends BaseComponent__default['default'] {
83
+ // Getters
84
+ static get NAME() {
85
+ return NAME;
86
+ } // Public
120
87
 
121
- if (triggerChangeEvent) {
122
- $(this._element).toggleClass(ClassName.ACTIVE);
123
- }
124
- }
125
- };
126
88
 
127
- _proto.dispose = function dispose() {
128
- $.removeData(this._element, DATA_KEY);
129
- this._element = null;
89
+ toggle() {
90
+ // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
91
+ this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE));
130
92
  } // Static
131
- ;
132
93
 
133
- Button._jQueryInterface = function _jQueryInterface(config) {
94
+
95
+ static jQueryInterface(config) {
134
96
  return this.each(function () {
135
- var data = $(this).data(DATA_KEY);
97
+ let data = Data__default['default'].get(this, DATA_KEY);
136
98
 
137
99
  if (!data) {
138
100
  data = new Button(this);
139
- $(this).data(DATA_KEY, data);
140
101
  }
141
102
 
142
103
  if (config === 'toggle') {
143
104
  data[config]();
144
105
  }
145
106
  });
146
- };
147
-
148
- _createClass(Button, null, [{
149
- key: "VERSION",
150
- get: function get() {
151
- return VERSION;
152
- }
153
- }]);
107
+ }
154
108
 
155
- return Button;
156
- }();
109
+ }
157
110
  /**
158
111
  * ------------------------------------------------------------------------
159
112
  * Data Api implementation
@@ -161,72 +114,25 @@
161
114
  */
162
115
 
163
116
 
164
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
165
- var button = event.target;
117
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {
118
+ event.preventDefault();
119
+ const button = event.target.closest(SELECTOR_DATA_TOGGLE);
120
+ let data = Data__default['default'].get(button, DATA_KEY);
166
121
 
167
- if (!$(button).hasClass(ClassName.BUTTON)) {
168
- button = $(button).closest(Selector.BUTTON)[0];
122
+ if (!data) {
123
+ data = new Button(button);
169
124
  }
170
125
 
171
- if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) {
172
- event.preventDefault(); // work around Firefox bug #1540995
173
- } else {
174
- var inputBtn = button.querySelector(Selector.INPUT);
175
-
176
- if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) {
177
- event.preventDefault(); // work around Firefox bug #1540995
178
-
179
- return;
180
- }
181
-
182
- Button._jQueryInterface.call($(button), 'toggle');
183
- }
184
- }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
185
- var button = $(event.target).closest(Selector.BUTTON)[0];
186
- $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
187
- });
188
- $(window).on(Event.LOAD_DATA_API, function () {
189
- // ensure correct active class is set to match the controls' actual values/states
190
- // find all checkboxes/readio buttons inside data-toggle groups
191
- var buttons = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLES_BUTTONS));
192
-
193
- for (var i = 0, len = buttons.length; i < len; i++) {
194
- var button = buttons[i];
195
- var input = button.querySelector(Selector.INPUT);
196
-
197
- if (input.checked || input.hasAttribute('checked')) {
198
- button.classList.add(ClassName.ACTIVE);
199
- } else {
200
- button.classList.remove(ClassName.ACTIVE);
201
- }
202
- } // find all button toggles
203
-
204
-
205
- buttons = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
206
-
207
- for (var _i = 0, _len = buttons.length; _i < _len; _i++) {
208
- var _button = buttons[_i];
209
-
210
- if (_button.getAttribute('aria-pressed') === 'true') {
211
- _button.classList.add(ClassName.ACTIVE);
212
- } else {
213
- _button.classList.remove(ClassName.ACTIVE);
214
- }
215
- }
126
+ data.toggle();
216
127
  });
217
128
  /**
218
129
  * ------------------------------------------------------------------------
219
130
  * jQuery
220
131
  * ------------------------------------------------------------------------
132
+ * add .Button to jQuery only if jQuery is present
221
133
  */
222
134
 
223
- $.fn[NAME] = Button._jQueryInterface;
224
- $.fn[NAME].Constructor = Button;
225
-
226
- $.fn[NAME].noConflict = function () {
227
- $.fn[NAME] = JQUERY_NO_CONFLICT;
228
- return Button._jQueryInterface;
229
- };
135
+ defineJQueryPlugin(Button);
230
136
 
231
137
  return Button;
232
138
 
@@ -1,102 +1,168 @@
1
1
  /*!
2
- * Bootstrap carousel.js v4.4.1 (https://getbootstrap.com/)
3
- * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2
+ * Bootstrap carousel.js v5.0.1 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
9
- (global = global || self, global.Carousel = factory(global.jQuery, global.Util));
10
- }(this, (function ($, Util) { 'use strict';
11
-
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;
14
-
15
- function _defineProperties(target, props) {
16
- for (var i = 0; i < props.length; i++) {
17
- var descriptor = props[i];
18
- descriptor.enumerable = descriptor.enumerable || false;
19
- descriptor.configurable = true;
20
- if ("value" in descriptor) descriptor.writable = true;
21
- Object.defineProperty(target, descriptor.key, descriptor);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/selector-engine.js'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/data', './dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Carousel = factory(global.SelectorEngine, global.Data, global.EventHandler, global.Manipulator, global.Base));
10
+ }(this, (function (SelectorEngine, Data, EventHandler, Manipulator, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
16
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
17
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
18
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
19
+
20
+ const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
21
+
22
+ const toType = obj => {
23
+ if (obj === null || obj === undefined) {
24
+ return `${obj}`;
22
25
  }
23
- }
24
26
 
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
27
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
28
+ };
30
29
 
31
- function _defineProperty(obj, key, value) {
32
- if (key in obj) {
33
- Object.defineProperty(obj, key, {
34
- value: value,
35
- enumerable: true,
36
- configurable: true,
37
- writable: true
38
- });
39
- } else {
40
- obj[key] = value;
30
+ const getSelector = element => {
31
+ let selector = element.getAttribute('data-bs-target');
32
+
33
+ if (!selector || selector === '#') {
34
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
35
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
36
+ // `document.querySelector` will rightfully complain it is invalid.
37
+ // See https://github.com/twbs/bootstrap/issues/32273
38
+
39
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
40
+ return null;
41
+ } // Just in case some CMS puts out a full URL with the anchor appended
42
+
43
+
44
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
45
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
46
+ }
47
+
48
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
41
49
  }
42
50
 
43
- return obj;
44
- }
51
+ return selector;
52
+ };
45
53
 
46
- function ownKeys(object, enumerableOnly) {
47
- var keys = Object.keys(object);
54
+ const getElementFromSelector = element => {
55
+ const selector = getSelector(element);
56
+ return selector ? document.querySelector(selector) : null;
57
+ };
48
58
 
49
- if (Object.getOwnPropertySymbols) {
50
- var symbols = Object.getOwnPropertySymbols(object);
51
- if (enumerableOnly) symbols = symbols.filter(function (sym) {
52
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
53
- });
54
- keys.push.apply(keys, symbols);
59
+ const triggerTransitionEnd = element => {
60
+ element.dispatchEvent(new Event(TRANSITION_END));
61
+ };
62
+
63
+ const isElement = obj => {
64
+ if (!obj || typeof obj !== 'object') {
65
+ return false;
55
66
  }
56
67
 
57
- return keys;
58
- }
68
+ if (typeof obj.jquery !== 'undefined') {
69
+ obj = obj[0];
70
+ }
59
71
 
60
- function _objectSpread2(target) {
61
- for (var i = 1; i < arguments.length; i++) {
62
- var source = arguments[i] != null ? arguments[i] : {};
72
+ return typeof obj.nodeType !== 'undefined';
73
+ };
63
74
 
64
- if (i % 2) {
65
- ownKeys(Object(source), true).forEach(function (key) {
66
- _defineProperty(target, key, source[key]);
67
- });
68
- } else if (Object.getOwnPropertyDescriptors) {
69
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
70
- } else {
71
- ownKeys(Object(source)).forEach(function (key) {
72
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
73
- });
75
+ const typeCheckConfig = (componentName, config, configTypes) => {
76
+ Object.keys(configTypes).forEach(property => {
77
+ const expectedTypes = configTypes[property];
78
+ const value = config[property];
79
+ const valueType = value && isElement(value) ? 'element' : toType(value);
80
+
81
+ if (!new RegExp(expectedTypes).test(valueType)) {
82
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
74
83
  }
84
+ });
85
+ };
86
+
87
+ const isVisible = element => {
88
+ if (!element) {
89
+ return false;
75
90
  }
76
91
 
77
- return target;
78
- }
92
+ if (element.style && element.parentNode && element.parentNode.style) {
93
+ const elementStyle = getComputedStyle(element);
94
+ const parentNodeStyle = getComputedStyle(element.parentNode);
95
+ return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
96
+ }
97
+
98
+ return false;
99
+ };
100
+
101
+ const reflow = element => element.offsetHeight;
102
+
103
+ const getjQuery = () => {
104
+ const {
105
+ jQuery
106
+ } = window;
107
+
108
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
109
+ return jQuery;
110
+ }
111
+
112
+ return null;
113
+ };
114
+
115
+ const onDOMContentLoaded = callback => {
116
+ if (document.readyState === 'loading') {
117
+ document.addEventListener('DOMContentLoaded', callback);
118
+ } else {
119
+ callback();
120
+ }
121
+ };
122
+
123
+ const isRTL = () => document.documentElement.dir === 'rtl';
124
+
125
+ const defineJQueryPlugin = plugin => {
126
+ onDOMContentLoaded(() => {
127
+ const $ = getjQuery();
128
+ /* istanbul ignore if */
129
+
130
+ if ($) {
131
+ const name = plugin.NAME;
132
+ const JQUERY_NO_CONFLICT = $.fn[name];
133
+ $.fn[name] = plugin.jQueryInterface;
134
+ $.fn[name].Constructor = plugin;
135
+
136
+ $.fn[name].noConflict = () => {
137
+ $.fn[name] = JQUERY_NO_CONFLICT;
138
+ return plugin.jQueryInterface;
139
+ };
140
+ }
141
+ });
142
+ };
79
143
 
144
+ /**
145
+ * --------------------------------------------------------------------------
146
+ * Bootstrap (v5.0.1): carousel.js
147
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
148
+ * --------------------------------------------------------------------------
149
+ */
80
150
  /**
81
151
  * ------------------------------------------------------------------------
82
152
  * Constants
83
153
  * ------------------------------------------------------------------------
84
154
  */
85
155
 
86
- var NAME = 'carousel';
87
- var VERSION = '4.4.1';
88
- var DATA_KEY = 'bs.carousel';
89
- var EVENT_KEY = "." + DATA_KEY;
90
- var DATA_API_KEY = '.data-api';
91
- var JQUERY_NO_CONFLICT = $.fn[NAME];
92
- var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
93
-
94
- var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
156
+ const NAME = 'carousel';
157
+ const DATA_KEY = 'bs.carousel';
158
+ const EVENT_KEY = `.${DATA_KEY}`;
159
+ const DATA_API_KEY = '.data-api';
160
+ const ARROW_LEFT_KEY = 'ArrowLeft';
161
+ const ARROW_RIGHT_KEY = 'ArrowRight';
162
+ const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
95
163
 
96
- var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
97
-
98
- var SWIPE_THRESHOLD = 40;
99
- var Default = {
164
+ const SWIPE_THRESHOLD = 40;
165
+ const Default = {
100
166
  interval: 5000,
101
167
  keyboard: true,
102
168
  slide: false,
@@ -104,7 +170,7 @@
104
170
  wrap: true,
105
171
  touch: true
106
172
  };
107
- var DefaultType = {
173
+ const DefaultType = {
108
174
  interval: '(number|boolean)',
109
175
  keyboard: 'boolean',
110
176
  slide: '(boolean|string)',
@@ -112,62 +178,51 @@
112
178
  wrap: 'boolean',
113
179
  touch: 'boolean'
114
180
  };
115
- var Direction = {
116
- NEXT: 'next',
117
- PREV: 'prev',
118
- LEFT: 'left',
119
- RIGHT: 'right'
120
- };
121
- var Event = {
122
- SLIDE: "slide" + EVENT_KEY,
123
- SLID: "slid" + EVENT_KEY,
124
- KEYDOWN: "keydown" + EVENT_KEY,
125
- MOUSEENTER: "mouseenter" + EVENT_KEY,
126
- MOUSELEAVE: "mouseleave" + EVENT_KEY,
127
- TOUCHSTART: "touchstart" + EVENT_KEY,
128
- TOUCHMOVE: "touchmove" + EVENT_KEY,
129
- TOUCHEND: "touchend" + EVENT_KEY,
130
- POINTERDOWN: "pointerdown" + EVENT_KEY,
131
- POINTERUP: "pointerup" + EVENT_KEY,
132
- DRAG_START: "dragstart" + EVENT_KEY,
133
- LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY,
134
- CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
135
- };
136
- var ClassName = {
137
- CAROUSEL: 'carousel',
138
- ACTIVE: 'active',
139
- SLIDE: 'slide',
140
- RIGHT: 'carousel-item-right',
141
- LEFT: 'carousel-item-left',
142
- NEXT: 'carousel-item-next',
143
- PREV: 'carousel-item-prev',
144
- ITEM: 'carousel-item',
145
- POINTER_EVENT: 'pointer-event'
146
- };
147
- var Selector = {
148
- ACTIVE: '.active',
149
- ACTIVE_ITEM: '.active.carousel-item',
150
- ITEM: '.carousel-item',
151
- ITEM_IMG: '.carousel-item img',
152
- NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
153
- INDICATORS: '.carousel-indicators',
154
- DATA_SLIDE: '[data-slide], [data-slide-to]',
155
- DATA_RIDE: '[data-ride="carousel"]'
156
- };
157
- var PointerType = {
158
- TOUCH: 'touch',
159
- PEN: 'pen'
160
- };
181
+ const ORDER_NEXT = 'next';
182
+ const ORDER_PREV = 'prev';
183
+ const DIRECTION_LEFT = 'left';
184
+ const DIRECTION_RIGHT = 'right';
185
+ const EVENT_SLIDE = `slide${EVENT_KEY}`;
186
+ const EVENT_SLID = `slid${EVENT_KEY}`;
187
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY}`;
188
+ const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`;
189
+ const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`;
190
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`;
191
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`;
192
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY}`;
193
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`;
194
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY}`;
195
+ const EVENT_DRAG_START = `dragstart${EVENT_KEY}`;
196
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
197
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
198
+ const CLASS_NAME_CAROUSEL = 'carousel';
199
+ const CLASS_NAME_ACTIVE = 'active';
200
+ const CLASS_NAME_SLIDE = 'slide';
201
+ const CLASS_NAME_END = 'carousel-item-end';
202
+ const CLASS_NAME_START = 'carousel-item-start';
203
+ const CLASS_NAME_NEXT = 'carousel-item-next';
204
+ const CLASS_NAME_PREV = 'carousel-item-prev';
205
+ const CLASS_NAME_POINTER_EVENT = 'pointer-event';
206
+ const SELECTOR_ACTIVE = '.active';
207
+ const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
208
+ const SELECTOR_ITEM = '.carousel-item';
209
+ const SELECTOR_ITEM_IMG = '.carousel-item img';
210
+ const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
211
+ const SELECTOR_INDICATORS = '.carousel-indicators';
212
+ const SELECTOR_INDICATOR = '[data-bs-target]';
213
+ const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
214
+ const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
215
+ const POINTER_TYPE_TOUCH = 'touch';
216
+ const POINTER_TYPE_PEN = 'pen';
161
217
  /**
162
218
  * ------------------------------------------------------------------------
163
219
  * Class Definition
164
220
  * ------------------------------------------------------------------------
165
221
  */
166
222
 
167
- var Carousel =
168
- /*#__PURE__*/
169
- function () {
170
- function Carousel(element, config) {
223
+ class Carousel extends BaseComponent__default['default'] {
224
+ constructor(element, config) {
225
+ super(element);
171
226
  this._items = null;
172
227
  this._interval = null;
173
228
  this._activeElement = null;
@@ -177,53 +232,58 @@
177
232
  this.touchStartX = 0;
178
233
  this.touchDeltaX = 0;
179
234
  this._config = this._getConfig(config);
180
- this._element = element;
181
- this._indicatorsElement = this._element.querySelector(Selector.INDICATORS);
235
+ this._indicatorsElement = SelectorEngine__default['default'].findOne(SELECTOR_INDICATORS, this._element);
182
236
  this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
183
- this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);
237
+ this._pointerEvent = Boolean(window.PointerEvent);
184
238
 
185
239
  this._addEventListeners();
186
240
  } // Getters
187
241
 
188
242
 
189
- var _proto = Carousel.prototype;
243
+ static get Default() {
244
+ return Default;
245
+ }
190
246
 
191
- // Public
192
- _proto.next = function next() {
247
+ static get NAME() {
248
+ return NAME;
249
+ } // Public
250
+
251
+
252
+ next() {
193
253
  if (!this._isSliding) {
194
- this._slide(Direction.NEXT);
254
+ this._slide(ORDER_NEXT);
195
255
  }
196
- };
256
+ }
197
257
 
198
- _proto.nextWhenVisible = function nextWhenVisible() {
258
+ nextWhenVisible() {
199
259
  // Don't call next when the page isn't visible
200
260
  // or the carousel or its parent isn't visible
201
- if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {
261
+ if (!document.hidden && isVisible(this._element)) {
202
262
  this.next();
203
263
  }
204
- };
264
+ }
205
265
 
206
- _proto.prev = function prev() {
266
+ prev() {
207
267
  if (!this._isSliding) {
208
- this._slide(Direction.PREV);
268
+ this._slide(ORDER_PREV);
209
269
  }
210
- };
270
+ }
211
271
 
212
- _proto.pause = function pause(event) {
272
+ pause(event) {
213
273
  if (!event) {
214
274
  this._isPaused = true;
215
275
  }
216
276
 
217
- if (this._element.querySelector(Selector.NEXT_PREV)) {
218
- Util.triggerTransitionEnd(this._element);
277
+ if (SelectorEngine__default['default'].findOne(SELECTOR_NEXT_PREV, this._element)) {
278
+ triggerTransitionEnd(this._element);
219
279
  this.cycle(true);
220
280
  }
221
281
 
222
282
  clearInterval(this._interval);
223
283
  this._interval = null;
224
- };
284
+ }
225
285
 
226
- _proto.cycle = function cycle(event) {
286
+ cycle(event) {
227
287
  if (!event) {
228
288
  this._isPaused = false;
229
289
  }
@@ -233,26 +293,24 @@
233
293
  this._interval = null;
234
294
  }
235
295
 
236
- if (this._config.interval && !this._isPaused) {
296
+ if (this._config && this._config.interval && !this._isPaused) {
297
+ this._updateInterval();
298
+
237
299
  this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
238
300
  }
239
- };
240
-
241
- _proto.to = function to(index) {
242
- var _this = this;
301
+ }
243
302
 
244
- this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
303
+ to(index) {
304
+ this._activeElement = SelectorEngine__default['default'].findOne(SELECTOR_ACTIVE_ITEM, this._element);
245
305
 
246
- var activeIndex = this._getItemIndex(this._activeElement);
306
+ const activeIndex = this._getItemIndex(this._activeElement);
247
307
 
248
308
  if (index > this._items.length - 1 || index < 0) {
249
309
  return;
250
310
  }
251
311
 
252
312
  if (this._isSliding) {
253
- $(this._element).one(Event.SLID, function () {
254
- return _this.to(index);
255
- });
313
+ EventHandler__default['default'].one(this._element, EVENT_SLID, () => this.to(index));
256
314
  return;
257
315
  }
258
316
 
@@ -262,105 +320,74 @@
262
320
  return;
263
321
  }
264
322
 
265
- var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
323
+ const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
266
324
 
267
- this._slide(direction, this._items[index]);
268
- };
269
-
270
- _proto.dispose = function dispose() {
271
- $(this._element).off(EVENT_KEY);
272
- $.removeData(this._element, DATA_KEY);
273
- this._items = null;
274
- this._config = null;
275
- this._element = null;
276
- this._interval = null;
277
- this._isPaused = null;
278
- this._isSliding = null;
279
- this._activeElement = null;
280
- this._indicatorsElement = null;
325
+ this._slide(order, this._items[index]);
281
326
  } // Private
282
- ;
283
327
 
284
- _proto._getConfig = function _getConfig(config) {
285
- config = _objectSpread2({}, Default, {}, config);
286
- Util.typeCheckConfig(NAME, config, DefaultType);
328
+
329
+ _getConfig(config) {
330
+ config = { ...Default,
331
+ ...config
332
+ };
333
+ typeCheckConfig(NAME, config, DefaultType);
287
334
  return config;
288
- };
335
+ }
289
336
 
290
- _proto._handleSwipe = function _handleSwipe() {
291
- var absDeltax = Math.abs(this.touchDeltaX);
337
+ _handleSwipe() {
338
+ const absDeltax = Math.abs(this.touchDeltaX);
292
339
 
293
340
  if (absDeltax <= SWIPE_THRESHOLD) {
294
341
  return;
295
342
  }
296
343
 
297
- var direction = absDeltax / this.touchDeltaX;
298
- this.touchDeltaX = 0; // swipe left
299
-
300
- if (direction > 0) {
301
- this.prev();
302
- } // swipe right
303
-
344
+ const direction = absDeltax / this.touchDeltaX;
345
+ this.touchDeltaX = 0;
304
346
 
305
- if (direction < 0) {
306
- this.next();
347
+ if (!direction) {
348
+ return;
307
349
  }
308
- };
309
350
 
310
- _proto._addEventListeners = function _addEventListeners() {
311
- var _this2 = this;
351
+ this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);
352
+ }
312
353
 
354
+ _addEventListeners() {
313
355
  if (this._config.keyboard) {
314
- $(this._element).on(Event.KEYDOWN, function (event) {
315
- return _this2._keydown(event);
316
- });
356
+ EventHandler__default['default'].on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
317
357
  }
318
358
 
319
359
  if (this._config.pause === 'hover') {
320
- $(this._element).on(Event.MOUSEENTER, function (event) {
321
- return _this2.pause(event);
322
- }).on(Event.MOUSELEAVE, function (event) {
323
- return _this2.cycle(event);
324
- });
360
+ EventHandler__default['default'].on(this._element, EVENT_MOUSEENTER, event => this.pause(event));
361
+ EventHandler__default['default'].on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));
325
362
  }
326
363
 
327
- if (this._config.touch) {
364
+ if (this._config.touch && this._touchSupported) {
328
365
  this._addTouchEventListeners();
329
366
  }
330
- };
331
-
332
- _proto._addTouchEventListeners = function _addTouchEventListeners() {
333
- var _this3 = this;
334
-
335
- if (!this._touchSupported) {
336
- return;
337
- }
367
+ }
338
368
 
339
- var start = function start(event) {
340
- if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
341
- _this3.touchStartX = event.originalEvent.clientX;
342
- } else if (!_this3._pointerEvent) {
343
- _this3.touchStartX = event.originalEvent.touches[0].clientX;
369
+ _addTouchEventListeners() {
370
+ const start = event => {
371
+ if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
372
+ this.touchStartX = event.clientX;
373
+ } else if (!this._pointerEvent) {
374
+ this.touchStartX = event.touches[0].clientX;
344
375
  }
345
376
  };
346
377
 
347
- var move = function move(event) {
378
+ const move = event => {
348
379
  // ensure swiping with one touch and not pinching
349
- if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
350
- _this3.touchDeltaX = 0;
351
- } else {
352
- _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;
353
- }
380
+ this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;
354
381
  };
355
382
 
356
- var end = function end(event) {
357
- if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
358
- _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;
383
+ const end = event => {
384
+ if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
385
+ this.touchDeltaX = event.clientX - this.touchStartX;
359
386
  }
360
387
 
361
- _this3._handleSwipe();
388
+ this._handleSwipe();
362
389
 
363
- if (_this3._config.pause === 'hover') {
390
+ if (this._config.pause === 'hover') {
364
391
  // If it's a touch-enabled device, mouseenter/leave are fired as
365
392
  // part of the mouse compatibility events on first tap - the carousel
366
393
  // would stop cycling until user tapped out of it;
@@ -368,147 +395,144 @@
368
395
  // (as if it's the second time we tap on it, mouseenter compat event
369
396
  // is NOT fired) and after a timeout (to allow for mouse compatibility
370
397
  // events to fire) we explicitly restart cycling
371
- _this3.pause();
398
+ this.pause();
372
399
 
373
- if (_this3.touchTimeout) {
374
- clearTimeout(_this3.touchTimeout);
400
+ if (this.touchTimeout) {
401
+ clearTimeout(this.touchTimeout);
375
402
  }
376
403
 
377
- _this3.touchTimeout = setTimeout(function (event) {
378
- return _this3.cycle(event);
379
- }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);
404
+ this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
380
405
  }
381
406
  };
382
407
 
383
- $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, function (e) {
384
- return e.preventDefault();
408
+ SelectorEngine__default['default'].find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {
409
+ EventHandler__default['default'].on(itemImg, EVENT_DRAG_START, e => e.preventDefault());
385
410
  });
386
411
 
387
412
  if (this._pointerEvent) {
388
- $(this._element).on(Event.POINTERDOWN, function (event) {
389
- return start(event);
390
- });
391
- $(this._element).on(Event.POINTERUP, function (event) {
392
- return end(event);
393
- });
413
+ EventHandler__default['default'].on(this._element, EVENT_POINTERDOWN, event => start(event));
414
+ EventHandler__default['default'].on(this._element, EVENT_POINTERUP, event => end(event));
394
415
 
395
- this._element.classList.add(ClassName.POINTER_EVENT);
416
+ this._element.classList.add(CLASS_NAME_POINTER_EVENT);
396
417
  } else {
397
- $(this._element).on(Event.TOUCHSTART, function (event) {
398
- return start(event);
399
- });
400
- $(this._element).on(Event.TOUCHMOVE, function (event) {
401
- return move(event);
402
- });
403
- $(this._element).on(Event.TOUCHEND, function (event) {
404
- return end(event);
405
- });
418
+ EventHandler__default['default'].on(this._element, EVENT_TOUCHSTART, event => start(event));
419
+ EventHandler__default['default'].on(this._element, EVENT_TOUCHMOVE, event => move(event));
420
+ EventHandler__default['default'].on(this._element, EVENT_TOUCHEND, event => end(event));
406
421
  }
407
- };
422
+ }
408
423
 
409
- _proto._keydown = function _keydown(event) {
424
+ _keydown(event) {
410
425
  if (/input|textarea/i.test(event.target.tagName)) {
411
426
  return;
412
427
  }
413
428
 
414
- switch (event.which) {
415
- case ARROW_LEFT_KEYCODE:
416
- event.preventDefault();
417
- this.prev();
418
- break;
429
+ if (event.key === ARROW_LEFT_KEY) {
430
+ event.preventDefault();
419
431
 
420
- case ARROW_RIGHT_KEYCODE:
421
- event.preventDefault();
422
- this.next();
423
- break;
432
+ this._slide(DIRECTION_RIGHT);
433
+ } else if (event.key === ARROW_RIGHT_KEY) {
434
+ event.preventDefault();
435
+
436
+ this._slide(DIRECTION_LEFT);
424
437
  }
425
- };
438
+ }
426
439
 
427
- _proto._getItemIndex = function _getItemIndex(element) {
428
- this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : [];
440
+ _getItemIndex(element) {
441
+ this._items = element && element.parentNode ? SelectorEngine__default['default'].find(SELECTOR_ITEM, element.parentNode) : [];
429
442
  return this._items.indexOf(element);
430
- };
443
+ }
431
444
 
432
- _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
433
- var isNextDirection = direction === Direction.NEXT;
434
- var isPrevDirection = direction === Direction.PREV;
445
+ _getItemByOrder(order, activeElement) {
446
+ const isNext = order === ORDER_NEXT;
447
+ const isPrev = order === ORDER_PREV;
435
448
 
436
- var activeIndex = this._getItemIndex(activeElement);
449
+ const activeIndex = this._getItemIndex(activeElement);
437
450
 
438
- var lastItemIndex = this._items.length - 1;
439
- var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
451
+ const lastItemIndex = this._items.length - 1;
452
+ const isGoingToWrap = isPrev && activeIndex === 0 || isNext && activeIndex === lastItemIndex;
440
453
 
441
454
  if (isGoingToWrap && !this._config.wrap) {
442
455
  return activeElement;
443
456
  }
444
457
 
445
- var delta = direction === Direction.PREV ? -1 : 1;
446
- var itemIndex = (activeIndex + delta) % this._items.length;
458
+ const delta = isPrev ? -1 : 1;
459
+ const itemIndex = (activeIndex + delta) % this._items.length;
447
460
  return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
448
- };
461
+ }
449
462
 
450
- _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
451
- var targetIndex = this._getItemIndex(relatedTarget);
463
+ _triggerSlideEvent(relatedTarget, eventDirectionName) {
464
+ const targetIndex = this._getItemIndex(relatedTarget);
452
465
 
453
- var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM));
466
+ const fromIndex = this._getItemIndex(SelectorEngine__default['default'].findOne(SELECTOR_ACTIVE_ITEM, this._element));
454
467
 
455
- var slideEvent = $.Event(Event.SLIDE, {
456
- relatedTarget: relatedTarget,
468
+ return EventHandler__default['default'].trigger(this._element, EVENT_SLIDE, {
469
+ relatedTarget,
457
470
  direction: eventDirectionName,
458
471
  from: fromIndex,
459
472
  to: targetIndex
460
473
  });
461
- $(this._element).trigger(slideEvent);
462
- return slideEvent;
463
- };
474
+ }
464
475
 
465
- _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
476
+ _setActiveIndicatorElement(element) {
466
477
  if (this._indicatorsElement) {
467
- var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE));
468
- $(indicators).removeClass(ClassName.ACTIVE);
478
+ const activeIndicator = SelectorEngine__default['default'].findOne(SELECTOR_ACTIVE, this._indicatorsElement);
479
+ activeIndicator.classList.remove(CLASS_NAME_ACTIVE);
480
+ activeIndicator.removeAttribute('aria-current');
481
+ const indicators = SelectorEngine__default['default'].find(SELECTOR_INDICATOR, this._indicatorsElement);
482
+
483
+ for (let i = 0; i < indicators.length; i++) {
484
+ if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {
485
+ indicators[i].classList.add(CLASS_NAME_ACTIVE);
486
+ indicators[i].setAttribute('aria-current', 'true');
487
+ break;
488
+ }
489
+ }
490
+ }
491
+ }
469
492
 
470
- var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
493
+ _updateInterval() {
494
+ const element = this._activeElement || SelectorEngine__default['default'].findOne(SELECTOR_ACTIVE_ITEM, this._element);
471
495
 
472
- if (nextIndicator) {
473
- $(nextIndicator).addClass(ClassName.ACTIVE);
474
- }
496
+ if (!element) {
497
+ return;
498
+ }
499
+
500
+ const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
501
+
502
+ if (elementInterval) {
503
+ this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
504
+ this._config.interval = elementInterval;
505
+ } else {
506
+ this._config.interval = this._config.defaultInterval || this._config.interval;
475
507
  }
476
- };
508
+ }
477
509
 
478
- _proto._slide = function _slide(direction, element) {
479
- var _this4 = this;
510
+ _slide(directionOrOrder, element) {
511
+ const order = this._directionToOrder(directionOrOrder);
480
512
 
481
- var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
513
+ const activeElement = SelectorEngine__default['default'].findOne(SELECTOR_ACTIVE_ITEM, this._element);
482
514
 
483
- var activeElementIndex = this._getItemIndex(activeElement);
515
+ const activeElementIndex = this._getItemIndex(activeElement);
484
516
 
485
- var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
517
+ const nextElement = element || this._getItemByOrder(order, activeElement);
486
518
 
487
- var nextElementIndex = this._getItemIndex(nextElement);
519
+ const nextElementIndex = this._getItemIndex(nextElement);
488
520
 
489
- var isCycling = Boolean(this._interval);
490
- var directionalClassName;
491
- var orderClassName;
492
- var eventDirectionName;
521
+ const isCycling = Boolean(this._interval);
522
+ const isNext = order === ORDER_NEXT;
523
+ const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
524
+ const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
493
525
 
494
- if (direction === Direction.NEXT) {
495
- directionalClassName = ClassName.LEFT;
496
- orderClassName = ClassName.NEXT;
497
- eventDirectionName = Direction.LEFT;
498
- } else {
499
- directionalClassName = ClassName.RIGHT;
500
- orderClassName = ClassName.PREV;
501
- eventDirectionName = Direction.RIGHT;
502
- }
526
+ const eventDirectionName = this._orderToDirection(order);
503
527
 
504
- if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {
528
+ if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
505
529
  this._isSliding = false;
506
530
  return;
507
531
  }
508
532
 
509
- var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
533
+ const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
510
534
 
511
- if (slideEvent.isDefaultPrevented()) {
535
+ if (slideEvent.defaultPrevented) {
512
536
  return;
513
537
  }
514
538
 
@@ -525,125 +549,133 @@
525
549
 
526
550
  this._setActiveIndicatorElement(nextElement);
527
551
 
528
- var slidEvent = $.Event(Event.SLID, {
529
- relatedTarget: nextElement,
530
- direction: eventDirectionName,
531
- from: activeElementIndex,
532
- to: nextElementIndex
533
- });
552
+ this._activeElement = nextElement;
534
553
 
535
- if ($(this._element).hasClass(ClassName.SLIDE)) {
536
- $(nextElement).addClass(orderClassName);
537
- Util.reflow(nextElement);
538
- $(activeElement).addClass(directionalClassName);
539
- $(nextElement).addClass(directionalClassName);
540
- var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);
541
-
542
- if (nextElementInterval) {
543
- this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
544
- this._config.interval = nextElementInterval;
545
- } else {
546
- this._config.interval = this._config.defaultInterval || this._config.interval;
547
- }
554
+ const triggerSlidEvent = () => {
555
+ EventHandler__default['default'].trigger(this._element, EVENT_SLID, {
556
+ relatedTarget: nextElement,
557
+ direction: eventDirectionName,
558
+ from: activeElementIndex,
559
+ to: nextElementIndex
560
+ });
561
+ };
548
562
 
549
- var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
550
- $(activeElement).one(Util.TRANSITION_END, function () {
551
- $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE);
552
- $(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName);
553
- _this4._isSliding = false;
554
- setTimeout(function () {
555
- return $(_this4._element).trigger(slidEvent);
556
- }, 0);
557
- }).emulateTransitionEnd(transitionDuration);
563
+ if (this._element.classList.contains(CLASS_NAME_SLIDE)) {
564
+ nextElement.classList.add(orderClassName);
565
+ reflow(nextElement);
566
+ activeElement.classList.add(directionalClassName);
567
+ nextElement.classList.add(directionalClassName);
568
+
569
+ const completeCallBack = () => {
570
+ nextElement.classList.remove(directionalClassName, orderClassName);
571
+ nextElement.classList.add(CLASS_NAME_ACTIVE);
572
+ activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName);
573
+ this._isSliding = false;
574
+ setTimeout(triggerSlidEvent, 0);
575
+ };
576
+
577
+ this._queueCallback(completeCallBack, activeElement, true);
558
578
  } else {
559
- $(activeElement).removeClass(ClassName.ACTIVE);
560
- $(nextElement).addClass(ClassName.ACTIVE);
579
+ activeElement.classList.remove(CLASS_NAME_ACTIVE);
580
+ nextElement.classList.add(CLASS_NAME_ACTIVE);
561
581
  this._isSliding = false;
562
- $(this._element).trigger(slidEvent);
582
+ triggerSlidEvent();
563
583
  }
564
584
 
565
585
  if (isCycling) {
566
586
  this.cycle();
567
587
  }
568
- } // Static
569
- ;
588
+ }
570
589
 
571
- Carousel._jQueryInterface = function _jQueryInterface(config) {
572
- return this.each(function () {
573
- var data = $(this).data(DATA_KEY);
590
+ _directionToOrder(direction) {
591
+ if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
592
+ return direction;
593
+ }
574
594
 
575
- var _config = _objectSpread2({}, Default, {}, $(this).data());
595
+ if (isRTL()) {
596
+ return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
597
+ }
576
598
 
577
- if (typeof config === 'object') {
578
- _config = _objectSpread2({}, _config, {}, config);
579
- }
599
+ return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
600
+ }
580
601
 
581
- var action = typeof config === 'string' ? config : _config.slide;
602
+ _orderToDirection(order) {
603
+ if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
604
+ return order;
605
+ }
582
606
 
583
- if (!data) {
584
- data = new Carousel(this, _config);
585
- $(this).data(DATA_KEY, data);
586
- }
607
+ if (isRTL()) {
608
+ return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
609
+ }
587
610
 
588
- if (typeof config === 'number') {
589
- data.to(config);
590
- } else if (typeof action === 'string') {
591
- if (typeof data[action] === 'undefined') {
592
- throw new TypeError("No method named \"" + action + "\"");
593
- }
611
+ return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
612
+ } // Static
594
613
 
595
- data[action]();
596
- } else if (_config.interval && _config.ride) {
597
- data.pause();
598
- data.cycle();
599
- }
600
- });
601
- };
602
614
 
603
- Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
604
- var selector = Util.getSelectorFromElement(this);
615
+ static carouselInterface(element, config) {
616
+ let data = Data__default['default'].get(element, DATA_KEY);
617
+ let _config = { ...Default,
618
+ ...Manipulator__default['default'].getDataAttributes(element)
619
+ };
605
620
 
606
- if (!selector) {
607
- return;
621
+ if (typeof config === 'object') {
622
+ _config = { ..._config,
623
+ ...config
624
+ };
608
625
  }
609
626
 
610
- var target = $(selector)[0];
627
+ const action = typeof config === 'string' ? config : _config.slide;
611
628
 
612
- if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {
613
- return;
629
+ if (!data) {
630
+ data = new Carousel(element, _config);
614
631
  }
615
632
 
616
- var config = _objectSpread2({}, $(target).data(), {}, $(this).data());
633
+ if (typeof config === 'number') {
634
+ data.to(config);
635
+ } else if (typeof action === 'string') {
636
+ if (typeof data[action] === 'undefined') {
637
+ throw new TypeError(`No method named "${action}"`);
638
+ }
617
639
 
618
- var slideIndex = this.getAttribute('data-slide-to');
640
+ data[action]();
641
+ } else if (_config.interval && _config.ride) {
642
+ data.pause();
643
+ data.cycle();
644
+ }
645
+ }
646
+
647
+ static jQueryInterface(config) {
648
+ return this.each(function () {
649
+ Carousel.carouselInterface(this, config);
650
+ });
651
+ }
652
+
653
+ static dataApiClickHandler(event) {
654
+ const target = getElementFromSelector(this);
655
+
656
+ if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
657
+ return;
658
+ }
659
+
660
+ const config = { ...Manipulator__default['default'].getDataAttributes(target),
661
+ ...Manipulator__default['default'].getDataAttributes(this)
662
+ };
663
+ const slideIndex = this.getAttribute('data-bs-slide-to');
619
664
 
620
665
  if (slideIndex) {
621
666
  config.interval = false;
622
667
  }
623
668
 
624
- Carousel._jQueryInterface.call($(target), config);
669
+ Carousel.carouselInterface(target, config);
625
670
 
626
671
  if (slideIndex) {
627
- $(target).data(DATA_KEY).to(slideIndex);
672
+ Data__default['default'].get(target, DATA_KEY).to(slideIndex);
628
673
  }
629
674
 
630
675
  event.preventDefault();
631
- };
632
-
633
- _createClass(Carousel, null, [{
634
- key: "VERSION",
635
- get: function get() {
636
- return VERSION;
637
- }
638
- }, {
639
- key: "Default",
640
- get: function get() {
641
- return Default;
642
- }
643
- }]);
676
+ }
644
677
 
645
- return Carousel;
646
- }();
678
+ }
647
679
  /**
648
680
  * ------------------------------------------------------------------------
649
681
  * Data Api implementation
@@ -651,29 +683,22 @@
651
683
  */
652
684
 
653
685
 
654
- $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
655
- $(window).on(Event.LOAD_DATA_API, function () {
656
- var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE));
657
-
658
- for (var i = 0, len = carousels.length; i < len; i++) {
659
- var $carousel = $(carousels[i]);
686
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);
687
+ EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => {
688
+ const carousels = SelectorEngine__default['default'].find(SELECTOR_DATA_RIDE);
660
689
 
661
- Carousel._jQueryInterface.call($carousel, $carousel.data());
690
+ for (let i = 0, len = carousels.length; i < len; i++) {
691
+ Carousel.carouselInterface(carousels[i], Data__default['default'].get(carousels[i], DATA_KEY));
662
692
  }
663
693
  });
664
694
  /**
665
695
  * ------------------------------------------------------------------------
666
696
  * jQuery
667
697
  * ------------------------------------------------------------------------
698
+ * add .Carousel to jQuery only if jQuery is present
668
699
  */
669
700
 
670
- $.fn[NAME] = Carousel._jQueryInterface;
671
- $.fn[NAME].Constructor = Carousel;
672
-
673
- $.fn[NAME].noConflict = function () {
674
- $.fn[NAME] = JQUERY_NO_CONFLICT;
675
- return Carousel._jQueryInterface;
676
- };
701
+ defineJQueryPlugin(Carousel);
677
702
 
678
703
  return Carousel;
679
704