bootstrap 4.3.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +17 -2
  3. data/CHANGELOG.md +2 -14
  4. data/README.md +7 -4
  5. data/assets/javascripts/bootstrap/alert.js +173 -137
  6. data/assets/javascripts/bootstrap/base-component.js +182 -0
  7. data/assets/javascripts/bootstrap/button.js +102 -143
  8. data/assets/javascripts/bootstrap/carousel.js +481 -410
  9. data/assets/javascripts/bootstrap/collapse.js +340 -274
  10. data/assets/javascripts/bootstrap/dom/data.js +68 -0
  11. data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
  12. data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
  13. data/assets/javascripts/bootstrap/dom/selector-engine.js +127 -0
  14. data/assets/javascripts/bootstrap/dropdown.js +494 -400
  15. data/assets/javascripts/bootstrap/modal.js +834 -450
  16. data/assets/javascripts/bootstrap/offcanvas.js +866 -0
  17. data/assets/javascripts/bootstrap/popover.js +122 -199
  18. data/assets/javascripts/bootstrap/scrollspy.js +257 -241
  19. data/assets/javascripts/bootstrap/tab.js +219 -155
  20. data/assets/javascripts/bootstrap/toast.js +330 -190
  21. data/assets/javascripts/bootstrap/tooltip.js +710 -472
  22. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  23. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  24. data/assets/javascripts/bootstrap-sprockets.js +8 -1
  25. data/assets/javascripts/bootstrap.js +3547 -2809
  26. data/assets/javascripts/bootstrap.min.js +4 -4
  27. data/assets/stylesheets/_bootstrap-grid.scss +54 -18
  28. data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
  29. data/assets/stylesheets/_bootstrap.scss +20 -11
  30. data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
  31. data/assets/stylesheets/bootstrap/_alert.scss +15 -9
  32. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  33. data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
  34. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  35. data/assets/stylesheets/bootstrap/_buttons.scss +28 -54
  36. data/assets/stylesheets/bootstrap/_card.scss +52 -125
  37. data/assets/stylesheets/bootstrap/_carousel.scss +70 -38
  38. data/assets/stylesheets/bootstrap/_close.scss +30 -31
  39. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  40. data/assets/stylesheets/bootstrap/_dropdown.scss +88 -39
  41. data/assets/stylesheets/bootstrap/_forms.scss +9 -330
  42. data/assets/stylesheets/bootstrap/_functions.scss +237 -27
  43. data/assets/stylesheets/bootstrap/_grid.scss +14 -33
  44. data/assets/stylesheets/bootstrap/_helpers.scss +9 -0
  45. data/assets/stylesheets/bootstrap/_images.scss +3 -3
  46. data/assets/stylesheets/bootstrap/_list-group.scss +61 -36
  47. data/assets/stylesheets/bootstrap/_mixins.scss +12 -16
  48. data/assets/stylesheets/bootstrap/_modal.scss +64 -84
  49. data/assets/stylesheets/bootstrap/_nav.scss +29 -10
  50. data/assets/stylesheets/bootstrap/_navbar.scss +93 -52
  51. data/assets/stylesheets/bootstrap/_offcanvas.scss +83 -0
  52. data/assets/stylesheets/bootstrap/_pagination.scss +13 -22
  53. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  54. data/assets/stylesheets/bootstrap/_popover.scss +29 -42
  55. data/assets/stylesheets/bootstrap/_progress.scss +10 -5
  56. data/assets/stylesheets/bootstrap/_reboot.scss +350 -208
  57. data/assets/stylesheets/bootstrap/_root.scss +42 -8
  58. data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
  59. data/assets/stylesheets/bootstrap/_tables.scss +80 -114
  60. data/assets/stylesheets/bootstrap/_toasts.scss +21 -14
  61. data/assets/stylesheets/bootstrap/_tooltip.scss +21 -21
  62. data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
  63. data/assets/stylesheets/bootstrap/_type.scss +40 -61
  64. data/assets/stylesheets/bootstrap/_utilities.scss +630 -17
  65. data/assets/stylesheets/bootstrap/_variables.scss +993 -487
  66. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  67. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +63 -0
  68. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  69. data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
  70. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  71. data/assets/stylesheets/bootstrap/forms/_form-select.scss +70 -0
  72. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  73. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  74. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  75. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  76. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  77. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  78. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  79. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  80. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  81. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  82. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  83. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  84. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  85. data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
  86. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  87. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +37 -22
  88. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  89. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  90. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -51
  91. data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
  92. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  93. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  94. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  95. data/assets/stylesheets/bootstrap/mixins/_forms.scss +67 -115
  96. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  97. data/assets/stylesheets/bootstrap/mixins/_grid.scss +131 -32
  98. data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
  99. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
  100. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
  101. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
  102. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  103. data/assets/stylesheets/bootstrap/mixins/_transition.scss +18 -8
  104. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +89 -0
  105. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  106. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  107. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +274 -132
  108. data/bootstrap.gemspec +4 -6
  109. data/lib/bootstrap/version.rb +2 -2
  110. data/tasks/updater/js.rb +25 -6
  111. data/tasks/updater/network.rb +8 -2
  112. data/test/dummy_rails/app/assets/config/manifest.js +3 -0
  113. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  114. data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
  115. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  116. data/test/dummy_rails/app/views/pages/root.html +89 -0
  117. data/test/dummy_rails/config/application.rb +0 -3
  118. data/test/gemfiles/rails_6_0.gemfile +7 -0
  119. data/test/gemfiles/rails_6_1.gemfile +7 -0
  120. data/test/support/dummy_rails_integration.rb +3 -1
  121. data/test/test_helper.rb +18 -13
  122. metadata +61 -79
  123. data/assets/javascripts/bootstrap/util.js +0 -171
  124. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  125. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -507
  126. data/assets/stylesheets/bootstrap/_input-group.scss +0 -193
  127. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  128. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  129. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  130. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  131. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  132. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  133. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -66
  134. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  135. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  136. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
  137. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  138. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  139. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -16
  140. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  141. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  142. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  143. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  144. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  145. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  146. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  147. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  148. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  149. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  150. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  151. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  152. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  153. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  154. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  155. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  156. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  157. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  158. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -1,260 +1,183 @@
