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.
- checksums.yaml +4 -4
- data/.travis.yml +17 -2
- data/CHANGELOG.md +2 -14
- data/README.md +7 -4
- data/Rakefile +2 -2
- data/assets/javascripts/bootstrap/alert.js +226 -166
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +119 -165
- data/assets/javascripts/bootstrap/carousel.js +634 -445
- data/assets/javascripts/bootstrap/collapse.js +447 -327
- data/assets/javascripts/bootstrap/dom/data.js +68 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +322 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +88 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +85 -0
- data/assets/javascripts/bootstrap/dropdown.js +550 -425
- data/assets/javascripts/bootstrap/modal.js +695 -492
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +167 -217
- data/assets/javascripts/bootstrap/scrollspy.js +319 -302
- data/assets/javascripts/bootstrap/tab.js +303 -221
- data/assets/javascripts/bootstrap/toast.js +333 -0
- data/assets/javascripts/bootstrap/tooltip.js +896 -577
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +15 -7
- data/assets/javascripts/bootstrap.js +4262 -3163
- data/assets/javascripts/bootstrap.min.js +4 -4
- data/assets/stylesheets/_bootstrap-grid.scss +54 -21
- data/assets/stylesheets/_bootstrap-reboot.scss +7 -4
- data/assets/stylesheets/_bootstrap.scss +21 -11
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +15 -9
- data/assets/stylesheets/bootstrap/_badge.scss +3 -21
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +5 -18
- data/assets/stylesheets/bootstrap/_button-group.scss +29 -62
- data/assets/stylesheets/bootstrap/_buttons.scss +33 -65
- data/assets/stylesheets/bootstrap/_card.scss +55 -141
- data/assets/stylesheets/bootstrap/_carousel.scss +94 -101
- data/assets/stylesheets/bootstrap/_close.scss +33 -28
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +114 -40
- data/assets/stylesheets/bootstrap/_forms.scss +9 -333
- data/assets/stylesheets/bootstrap/_functions.scss +148 -29
- data/assets/stylesheets/bootstrap/_grid.scss +4 -34
- data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
- data/assets/stylesheets/bootstrap/_images.scss +4 -4
- data/assets/stylesheets/bootstrap/_list-group.scss +86 -27
- data/assets/stylesheets/bootstrap/_mixins.scss +17 -16
- data/assets/stylesheets/bootstrap/_modal.scss +90 -42
- data/assets/stylesheets/bootstrap/_nav.scss +31 -10
- data/assets/stylesheets/bootstrap/_navbar.scss +68 -61
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +13 -27
- data/assets/stylesheets/bootstrap/_popover.scss +63 -88
- data/assets/stylesheets/bootstrap/_progress.scss +20 -6
- data/assets/stylesheets/bootstrap/_reboot.scss +349 -211
- data/assets/stylesheets/bootstrap/_root.scss +5 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +69 -0
- data/assets/stylesheets/bootstrap/_tables.scss +79 -116
- data/assets/stylesheets/bootstrap/_toasts.scss +51 -0
- data/assets/stylesheets/bootstrap/_tooltip.scss +18 -18
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -3
- data/assets/stylesheets/bootstrap/_type.scss +42 -63
- data/assets/stylesheets/bootstrap/_utilities.scss +594 -15
- data/assets/stylesheets/bootstrap/_variables.scss +952 -440
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +219 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
- data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
- data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -5
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +57 -14
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +14 -1
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +13 -9
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +77 -53
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +14 -16
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_deprecate.scss +10 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +87 -97
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +106 -33
- data/assets/stylesheets/bootstrap/mixins/_image.scss +0 -20
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +18 -9
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +19 -6
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +312 -0
- data/bootstrap.gemspec +7 -6
- data/lib/bootstrap/engine.rb +3 -0
- data/lib/bootstrap/version.rb +4 -2
- data/lib/bootstrap.rb +10 -7
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +8 -2
- data/test/dummy_rails/app/assets/config/manifest.js +3 -0
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/assets/stylesheets/.browserslistrc +1 -0
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -3
- data/test/gemfiles/rails_6_0.gemfile +7 -0
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- data/test/support/dummy_rails_integration.rb +3 -1
- data/test/test_helper.rb +18 -13
- metadata +64 -79
- data/assets/javascripts/bootstrap/util.js +0 -143
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -433
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -173
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
- data/assets/stylesheets/bootstrap/_media.scss +0 -8
- data/assets/stylesheets/bootstrap/_print.scss +0 -141
- data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
- data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
- data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -33
- data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
- data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
- data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
- data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -13
- data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
- data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
- data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
- data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
- data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
- data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
- data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -37
- data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
- data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
- data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -58
- data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
- /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('
|
3
|
-
typeof define === 'function' && define.amd ? define(['
|
4
|
-
(global.ScrollSpy = factory(global.
|
5
|
-
}(this, (function (
|
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
|
-
|
39
|
-
}
|
12
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
40
13
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
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
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
53
|
-
|
54
|
-
}
|
27
|
+
const toType = obj => {
|
28
|
+
if (obj === null || obj === undefined) {
|
29
|
+
return `${obj}`;
|
55
30
|
}
|
56
31
|
|
57
|
-
return
|
58
|
-
}
|
59
|
-
|
32
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
33
|
+
};
|
60
34
|
/**
|
61
35
|
* --------------------------------------------------------------------------
|
62
|
-
*
|
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
|
-
|
141
|
-
|
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
|
-
|
49
|
+
const getSelector = element => {
|
50
|
+
let selector = element.getAttribute('data-bs-target');
|
145
51
|
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|
-
|
151
|
-
|
152
|
-
|
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
|
-
|
166
|
-
|
63
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
64
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
65
|
+
}
|
167
66
|
|
168
|
-
|
169
|
-
|
170
|
-
return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];
|
171
|
-
}
|
172
|
-
}
|
67
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
68
|
+
}
|
173
69
|
|
174
|
-
|
175
|
-
|
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
|
-
|
183
|
-
|
184
|
-
};
|
73
|
+
const getSelectorFromElement = element => {
|
74
|
+
const selector = getSelector(element);
|
185
75
|
|
186
|
-
|
187
|
-
|
188
|
-
|
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
|
-
|
201
|
-
config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
|
83
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
202
84
|
|
203
|
-
|
204
|
-
|
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
|
-
|
207
|
-
|
208
|
-
|
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
|
-
|
212
|
-
|
97
|
+
const getjQuery = () => {
|
98
|
+
const {
|
99
|
+
jQuery
|
100
|
+
} = window;
|
213
101
|
|
214
|
-
|
215
|
-
|
216
|
-
|
102
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
103
|
+
return jQuery;
|
104
|
+
}
|
217
105
|
|
218
|
-
|
219
|
-
|
220
|
-
};
|
106
|
+
return null;
|
107
|
+
};
|
221
108
|
|
222
|
-
|
223
|
-
|
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
|
-
|
227
|
-
|
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
|
-
|
231
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
242
|
-
|
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
|
-
|
245
|
-
|
246
|
-
}
|
219
|
+
if (target) {
|
220
|
+
const targetBCR = target.getBoundingClientRect();
|
247
221
|
|
248
|
-
|
222
|
+
if (targetBCR.width || targetBCR.height) {
|
223
|
+
return [Manipulator__default['default'][offsetMethod](target).top + offsetBase, targetSelector];
|
224
|
+
}
|
249
225
|
}
|
250
226
|
|
251
|
-
|
252
|
-
|
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
|
-
|
231
|
+
this._targets.push(item[1]);
|
232
|
+
});
|
233
|
+
}
|
255
234
|
|
256
|
-
|
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
|
-
|
264
|
+
config.target = `#${id}`;
|
265
|
+
}
|
260
266
|
|
261
|
-
|
262
|
-
|
267
|
+
typeCheckConfig(NAME, config, DefaultType);
|
268
|
+
return config;
|
269
|
+
}
|
263
270
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
}
|
268
|
-
};
|
271
|
+
_getScrollTop() {
|
272
|
+
return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
|
273
|
+
}
|
269
274
|
|
270
|
-
|
271
|
-
|
275
|
+
_getScrollHeight() {
|
276
|
+
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
|
277
|
+
}
|
272
278
|
|
273
|
-
|
279
|
+
_getOffsetHeight() {
|
280
|
+
return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
|
281
|
+
}
|
274
282
|
|
275
|
-
|
283
|
+
_process() {
|
284
|
+
const scrollTop = this._getScrollTop() + this._config.offset;
|
276
285
|
|
286
|
+
const scrollHeight = this._getScrollHeight();
|
277
287
|
|
278
|
-
|
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
|
-
|
290
|
+
if (this._scrollHeight !== scrollHeight) {
|
291
|
+
this.refresh();
|
292
|
+
}
|
292
293
|
|
293
|
-
|
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
|
-
|
297
|
-
|
298
|
-
});
|
299
|
-
};
|
301
|
+
return;
|
302
|
+
}
|
300
303
|
|
301
|
-
|
302
|
-
|
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
|
-
|
308
|
-
|
309
|
-
var data = $$$1(this).data(DATA_KEY);
|
309
|
+
return;
|
310
|
+
}
|
310
311
|
|
311
|
-
|
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
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
315
|
+
if (isActiveTarget) {
|
316
|
+
this._activate(this._targets[i]);
|
317
|
+
}
|
318
|
+
}
|
319
|
+
}
|
317
320
|
|
318
|
-
|
319
|
-
|
320
|
-
throw new TypeError("No method named \"" + config + "\"");
|
321
|
-
}
|
321
|
+
_activate(target) {
|
322
|
+
this._activeTarget = target;
|
322
323
|
|
323
|
-
|
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
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
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
|
-
|
335
|
-
|
336
|
-
return Default;
|
364
|
+
|
365
|
+
if (typeof data[config] === 'undefined') {
|
366
|
+
throw new TypeError(`No method named "${config}"`);
|
337
367
|
}
|
338
|
-
}]);
|
339
368
|
|
340
|
-
|
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
|
-
|
354
|
-
|
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
|
-
|
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
|
|