bootstrap 4.6.0 → 5.0.0

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