1
1
  /*!
2
- * Bootstrap popover.js v4.3.0 (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 popover.js v5.1.0 (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('./tooltip.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', './tooltip.js'], factory) :
9
- (global = global || self, global.Popover = factory(global.jQuery, global.Tooltip));
10
- }(this, function ($, Tooltip) { 'use strict';
11
-
12
- $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
13
- Tooltip = Tooltip && Tooltip.hasOwnProperty('default') ? Tooltip['default'] : Tooltip;
14
-
15
- function _defineProperties(target, props) {
16
- for (var i = 0; i < props.length; i++) {
17
- var descriptor = props[i];
18
- descriptor.enumerable = descriptor.enumerable || false;
19
- descriptor.configurable = true;
20
- if ("value" in descriptor) descriptor.writable = true;
21
- Object.defineProperty(target, descriptor.key, descriptor);
22
- }
23
- }
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./tooltip.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./tooltip'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.Tooltip));
10
+ }(this, (function (Tooltip) { 'use strict';
24
11
 
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
30
13
 
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;
14
+ var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
15
+
16
+ /**
17
+ * --------------------------------------------------------------------------
18
+ * Bootstrap (v5.1.0): util/index.js
19
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
20
+ * --------------------------------------------------------------------------
21
+ */
22
+
23
+ const getjQuery = () => {
24
+ const {
25
+ jQuery
26
+ } = window;
27
+
28
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
29
+ return jQuery;
41
30
  }
42
31
 
43
- return obj;
44
- }
32
+ return null;
33
+ };
45
34
 
46
- function _objectSpread(target) {
47
- for (var i = 1; i < arguments.length; i++) {
48
- var source = arguments[i] != null ? arguments[i] : {};
49
- var ownKeys = Object.keys(source);
35
+ const DOMContentLoadedCallbacks = [];
50
36
 
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
37
+ const onDOMContentLoaded = callback => {
38
+ if (document.readyState === 'loading') {
39
+ // add listener on the first call when the document is in loading state
40
+ if (!DOMContentLoadedCallbacks.length) {
41
+ document.addEventListener('DOMContentLoaded', () => {
42
+ DOMContentLoadedCallbacks.forEach(callback => callback());
43
+ });
55
44
  }
56
45
 
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
59
- });
46
+ DOMContentLoadedCallbacks.push(callback);
47
+ } else {
48
+ callback();
60
49
  }
50
+ };
61
51
 
62
- return target;
63
- }
64
-
65
- function _inheritsLoose(subClass, superClass) {
66
- subClass.prototype = Object.create(superClass.prototype);
67
- subClass.prototype.constructor = subClass;
68
- subClass.__proto__ = superClass;
69
- }
52
+ const defineJQueryPlugin = plugin => {
53
+ onDOMContentLoaded(() => {
54
+ const $ = getjQuery();
55
+ /* istanbul ignore if */
56
+
57
+ if ($) {
58
+ const name = plugin.NAME;
59
+ const JQUERY_NO_CONFLICT = $.fn[name];
60
+ $.fn[name] = plugin.jQueryInterface;
61
+ $.fn[name].Constructor = plugin;
62
+
63
+ $.fn[name].noConflict = () => {
64
+ $.fn[name] = JQUERY_NO_CONFLICT;
65
+ return plugin.jQueryInterface;
66
+ };
67
+ }
68
+ });
69
+ };
70
70
 
