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