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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/README.md +7 -4
- data/assets/javascripts/bootstrap/alert.js +181 -109
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +85 -173
- data/assets/javascripts/bootstrap/carousel.js +458 -355
- data/assets/javascripts/bootstrap/collapse.js +366 -218
- 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 +459 -351
- data/assets/javascripts/bootstrap/modal.js +597 -429
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +130 -154
- data/assets/javascripts/bootstrap/scrollspy.js +238 -188
- data/assets/javascripts/bootstrap/tab.js +235 -137
- data/assets/javascripts/bootstrap/toast.js +210 -148
- data/assets/javascripts/bootstrap/tooltip.js +627 -466
- 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 -8
- data/assets/javascripts/bootstrap.js +3174 -2563
- data/assets/javascripts/bootstrap.min.js +2 -2
- data/assets/stylesheets/_bootstrap-grid.scss +51 -16
- data/assets/stylesheets/_bootstrap-reboot.scss +4 -1
- data/assets/stylesheets/_bootstrap.scss +16 -8
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +15 -10
- data/assets/stylesheets/bootstrap/_badge.scss +2 -27
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -17
- data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
- data/assets/stylesheets/bootstrap/_buttons.scss +29 -60
- data/assets/stylesheets/bootstrap/_card.scss +20 -91
- data/assets/stylesheets/bootstrap/_carousel.scss +65 -33
- data/assets/stylesheets/bootstrap/_close.scss +30 -30
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +84 -36
- data/assets/stylesheets/bootstrap/_forms.scss +9 -347
- data/assets/stylesheets/bootstrap/_functions.scss +84 -23
- data/assets/stylesheets/bootstrap/_grid.scss +3 -54
- data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +28 -8
- data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
- data/assets/stylesheets/bootstrap/_modal.scss +43 -55
- data/assets/stylesheets/bootstrap/_nav.scss +23 -4
- data/assets/stylesheets/bootstrap/_navbar.scss +45 -71
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +10 -20
- data/assets/stylesheets/bootstrap/_popover.scss +15 -27
- data/assets/stylesheets/bootstrap/_progress.scss +5 -4
- data/assets/stylesheets/bootstrap/_reboot.scss +316 -179
- data/assets/stylesheets/bootstrap/_root.scss +5 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +11 -7
- data/assets/stylesheets/bootstrap/_tables.scss +79 -114
- data/assets/stylesheets/bootstrap/_toasts.scss +20 -15
- data/assets/stylesheets/bootstrap/_tooltip.scss +17 -17
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
- data/assets/stylesheets/bootstrap/_type.scss +38 -59
- data/assets/stylesheets/bootstrap/_utilities.scss +594 -18
- data/assets/stylesheets/bootstrap/_variables.scss +800 -482
- 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 +10 -8
- data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +71 -48
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +10 -8
- 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/_forms.scss +38 -86
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +89 -33
- data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
- data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
- 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 +1 -1
- 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 +234 -126
- data/bootstrap.gemspec +1 -3
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +7 -1
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- 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_1.gemfile +7 -0
- metadata +45 -73
- data/assets/javascripts/bootstrap/util.js +0 -192
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -208
- data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
- 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 -23
- data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
- data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
- data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
- data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
- data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
- data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
- data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
- 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 -75
- data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
- data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
- data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
- data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
- data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
- data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
- data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
- 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 -20
- data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
- data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
- data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
- data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
- /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
|
@@ -1,163 +1,240 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap scrollspy.js
|
|
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('
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ScrollSpy = factory(global.
|
|
10
|
-
}(this, (function (
|
|
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
|
|
15
|
-
var
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
46
|
-
}
|
|
67
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
68
|
+
}
|
|
47
69
|
|
|
48
|
-
return
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
156
|
+
const DefaultType = {
|
|
69
157
|
offset: 'number',
|
|
70
158
|
method: 'string',
|
|
71
159
|
target: '(string|element)'
|
|
72
160
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
128
|
-
targets.map(
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
220
|
+
const targetBCR = target.getBoundingClientRect();
|
|
138
221
|
|
|
139
222
|
if (targetBCR.width || targetBCR.height) {
|
|
140
|
-
|
|
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(
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
175
|
-
|
|
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 =
|
|
179
|
-
|
|
260
|
+
id = getUID(NAME);
|
|
261
|
+
config.target.id = id;
|
|
180
262
|
}
|
|
181
263
|
|
|
182
|
-
config.target =
|
|
264
|
+
config.target = `#${id}`;
|
|
183
265
|
}
|
|
184
266
|
|
|
185
|
-
|
|
267
|
+
typeCheckConfig(NAME, config, DefaultType);
|
|
186
268
|
return config;
|
|
187
|
-
}
|
|
269
|
+
}
|
|
188
270
|
|
|
189
|
-
|
|
271
|
+
_getScrollTop() {
|
|
190
272
|
return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
|
|
191
|
-
}
|
|
273
|
+
}
|
|
192
274
|
|
|
193
|
-
|
|
275
|
+
_getScrollHeight() {
|
|
194
276
|
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
|
|
195
|
-
}
|
|
277
|
+
}
|
|
196
278
|
|
|
197
|
-
|
|
279
|
+
_getOffsetHeight() {
|
|
198
280
|
return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
|
|
199
|
-
}
|
|
281
|
+
}
|
|
200
282
|
|
|
201
|
-
|
|
202
|
-
|
|
283
|
+
_process() {
|
|
284
|
+
const scrollTop = this._getScrollTop() + this._config.offset;
|
|
203
285
|
|
|
204
|
-
|
|
286
|
+
const scrollHeight = this._getScrollHeight();
|
|
205
287
|
|
|
206
|
-
|
|
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
|
-
|
|
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 (
|
|
231
|
-
|
|
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
|
-
|
|
321
|
+
_activate(target) {
|
|
240
322
|
this._activeTarget = target;
|
|
241
323
|
|
|
242
324
|
this._clear();
|
|
243
325
|
|
|
244
|
-
|
|
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
|
-
|
|
328
|
+
const link = SelectorEngine__default['default'].findOne(queries.join(','));
|
|
249
329
|
|
|
250
|
-
if (
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
347
|
+
EventHandler__default['default'].trigger(this._scrollElement, EVENT_ACTIVATE, {
|
|
264
348
|
relatedTarget: target
|
|
265
349
|
});
|
|
266
|
-
}
|
|
350
|
+
}
|
|
267
351
|
|
|
268
|
-
|
|
269
|
-
[].
|
|
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
|
-
|
|
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 (
|
|
284
|
-
|
|
285
|
-
$__default['default'](this).data(DATA_KEY, data);
|
|
361
|
+
if (typeof config !== 'string') {
|
|
362
|
+
return;
|
|
286
363
|
}
|
|
287
364
|
|
|
288
|
-
if (typeof config === '
|
|
289
|
-
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
|
|
311
|
-
}();
|
|
373
|
+
}
|
|
312
374
|
/**
|
|
313
375
|
* ------------------------------------------------------------------------
|
|
314
376
|
* Data Api implementation
|
|
@@ -316,29 +378,17 @@
|
|
|
316
378
|
*/
|
|
317
379
|
|
|
318
380
|
|
|
319
|
-
|
|
320
|
-
|
|
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
|
-
|
|
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
|
|