71
+ /**
72
+ * --------------------------------------------------------------------------
73
+ * Bootstrap (v5.1.0): popover.js
74
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
75
+ * --------------------------------------------------------------------------
76
+ */
71
77
  /**
72
78
  * ------------------------------------------------------------------------
73
79
  * Constants
74
80
  * ------------------------------------------------------------------------
75
81
  */
76
82
 
77
- var NAME = 'popover';
78
- var VERSION = '4.3.0';
79
- var DATA_KEY = 'bs.popover';
80
- var EVENT_KEY = "." + DATA_KEY;
81
- var JQUERY_NO_CONFLICT = $.fn[NAME];
82
- var CLASS_PREFIX = 'bs-popover';
83
- var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
84
-
85
- var Default = _objectSpread({}, Tooltip.Default, {
83
+ const NAME = 'popover';
84
+ const DATA_KEY = 'bs.popover';
85
+ const EVENT_KEY = `.${DATA_KEY}`;
86
+ const CLASS_PREFIX = 'bs-popover';
87
+ const Default = { ...Tooltip__default['default'].Default,
86
88
  placement: 'right',
89
+ offset: [0, 8],
87
90
  trigger: 'click',
88
91
  content: '',
89
- template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
90
- });
91
-
92
- var DefaultType = _objectSpread({}, Tooltip.DefaultType, {
93
- content: '(string|element|function)'
94
- });
95
-
96
- var ClassName = {
97
- FADE: 'fade',
98
- SHOW: 'show'
92
+ template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>'
99
93
  };
100
- var Selector = {
101
- TITLE: '.popover-header',
102
- CONTENT: '.popover-body'
94
+ const DefaultType = { ...Tooltip__default['default'].DefaultType,
95
+ content: '(string|element|function)'
103
96
  };
104
- var Event = {
105
- HIDE: "hide" + EVENT_KEY,
106
- HIDDEN: "hidden" + EVENT_KEY,
107
- SHOW: "show" + EVENT_KEY,
108
- SHOWN: "shown" + EVENT_KEY,
109
- INSERTED: "inserted" + EVENT_KEY,
110
- CLICK: "click" + EVENT_KEY,
111
- FOCUSIN: "focusin" + EVENT_KEY,
112
- FOCUSOUT: "focusout" + EVENT_KEY,
113
- MOUSEENTER: "mouseenter" + EVENT_KEY,
114
- MOUSELEAVE: "mouseleave" + EVENT_KEY
115
- /**
116
- * ------------------------------------------------------------------------
117
- * Class Definition
118
- * ------------------------------------------------------------------------
119
- */
120
-
97
+ const Event = {
98
+ HIDE: `hide${EVENT_KEY}`,
99
+ HIDDEN: `hidden${EVENT_KEY}`,
100
+ SHOW: `show${EVENT_KEY}`,
101
+ SHOWN: `shown${EVENT_KEY}`,
102
+ INSERTED: `inserted${EVENT_KEY}`,
103
+ CLICK: `click${EVENT_KEY}`,
104
+ FOCUSIN: `focusin${EVENT_KEY}`,
105
+ FOCUSOUT: `focusout${EVENT_KEY}`,
106
+ MOUSEENTER: `mouseenter${EVENT_KEY}`,
107
+ MOUSELEAVE: `mouseleave${EVENT_KEY}`
121
108
  };
109
+ const SELECTOR_TITLE = '.popover-header';
110
+ const SELECTOR_CONTENT = '.popover-body';
111
+ /**
112
+ * ------------------------------------------------------------------------
113
+ * Class Definition
114
+ * ------------------------------------------------------------------------
115
+ */
122
116
 
123
- var Popover =
124
- /*#__PURE__*/
125
- function (_Tooltip) {
126
- _inheritsLoose(Popover, _Tooltip);
127
-
128
- function Popover() {
129
- return _Tooltip.apply(this, arguments) || this;
117
+ class Popover extends Tooltip__default['default'] {
118
+ // Getters
119
+ static get Default() {
120
+ return Default;
130
121
  }
131
122
 
132
- var _proto = Popover.prototype;
133
-
134
- // Overrides
135
- _proto.isWithContent = function isWithContent() {
136
- return this.getTitle() || this._getContent();
137
- };
138
-
139
- _proto.addAttachmentClass = function addAttachmentClass(attachment) {
140
- $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
141
- };
123
+ static get NAME() {
124
+ return NAME;
125
+ }
142
126
 
143
- _proto.getTipElement = function getTipElement() {
144
- this.tip = this.tip || $(this.config.template)[0];
145
- return this.tip;
146
- };
127
+ static get Event() {
128
+ return Event;
129
+ }
147
130
 
148
- _proto.setContent = function setContent() {
149
- var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events
131
+ static get DefaultType() {
132
+ return DefaultType;
133
+ } // Overrides
150
134
 
151
- this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
152
135
 
153
- var content = this._getContent();
136
+ isWithContent() {
137
+ return this.getTitle() || this._getContent();
138
+ }
154
139
 
155
- if (typeof content === 'function') {
156
- content = content.call(this.element);
157
- }
140
+ setContent(tip) {
141
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
158
142
 
159
- this.setElementContent($tip.find(Selector.CONTENT), content);
160
- $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
143
+ this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
161
144
  } // Private
162
- ;
163
145
 
164
- _proto._getContent = function _getContent() {
165
- return this.element.getAttribute('data-content') || this.config.content;
166
- };
167
146
 
168
- _proto._cleanTipClass = function _cleanTipClass() {
169
- var $tip = $(this.getTipElement());
170
- var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
147
+ _getContent() {
148
+ return this._resolvePossibleFunction(this._config.content);
149
+ }
171
150
 
172
- if (tabClass !== null && tabClass.length > 0) {
173
- $tip.removeClass(tabClass.join(''));
174
- }
151
+ _getBasicClassPrefix() {
152
+ return CLASS_PREFIX;
175
153
  } // Static
176
- ;
177
-
178
- Popover._jQueryInterface = function _jQueryInterface(config) {
179
- return this.each(function () {
180
- var data = $(this).data(DATA_KEY);
181
-
182
- var _config = typeof config === 'object' ? config : null;
183
154
 
184
- if (!data && /dispose|hide/.test(config)) {
185
- return;
186
- }
187
155
 
188
- if (!data) {
189
- data = new Popover(this, _config);
190
- $(this).data(DATA_KEY, data);
191
- }
156
+ static jQueryInterface(config) {
157
+ return this.each(function () {
158
+ const data = Popover.getOrCreateInstance(this, config);
192
159
 
193
160
  if (typeof config === 'string') {
194
161
  if (typeof data[config] === 'undefined') {
195
- throw new TypeError("No method named \"" + config + "\"");
162
+ throw new TypeError(`No method named "${config}"`);
196
163
  }
197
164
 
198
165
  data[config]();
199
166
  }
200
167
  });
201
- };
202
-
203
- _createClass(Popover, null, [{
204
- key: "VERSION",
205
- // Getters
206
- get: function get() {
207
- return VERSION;
208
- }
209
- }, {
210
- key: "Default",
211
- get: function get() {
212
- return Default;
213
- }
214
- }, {
215
- key: "NAME",
216
- get: function get() {
217
- return NAME;
218
- }
219
- }, {
220
- key: "DATA_KEY",
221
- get: function get() {
222
- return DATA_KEY;
223
- }
224
- }, {
225
- key: "Event",
226
- get: function get() {
227
- return Event;
228
- }
229
- }, {
230
- key: "EVENT_KEY",
231
- get: function get() {
232
- return EVENT_KEY;
233
- }
234
- }, {
235
- key: "DefaultType",
236
- get: function get() {
237
- return DefaultType;
238
- }
239
- }]);
168
+ }
240
169
 
241
- return Popover;
242
- }(Tooltip);
170
+ }
243
171
  /**
244
172
  * ------------------------------------------------------------------------
245
173
  * jQuery
246
174
  * ------------------------------------------------------------------------
175
+ * add .Popover to jQuery only if jQuery is present
247
176
  */
248
177
 
249
178
 
250
- $.fn[NAME] = Popover._jQueryInterface;
251
- $.fn[NAME].Constructor = Popover;
252
-
253
- $.fn[NAME].noConflict = function () {
254
- $.fn[NAME] = JQUERY_NO_CONFLICT;
255
- return Popover._jQueryInterface;
256
- };
179
+ defineJQueryPlugin(Popover);
257
180
 
258
181
  return Popover;
259
182
 
260
- }));
183
+ })));
@@ -1,243 +1,296 @@
1
1
  /*!
2
- * Bootstrap scrollspy.js v4.3.0 (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 scrollspy.js v5.1.0 (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.ScrollSpy = 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/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ScrollSpy = factory(global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
+ }(this, (function (EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
17
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
+
19
+ /**
20
+ * --------------------------------------------------------------------------
21
+ * Bootstrap (v5.1.0): util/index.js
22
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
23
+ * --------------------------------------------------------------------------
24
+ */
25
+
26
+ const toType = obj => {
27
+ if (obj === null || obj === undefined) {
28
+ return `${obj}`;
22
29
  }
23
- }
24
30
 
25
- function _createClass(Constructor, protoProps, staticProps) {
26
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
27
- if (staticProps) _defineProperties(Constructor, staticProps);
28
- return Constructor;
29
- }
31
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
32
+ };
30
33
 
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;
34
+ const getSelector = element => {
35
+ let selector = element.getAttribute('data-bs-target');
36
+
37
+ if (!selector || selector === '#') {
38
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
39
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
40
+ // `document.querySelector` will rightfully complain it is invalid.
41
+ // See https://github.com/twbs/bootstrap/issues/32273
42
+
43
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
44
+ return null;
45
+ } // Just in case some CMS puts out a full URL with the anchor appended
46
+
47
+
48
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
49
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
50
+ }
51
+
52
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
41
53
  }
42
54
 
43
- return obj;
44
- }
55
+ return selector;
56
+ };
45
57
 
46
- function _objectSpread(target) {
47
- for (var i = 1; i < arguments.length; i++) {
48
- var source = arguments[i] != null ? arguments[i] : {};
49
- var ownKeys = Object.keys(source);
58
+ const getSelectorFromElement = element => {
59
+ const selector = getSelector(element);
50
60
 
51
- if (typeof Object.getOwnPropertySymbols === 'function') {
52
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
53
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
54
- }));
61
+ if (selector) {
62
+ return document.querySelector(selector) ? selector : null;
63
+ }
64
+
65
+ return null;
66
+ };
67
+
68
+ const isElement = obj => {
69
+ if (!obj || typeof obj !== 'object') {
70
+ return false;
71
+ }
72
+
73
+ if (typeof obj.jquery !== 'undefined') {
74
+ obj = obj[0];
75
+ }
76
+
77
+ return typeof obj.nodeType !== 'undefined';
78
+ };
79
+
80
+ const getElement = obj => {
81
+ if (isElement(obj)) {
82
+ // it's a jQuery object or a node element
83
+ return obj.jquery ? obj[0] : obj;
84
+ }
85
+
86
+ if (typeof obj === 'string' && obj.length > 0) {
87
+ return document.querySelector(obj);
88
+ }
89
+
90
+ return null;
91
+ };
92
+
93
+ const typeCheckConfig = (componentName, config, configTypes) => {
94
+ Object.keys(configTypes).forEach(property => {
95
+ const expectedTypes = configTypes[property];
96
+ const value = config[property];
97
+ const valueType = value && isElement(value) ? 'element' : toType(value);
98
+
99
+ if (!new RegExp(expectedTypes).test(valueType)) {
100
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
55
101
  }
102
+ });
103
+ };
56
104
 
57
- ownKeys.forEach(function (key) {
58
- _defineProperty(target, key, source[key]);
59
- });
105
+ const getjQuery = () => {
106
+ const {
107
+ jQuery
108
+ } = window;
109
+
110
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
111
+ return jQuery;
60
112
  }
61
113
 
62
- return target;
63
- }
114
+ return null;
115
+ };
116
+
117
+ const DOMContentLoadedCallbacks = [];
118
+
119
+ const onDOMContentLoaded = callback => {
120
+ if (document.readyState === 'loading') {
121
+ // add listener on the first call when the document is in loading state
122
+ if (!DOMContentLoadedCallbacks.length) {
123
+ document.addEventListener('DOMContentLoaded', () => {
124
+ DOMContentLoadedCallbacks.forEach(callback => callback());
125
+ });
126
+ }
127
+
128
+ DOMContentLoadedCallbacks.push(callback);
129
+ } else {
130
+ callback();
131
+ }
132
+ };
133
+
134
+ const defineJQueryPlugin = plugin => {
135
+ onDOMContentLoaded(() => {
136
+ const $ = getjQuery();
137
+ /* istanbul ignore if */
138
+
139
+ if ($) {
140
+ const name = plugin.NAME;
141
+ const JQUERY_NO_CONFLICT = $.fn[name];
142
+ $.fn[name] = plugin.jQueryInterface;
143
+ $.fn[name].Constructor = plugin;
144
+
145
+ $.fn[name].noConflict = () => {
146
+ $.fn[name] = JQUERY_NO_CONFLICT;
147
+ return plugin.jQueryInterface;
148
+ };
149
+ }
150
+ });
151
+ };
64
152
 
153
+ /**
154
+ * --------------------------------------------------------------------------
155
+ * Bootstrap (v5.1.0): scrollspy.js
156
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
157
+ * --------------------------------------------------------------------------
158
+ */
65
159
  /**
66
160
  * ------------------------------------------------------------------------
67
161
  * Constants
68
162
  * ------------------------------------------------------------------------
69
163
  */
70
164
 
71
- var NAME = 'scrollspy';
72
- var VERSION = '4.3.0';
73
- var DATA_KEY = 'bs.scrollspy';
74
- var EVENT_KEY = "." + DATA_KEY;
75
- var DATA_API_KEY = '.data-api';
76
- var JQUERY_NO_CONFLICT = $.fn[NAME];
77
- var Default = {
165
+ const NAME = 'scrollspy';
166
+ const DATA_KEY = 'bs.scrollspy';
167
+ const EVENT_KEY = `.${DATA_KEY}`;
168
+ const DATA_API_KEY = '.data-api';
169
+ const Default = {
78
170
  offset: 10,
79
171
  method: 'auto',
80
172
  target: ''
81
173
  };
82
- var DefaultType = {
174
+ const DefaultType = {
83
175
  offset: 'number',
84
176
  method: 'string',
85
177
  target: '(string|element)'
86
178
  };
87
- var Event = {
88
- ACTIVATE: "activate" + EVENT_KEY,
89
- SCROLL: "scroll" + EVENT_KEY,
90
- LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
91
- };
92
- var ClassName = {
93
- DROPDOWN_ITEM: 'dropdown-item',
94
- DROPDOWN_MENU: 'dropdown-menu',
95
- ACTIVE: 'active'
96
- };
97
- var Selector = {
98
- DATA_SPY: '[data-spy="scroll"]',
99
- ACTIVE: '.active',
100
- NAV_LIST_GROUP: '.nav, .list-group',
101
- NAV_LINKS: '.nav-link',
102
- NAV_ITEMS: '.nav-item',
103
- LIST_ITEMS: '.list-group-item',
104
- DROPDOWN: '.dropdown',
105
- DROPDOWN_ITEMS: '.dropdown-item',
106
- DROPDOWN_TOGGLE: '.dropdown-toggle'
107
- };
108
- var OffsetMethod = {
109
- OFFSET: 'offset',
110
- POSITION: 'position'
111
- /**
112
- * ------------------------------------------------------------------------
113
- * Class Definition
114
- * ------------------------------------------------------------------------
115
- */
116
-
117
- };
118
-
119
- var ScrollSpy =
120
- /*#__PURE__*/
121
- function () {
122
- function ScrollSpy(element, config) {
123
- var _this = this;
179
+ const EVENT_ACTIVATE = `activate${EVENT_KEY}`;
180
+ const EVENT_SCROLL = `scroll${EVENT_KEY}`;
181
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
182
+ const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
183
+ const CLASS_NAME_ACTIVE = 'active';
184
+ const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
185
+ const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
186
+ const SELECTOR_NAV_LINKS = '.nav-link';
187
+ const SELECTOR_NAV_ITEMS = '.nav-item';
188
+ const SELECTOR_LIST_ITEMS = '.list-group-item';
189
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
190
+ const SELECTOR_DROPDOWN = '.dropdown';
191
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
192
+ const METHOD_OFFSET = 'offset';
193
+ const METHOD_POSITION = 'position';
194
+ /**
195
+ * ------------------------------------------------------------------------
196
+ * Class Definition
197
+ * ------------------------------------------------------------------------
198
+ */
124
199
 
125
- this._element = element;
126
- this._scrollElement = element.tagName === 'BODY' ? window : element;
200
+ class ScrollSpy extends BaseComponent__default['default'] {
201
+ constructor(element, config) {
202
+ super(element);
203
+ this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
127
204
  this._config = this._getConfig(config);
128
- this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS);
129
205
  this._offsets = [];
130
206
  this._targets = [];
131
207
  this._activeTarget = null;
132
208
  this._scrollHeight = 0;
133
- $(this._scrollElement).on(Event.SCROLL, function (event) {
134
- return _this._process(event);
135
- });
209
+ EventHandler__default['default'].on(this._scrollElement, EVENT_SCROLL, () => this._process());
136
210
  this.refresh();
137
211
 
138
212
  this._process();
139
213
  } // Getters
140
214
 
141
215
 
142
- var _proto = ScrollSpy.prototype;
216
+ static get Default() {
217
+ return Default;
218
+ }
219
+
220
+ static get NAME() {
221
+ return NAME;
222
+ } // Public
143
223
 
144
- // Public
145
- _proto.refresh = function refresh() {
146
- var _this2 = this;
147
224
 
148
- var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
149
- var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
150
- var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
225
+ refresh() {
226
+ const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
227
+ const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
228
+ const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
151
229
  this._offsets = [];
152
230
  this._targets = [];
153
231
  this._scrollHeight = this._getScrollHeight();
154
- var targets = [].slice.call(document.querySelectorAll(this._selector));
155
- targets.map(function (element) {
156
- var target;
157
- var targetSelector = Util.getSelectorFromElement(element);
158
-
159
- if (targetSelector) {
160
- target = document.querySelector(targetSelector);
161
- }
232
+ const targets = SelectorEngine__default['default'].find(SELECTOR_LINK_ITEMS, this._config.target);
233
+ targets.map(element => {
234
+ const targetSelector = getSelectorFromElement(element);
235
+ const target = targetSelector ? SelectorEngine__default['default'].findOne(targetSelector) : null;
162
236
 
163
237
  if (target) {
164
- var targetBCR = target.getBoundingClientRect();
238
+ const targetBCR = target.getBoundingClientRect();
165
239
 
166
240
  if (targetBCR.width || targetBCR.height) {
167
- // TODO (fat): remove sketch reliance on jQuery position/offset
168
- return [$(target)[offsetMethod]().top + offsetBase, targetSelector];
241
+ return [Manipulator__default['default'][offsetMethod](target).top + offsetBase, targetSelector];
169
242
  }
170
243
  }
171
244
 
172
245
  return null;
173
- }).filter(function (item) {
174
- return item;
175
- }).sort(function (a, b) {
176
- return a[0] - b[0];
177
- }).forEach(function (item) {
178
- _this2._offsets.push(item[0]);
179
-
180
- _this2._targets.push(item[1]);
181
- });
182
- };
183
-
184
- _proto.dispose = function dispose() {
185
- $.removeData(this._element, DATA_KEY);
186
- $(this._scrollElement).off(EVENT_KEY);
187
- this._element = null;
188
- this._scrollElement = null;
189
- this._config = null;
190
- this._selector = null;
191
- this._offsets = null;
192
- this._targets = null;
193
- this._activeTarget = null;
194
- this._scrollHeight = null;
195
- } // Private
196
- ;
197
-
198
- _proto._getConfig = function _getConfig(config) {
199
- config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
246
+ }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {
247
+ this._offsets.push(item[0]);
200
248
 
201
- if (typeof config.target !== 'string') {
202
- var id = $(config.target).attr('id');
249
+ this._targets.push(item[1]);
250
+ });
251
+ }
203
252
 
204
- if (!id) {
205
- id = Util.getUID(NAME);
206
- $(config.target).attr('id', id);
207
- }
253
+ dispose() {
254
+ EventHandler__default['default'].off(this._scrollElement, EVENT_KEY);
255
+ super.dispose();
256
+ } // Private
208
257
 
209
- config.target = "#" + id;
210
- }
211
258
 
212
- Util.typeCheckConfig(NAME, config, DefaultType);
259
+ _getConfig(config) {
260
+ config = { ...Default,
261
+ ...Manipulator__default['default'].getDataAttributes(this._element),
262
+ ...(typeof config === 'object' && config ? config : {})
263
+ };
264
+ config.target = getElement(config.target) || document.documentElement;
265
+ typeCheckConfig(NAME, config, DefaultType);
213
266
  return config;
214
- };
267
+ }
215
268
 
216
- _proto._getScrollTop = function _getScrollTop() {
269
+ _getScrollTop() {
217
270
  return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
218
- };
271
+ }
219
272
 
220
- _proto._getScrollHeight = function _getScrollHeight() {
273
+ _getScrollHeight() {
221
274
  return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
222
- };
275
+ }
223
276
 
224
- _proto._getOffsetHeight = function _getOffsetHeight() {
277
+ _getOffsetHeight() {
225
278
  return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
226
- };
279
+ }
227
280
 
228
- _proto._process = function _process() {
229
- var scrollTop = this._getScrollTop() + this._config.offset;
281
+ _process() {
282
+ const scrollTop = this._getScrollTop() + this._config.offset;
230
283
 
231
- var scrollHeight = this._getScrollHeight();
284
+ const scrollHeight = this._getScrollHeight();
232
285
 
233
- var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
286
+ const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
234
287
 
235
288
  if (this._scrollHeight !== scrollHeight) {
236
289
  this.refresh();
237
290
  }
238
291
 
239
292
  if (scrollTop >= maxScroll) {
240
- var target = this._targets[this._targets.length - 1];
293
+ const target = this._targets[this._targets.length - 1];
241
294
 
242
295
  if (this._activeTarget !== target) {
243
296
  this._activate(target);
@@ -254,90 +307,65 @@
254
307
  return;
255
308
  }
256
309
 
257
- var offsetLength = this._offsets.length;
258
-
259
- for (var i = offsetLength; i--;) {
260
- var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
310
+ for (let i = this._offsets.length; i--;) {
311
+ const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
261
312
 
262
313
  if (isActiveTarget) {
263
314
  this._activate(this._targets[i]);
264
315
  }
265
316
  }
266
- };
317
+ }
267
318
 
268
- _proto._activate = function _activate(target) {
319
+ _activate(target) {
269
320
  this._activeTarget = target;
270
321
 
271
322
  this._clear();
272
323
 
273
- var queries = this._selector.split(',').map(function (selector) {
274
- return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
275
- });
276
-
277
- var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));
324
+ const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
325
+ const link = SelectorEngine__default['default'].findOne(queries.join(','), this._config.target);
326
+ link.classList.add(CLASS_NAME_ACTIVE);
278
327
 
279
- if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
280
- $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
281
- $link.addClass(ClassName.ACTIVE);
328
+ if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
329
+ SelectorEngine__default['default'].findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
282
330
  } else {
283
- // Set triggered link as active
284
- $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active
285
- // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
286
-
287
- $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item
288
-
289
- $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
331
+ SelectorEngine__default['default'].parents(link, SELECTOR_NAV_LIST_GROUP).forEach(listGroup => {
332
+ // Set triggered links parents as active
333
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
334
+ SelectorEngine__default['default'].prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE)); // Handle special case when .nav-link is inside .nav-item
335
+
336
+ SelectorEngine__default['default'].prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {
337
+ SelectorEngine__default['default'].children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE));
338
+ });
339
+ });
290
340
  }
291
341
 
292
- $(this._scrollElement).trigger(Event.ACTIVATE, {
342
+ EventHandler__default['default'].trigger(this._scrollElement, EVENT_ACTIVATE, {
293
343
  relatedTarget: target
294
344
  });
295
- };
345
+ }
296
346
 
297
- _proto._clear = function _clear() {
298
- [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
299
- return node.classList.contains(ClassName.ACTIVE);
300
- }).forEach(function (node) {
301
- return node.classList.remove(ClassName.ACTIVE);
302
- });
347
+ _clear() {
348
+ SelectorEngine__default['default'].find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE));
303
349
  } // Static
304
- ;
305
350
 
306
- ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
307
- return this.each(function () {
308
- var data = $(this).data(DATA_KEY);
309
351
 
310
- var _config = typeof config === 'object' && config;
352
+ static jQueryInterface(config) {
353
+ return this.each(function () {
354
+ const data = ScrollSpy.getOrCreateInstance(this, config);
311
355
 
312
- if (!data) {
313
- data = new ScrollSpy(this, _config);
314
- $(this).data(DATA_KEY, data);
356
+ if (typeof config !== 'string') {
357
+ return;
315
358
  }
316
359
 
317
- if (typeof config === 'string') {
318
- if (typeof data[config] === 'undefined') {
319
- throw new TypeError("No method named \"" + config + "\"");
320
- }
321
-
322
- data[config]();
360
+ if (typeof data[config] === 'undefined') {
361
+ throw new TypeError(`No method named "${config}"`);
323
362
  }
324
- });
325
- };
326
363
 
327
- _createClass(ScrollSpy, null, [{
328
- key: "VERSION",
329
- get: function get() {
330
- return VERSION;
331
- }
332
- }, {
333
- key: "Default",
334
- get: function get() {
335
- return Default;
336
- }
337
- }]);
364
+ data[config]();
365
+ });
366
+ }
338
367
 
339
- return ScrollSpy;
340
- }();
368
+ }
341
369
  /**
342
370
  * ------------------------------------------------------------------------
343
371
  * Data Api implementation
@@ -345,30 +373,18 @@
345
373
  */
346
374
 
347
375
 
348
- $(window).on(Event.LOAD_DATA_API, function () {
349
- var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY));
350
- var scrollSpysLength = scrollSpys.length;
351
-
352
- for (var i = scrollSpysLength; i--;) {
353
- var $spy = $(scrollSpys[i]);
354
-
355
- ScrollSpy._jQueryInterface.call($spy, $spy.data());
356
- }
376
+ EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => {
377
+ SelectorEngine__default['default'].find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
357
378
  });
358
379
  /**
359
380
  * ------------------------------------------------------------------------
360
381
  * jQuery
361
382
  * ------------------------------------------------------------------------
383
+ * add .ScrollSpy to jQuery only if jQuery is present
362
384
  */
363
385
 
364
- $.fn[NAME] = ScrollSpy._jQueryInterface;
365
- $.fn[NAME].Constructor = ScrollSpy;
366
-
367
- $.fn[NAME].noConflict = function () {
368
- $.fn[NAME] = JQUERY_NO_CONFLICT;
369
- return ScrollSpy._jQueryInterface;
370
- };
386
+ defineJQueryPlugin(ScrollSpy);
371
387
 
372
388
  return ScrollSpy;
373
389
 
374
- }));
390
+ })));