bootstrap 4.6.0 → 5.3.2
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/.github/workflows/ci.yml +61 -0
- data/Gemfile +1 -0
- data/README.md +33 -6
- data/Rakefile +10 -1
- data/assets/javascripts/bootstrap/alert.js +53 -155
- data/assets/javascripts/bootstrap/base-component.js +83 -0
- data/assets/javascripts/bootstrap/button.js +43 -198
- data/assets/javascripts/bootstrap/carousel.js +285 -550
- data/assets/javascripts/bootstrap/collapse.js +169 -323
- data/assets/javascripts/bootstrap/dom/data.js +62 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
- data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
- data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
- data/assets/javascripts/bootstrap/dropdown.js +300 -467
- data/assets/javascripts/bootstrap/modal.js +226 -575
- data/assets/javascripts/bootstrap/offcanvas.js +245 -0
- data/assets/javascripts/bootstrap/popover.js +61 -205
- data/assets/javascripts/bootstrap/scrollspy.js +216 -287
- data/assets/javascripts/bootstrap/tab.js +226 -203
- data/assets/javascripts/bootstrap/toast.js +136 -209
- data/assets/javascripts/bootstrap/tooltip.js +411 -757
- data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
- data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
- data/assets/javascripts/bootstrap/util/config.js +67 -0
- data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
- data/assets/javascripts/bootstrap/util/index.js +281 -0
- data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
- data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
- data/assets/javascripts/bootstrap/util/swipe.js +134 -0
- data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
- 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 +23 -7
- data/assets/javascripts/bootstrap.js +3649 -3587
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/stylesheets/_bootstrap-grid.scss +53 -21
- data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
- data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
- data/assets/stylesheets/_bootstrap.scss +21 -13
- data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
- data/assets/stylesheets/bootstrap/_alert.scss +32 -16
- data/assets/stylesheets/bootstrap/_badge.scss +15 -31
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -24
- data/assets/stylesheets/bootstrap/_button-group.scss +27 -48
- data/assets/stylesheets/bootstrap/_buttons.scss +136 -71
- data/assets/stylesheets/bootstrap/_card.scss +66 -113
- data/assets/stylesheets/bootstrap/_carousel.scss +83 -36
- data/assets/stylesheets/bootstrap/_close.scss +51 -28
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +129 -71
- data/assets/stylesheets/bootstrap/_forms.scss +9 -347
- data/assets/stylesheets/bootstrap/_functions.scss +181 -23
- data/assets/stylesheets/bootstrap/_grid.scss +18 -52
- data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
- data/assets/stylesheets/bootstrap/_images.scss +1 -1
- data/assets/stylesheets/bootstrap/_list-group.scss +77 -34
- data/assets/stylesheets/bootstrap/_maps.scss +174 -0
- data/assets/stylesheets/bootstrap/_mixins.scss +10 -15
- data/assets/stylesheets/bootstrap/_modal.scss +107 -110
- data/assets/stylesheets/bootstrap/_nav.scss +102 -25
- data/assets/stylesheets/bootstrap/_navbar.scss +129 -172
- data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +72 -37
- data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
- data/assets/stylesheets/bootstrap/_popover.scss +99 -73
- data/assets/stylesheets/bootstrap/_progress.scss +35 -14
- data/assets/stylesheets/bootstrap/_reboot.scss +319 -192
- data/assets/stylesheets/bootstrap/_root.scss +177 -9
- data/assets/stylesheets/bootstrap/_spinners.scss +44 -24
- data/assets/stylesheets/bootstrap/_tables.scss +101 -115
- data/assets/stylesheets/bootstrap/_toasts.scss +54 -27
- data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
- data/assets/stylesheets/bootstrap/_transitions.scss +8 -1
- data/assets/stylesheets/bootstrap/_type.scss +40 -59
- data/assets/stylesheets/bootstrap/_utilities.scss +806 -18
- data/assets/stylesheets/bootstrap/_variables-dark.scss +87 -0
- data/assets/stylesheets/bootstrap/_variables.scss +1216 -615
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +95 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +189 -0
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
- data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
- data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
- data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
- data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
- data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
- data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
- data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -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/helpers/_vr.scss +8 -0
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
- data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
- 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 +20 -16
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -100
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
- data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
- data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +53 -85
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +119 -37
- data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
- data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +3 -3
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
- data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
- data/assets/stylesheets/bootstrap/vendor/_rfs.scss +276 -132
- data/bootstrap.gemspec +6 -7
- data/lib/bootstrap/engine.rb +7 -1
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +31 -7
- data/tasks/updater/network.rb +9 -3
- data/tasks/updater/scss.rb +2 -2
- data/tasks/updater.rb +2 -2
- 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_4_2.gemfile +1 -1
- data/test/gemfiles/rails_5_0.gemfile +1 -1
- data/test/gemfiles/rails_5_1.gemfile +1 -1
- data/test/gemfiles/rails_5_2.gemfile +8 -0
- data/test/gemfiles/rails_6_0.gemfile +1 -0
- data/test/gemfiles/rails_6_1.gemfile +8 -0
- data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
- data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
- data/test/test_helper.rb +3 -2
- metadata +97 -85
- data/.travis.yml +0 -31
- 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,345 +1,274 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap scrollspy.js
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap scrollspy.js v5.3.2 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2023 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.
|
|
10
|
-
}(this, (function (
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollspy = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));
|
|
10
|
+
})(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
for (var i = 0; i < props.length; i++) {
|
|
19
|
-
var descriptor = props[i];
|
|
20
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
21
|
-
descriptor.configurable = true;
|
|
22
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
23
|
-
Object.defineProperty(target, descriptor.key, descriptor);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function _createClass(Constructor, protoProps, staticProps) {
|
|
28
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
29
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
30
|
-
return Constructor;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function _extends() {
|
|
34
|
-
_extends = Object.assign || function (target) {
|
|
35
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
36
|
-
var source = arguments[i];
|
|
37
|
-
|
|
38
|
-
for (var key in source) {
|
|
39
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
40
|
-
target[key] = source[key];
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
12
|
+
/**
|
|
13
|
+
* --------------------------------------------------------------------------
|
|
14
|
+
* Bootstrap scrollspy.js
|
|
15
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
16
|
+
* --------------------------------------------------------------------------
|
|
17
|
+
*/
|
|
44
18
|
|
|
45
|
-
return target;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
return _extends.apply(this, arguments);
|
|
49
|
-
}
|
|
50
19
|
|
|
51
20
|
/**
|
|
52
|
-
* ------------------------------------------------------------------------
|
|
53
21
|
* Constants
|
|
54
|
-
* ------------------------------------------------------------------------
|
|
55
22
|
*/
|
|
56
23
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
24
|
+
const NAME = 'scrollspy';
|
|
25
|
+
const DATA_KEY = 'bs.scrollspy';
|
|
26
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
27
|
+
const DATA_API_KEY = '.data-api';
|
|
28
|
+
const EVENT_ACTIVATE = `activate${EVENT_KEY}`;
|
|
29
|
+
const EVENT_CLICK = `click${EVENT_KEY}`;
|
|
30
|
+
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
|
|
31
|
+
const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
|
|
32
|
+
const CLASS_NAME_ACTIVE = 'active';
|
|
33
|
+
const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
|
|
34
|
+
const SELECTOR_TARGET_LINKS = '[href]';
|
|
35
|
+
const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
|
|
36
|
+
const SELECTOR_NAV_LINKS = '.nav-link';
|
|
37
|
+
const SELECTOR_NAV_ITEMS = '.nav-item';
|
|
38
|
+
const SELECTOR_LIST_ITEMS = '.list-group-item';
|
|
39
|
+
const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
|
|
40
|
+
const SELECTOR_DROPDOWN = '.dropdown';
|
|
41
|
+
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
|
|
42
|
+
const Default = {
|
|
43
|
+
offset: null,
|
|
44
|
+
// TODO: v6 @deprecated, keep it for backwards compatibility reasons
|
|
45
|
+
rootMargin: '0px 0px -25%',
|
|
46
|
+
smoothScroll: false,
|
|
47
|
+
target: null,
|
|
48
|
+
threshold: [0.1, 0.5, 1]
|
|
67
49
|
};
|
|
68
|
-
|
|
69
|
-
offset: 'number',
|
|
70
|
-
|
|
71
|
-
|
|
50
|
+
const DefaultType = {
|
|
51
|
+
offset: '(number|null)',
|
|
52
|
+
// TODO v6 @deprecated, keep it for backwards compatibility reasons
|
|
53
|
+
rootMargin: 'string',
|
|
54
|
+
smoothScroll: 'boolean',
|
|
55
|
+
target: 'element',
|
|
56
|
+
threshold: 'array'
|
|
72
57
|
};
|
|
73
|
-
|
|
74
|
-
var EVENT_SCROLL = "scroll" + EVENT_KEY;
|
|
75
|
-
var EVENT_LOAD_DATA_API = "load" + EVENT_KEY + DATA_API_KEY;
|
|
76
|
-
var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
|
|
77
|
-
var CLASS_NAME_ACTIVE = 'active';
|
|
78
|
-
var SELECTOR_DATA_SPY = '[data-spy="scroll"]';
|
|
79
|
-
var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
|
|
80
|
-
var SELECTOR_NAV_LINKS = '.nav-link';
|
|
81
|
-
var SELECTOR_NAV_ITEMS = '.nav-item';
|
|
82
|
-
var SELECTOR_LIST_ITEMS = '.list-group-item';
|
|
83
|
-
var SELECTOR_DROPDOWN = '.dropdown';
|
|
84
|
-
var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item';
|
|
85
|
-
var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
|
|
86
|
-
var METHOD_OFFSET = 'offset';
|
|
87
|
-
var METHOD_POSITION = 'position';
|
|
58
|
+
|
|
88
59
|
/**
|
|
89
|
-
*
|
|
90
|
-
* Class Definition
|
|
91
|
-
* ------------------------------------------------------------------------
|
|
60
|
+
* Class definition
|
|
92
61
|
*/
|
|
93
62
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
63
|
+
class ScrollSpy extends BaseComponent {
|
|
64
|
+
constructor(element, config) {
|
|
65
|
+
super(element, config);
|
|
97
66
|
|
|
98
|
-
this._element
|
|
99
|
-
this.
|
|
100
|
-
this.
|
|
101
|
-
this.
|
|
102
|
-
this._offsets = [];
|
|
103
|
-
this._targets = [];
|
|
67
|
+
// this._element is the observablesContainer and config.target the menu links wrapper
|
|
68
|
+
this._targetLinks = new Map();
|
|
69
|
+
this._observableSections = new Map();
|
|
70
|
+
this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
|
|
104
71
|
this._activeTarget = null;
|
|
105
|
-
this.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
} // Getters
|
|
113
|
-
|
|
72
|
+
this._observer = null;
|
|
73
|
+
this._previousScrollData = {
|
|
74
|
+
visibleEntryTop: 0,
|
|
75
|
+
parentScrollTop: 0
|
|
76
|
+
};
|
|
77
|
+
this.refresh(); // initialize
|
|
78
|
+
}
|
|
114
79
|
|
|
115
|
-
|
|
80
|
+
// Getters
|
|
81
|
+
static get Default() {
|
|
82
|
+
return Default;
|
|
83
|
+
}
|
|
84
|
+
static get DefaultType() {
|
|
85
|
+
return DefaultType;
|
|
86
|
+
}
|
|
87
|
+
static get NAME() {
|
|
88
|
+
return NAME;
|
|
89
|
+
}
|
|
116
90
|
|
|
117
91
|
// Public
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
92
|
+
refresh() {
|
|
93
|
+
this._initializeTargetsAndObservables();
|
|
94
|
+
this._maybeEnableSmoothScroll();
|
|
95
|
+
if (this._observer) {
|
|
96
|
+
this._observer.disconnect();
|
|
97
|
+
} else {
|
|
98
|
+
this._observer = this._getNewObserver();
|
|
99
|
+
}
|
|
100
|
+
for (const section of this._observableSections.values()) {
|
|
101
|
+
this._observer.observe(section);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
dispose() {
|
|
105
|
+
this._observer.disconnect();
|
|
106
|
+
super.dispose();
|
|
107
|
+
}
|
|
131
108
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
109
|
+
// Private
|
|
110
|
+
_configAfterMerge(config) {
|
|
111
|
+
// TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
|
|
112
|
+
config.target = index_js.getElement(config.target) || document.body;
|
|
135
113
|
|
|
136
|
-
|
|
137
|
-
|
|
114
|
+
// TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
|
|
115
|
+
config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
|
|
116
|
+
if (typeof config.threshold === 'string') {
|
|
117
|
+
config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
|
|
118
|
+
}
|
|
119
|
+
return config;
|
|
120
|
+
}
|
|
121
|
+
_maybeEnableSmoothScroll() {
|
|
122
|
+
if (!this._config.smoothScroll) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
138
125
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
126
|
+
// unregister any previous listeners
|
|
127
|
+
EventHandler.off(this._config.target, EVENT_CLICK);
|
|
128
|
+
EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
|
|
129
|
+
const observableSection = this._observableSections.get(event.target.hash);
|
|
130
|
+
if (observableSection) {
|
|
131
|
+
event.preventDefault();
|
|
132
|
+
const root = this._rootElement || window;
|
|
133
|
+
const height = observableSection.offsetTop - this._element.offsetTop;
|
|
134
|
+
if (root.scrollTo) {
|
|
135
|
+
root.scrollTo({
|
|
136
|
+
top: height,
|
|
137
|
+
behavior: 'smooth'
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
142
140
|
}
|
|
143
|
-
}
|
|
144
141
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
}).sort(function (a, b) {
|
|
149
|
-
return a[0] - b[0];
|
|
150
|
-
}).forEach(function (item) {
|
|
151
|
-
_this2._offsets.push(item[0]);
|
|
152
|
-
|
|
153
|
-
_this2._targets.push(item[1]);
|
|
142
|
+
// Chrome 60 doesn't support `scrollTo`
|
|
143
|
+
root.scrollTop = height;
|
|
144
|
+
}
|
|
154
145
|
});
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.
|
|
163
|
-
|
|
164
|
-
this._offsets = null;
|
|
165
|
-
this._targets = null;
|
|
166
|
-
this._activeTarget = null;
|
|
167
|
-
this._scrollHeight = null;
|
|
168
|
-
} // Private
|
|
169
|
-
;
|
|
170
|
-
|
|
171
|
-
_proto._getConfig = function _getConfig(config) {
|
|
172
|
-
config = _extends({}, Default, typeof config === 'object' && config ? config : {});
|
|
173
|
-
|
|
174
|
-
if (typeof config.target !== 'string' && Util__default['default'].isElement(config.target)) {
|
|
175
|
-
var id = $__default['default'](config.target).attr('id');
|
|
146
|
+
}
|
|
147
|
+
_getNewObserver() {
|
|
148
|
+
const options = {
|
|
149
|
+
root: this._rootElement,
|
|
150
|
+
threshold: this._config.threshold,
|
|
151
|
+
rootMargin: this._config.rootMargin
|
|
152
|
+
};
|
|
153
|
+
return new IntersectionObserver(entries => this._observerCallback(entries), options);
|
|
154
|
+
}
|
|
176
155
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
156
|
+
// The logic of selection
|
|
157
|
+
_observerCallback(entries) {
|
|
158
|
+
const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
|
|
159
|
+
const activate = entry => {
|
|
160
|
+
this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
|
|
161
|
+
this._process(targetElement(entry));
|
|
162
|
+
};
|
|
163
|
+
const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
|
|
164
|
+
const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
|
|
165
|
+
this._previousScrollData.parentScrollTop = parentScrollTop;
|
|
166
|
+
for (const entry of entries) {
|
|
167
|
+
if (!entry.isIntersecting) {
|
|
168
|
+
this._activeTarget = null;
|
|
169
|
+
this._clearActiveClass(targetElement(entry));
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
|
|
173
|
+
// if we are scrolling down, pick the bigger offsetTop
|
|
174
|
+
if (userScrollsDown && entryIsLowerThanPrevious) {
|
|
175
|
+
activate(entry);
|
|
176
|
+
// if parent isn't scrolled, let's keep the first visible item, breaking the iteration
|
|
177
|
+
if (!parentScrollTop) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
continue;
|
|
180
181
|
}
|
|
181
182
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
return config;
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
_proto._getScrollTop = function _getScrollTop() {
|
|
190
|
-
return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
_proto._getScrollHeight = function _getScrollHeight() {
|
|
194
|
-
return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
_proto._getOffsetHeight = function _getOffsetHeight() {
|
|
198
|
-
return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
_proto._process = function _process() {
|
|
202
|
-
var scrollTop = this._getScrollTop() + this._config.offset;
|
|
203
|
-
|
|
204
|
-
var scrollHeight = this._getScrollHeight();
|
|
205
|
-
|
|
206
|
-
var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
|
|
207
|
-
|
|
208
|
-
if (this._scrollHeight !== scrollHeight) {
|
|
209
|
-
this.refresh();
|
|
183
|
+
// if we are scrolling up, pick the smallest offsetTop
|
|
184
|
+
if (!userScrollsDown && !entryIsLowerThanPrevious) {
|
|
185
|
+
activate(entry);
|
|
186
|
+
}
|
|
210
187
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
188
|
+
}
|
|
189
|
+
_initializeTargetsAndObservables() {
|
|
190
|
+
this._targetLinks = new Map();
|
|
191
|
+
this._observableSections = new Map();
|
|
192
|
+
const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
|
|
193
|
+
for (const anchor of targetLinks) {
|
|
194
|
+
// ensure that the anchor has an id and is not disabled
|
|
195
|
+
if (!anchor.hash || index_js.isDisabled(anchor)) {
|
|
196
|
+
continue;
|
|
217
197
|
}
|
|
198
|
+
const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
|
|
218
199
|
|
|
219
|
-
|
|
200
|
+
// ensure that the observableSection exists & is visible
|
|
201
|
+
if (index_js.isVisible(observableSection)) {
|
|
202
|
+
this._targetLinks.set(decodeURI(anchor.hash), anchor);
|
|
203
|
+
this._observableSections.set(anchor.hash, observableSection);
|
|
204
|
+
}
|
|
220
205
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
this._clear();
|
|
226
|
-
|
|
206
|
+
}
|
|
207
|
+
_process(target) {
|
|
208
|
+
if (this._activeTarget === target) {
|
|
227
209
|
return;
|
|
228
210
|
}
|
|
229
|
-
|
|
230
|
-
for (var i = this._offsets.length; i--;) {
|
|
231
|
-
var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
|
|
232
|
-
|
|
233
|
-
if (isActiveTarget) {
|
|
234
|
-
this._activate(this._targets[i]);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
_proto._activate = function _activate(target) {
|
|
211
|
+
this._clearActiveClass(this._config.target);
|
|
240
212
|
this._activeTarget = target;
|
|
241
|
-
|
|
242
|
-
this.
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]";
|
|
213
|
+
target.classList.add(CLASS_NAME_ACTIVE);
|
|
214
|
+
this._activateParents(target);
|
|
215
|
+
EventHandler.trigger(this._element, EVENT_ACTIVATE, {
|
|
216
|
+
relatedTarget: target
|
|
246
217
|
});
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
if (
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
|
|
218
|
+
}
|
|
219
|
+
_activateParents(target) {
|
|
220
|
+
// Activate dropdown parents
|
|
221
|
+
if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
|
|
222
|
+
SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
|
|
226
|
+
// Set triggered links parents as active
|
|
256
227
|
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
$link.parents(SELECTOR_NAV_LIST_GROUP).prev(SELECTOR_NAV_ITEMS).children(SELECTOR_NAV_LINKS).addClass(CLASS_NAME_ACTIVE);
|
|
228
|
+
for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
|
|
229
|
+
item.classList.add(CLASS_NAME_ACTIVE);
|
|
230
|
+
}
|
|
261
231
|
}
|
|
232
|
+
}
|
|
233
|
+
_clearActiveClass(parent) {
|
|
234
|
+
parent.classList.remove(CLASS_NAME_ACTIVE);
|
|
235
|
+
const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent);
|
|
236
|
+
for (const node of activeNodes) {
|
|
237
|
+
node.classList.remove(CLASS_NAME_ACTIVE);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
262
240
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
});
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
_proto._clear = function _clear() {
|
|
269
|
-
[].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {
|
|
270
|
-
return node.classList.contains(CLASS_NAME_ACTIVE);
|
|
271
|
-
}).forEach(function (node) {
|
|
272
|
-
return node.classList.remove(CLASS_NAME_ACTIVE);
|
|
273
|
-
});
|
|
274
|
-
} // Static
|
|
275
|
-
;
|
|
276
|
-
|
|
277
|
-
ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
|
|
241
|
+
// Static
|
|
242
|
+
static jQueryInterface(config) {
|
|
278
243
|
return this.each(function () {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
if (!data) {
|
|
284
|
-
data = new ScrollSpy(this, _config);
|
|
285
|
-
$__default['default'](this).data(DATA_KEY, data);
|
|
244
|
+
const data = ScrollSpy.getOrCreateInstance(this, config);
|
|
245
|
+
if (typeof config !== 'string') {
|
|
246
|
+
return;
|
|
286
247
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
if (typeof data[config] === 'undefined') {
|
|
290
|
-
throw new TypeError("No method named \"" + config + "\"");
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
data[config]();
|
|
248
|
+
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
|
249
|
+
throw new TypeError(`No method named "${config}"`);
|
|
294
250
|
}
|
|
251
|
+
data[config]();
|
|
295
252
|
});
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
_createClass(ScrollSpy, null, [{
|
|
299
|
-
key: "VERSION",
|
|
300
|
-
get: function get() {
|
|
301
|
-
return VERSION;
|
|
302
|
-
}
|
|
303
|
-
}, {
|
|
304
|
-
key: "Default",
|
|
305
|
-
get: function get() {
|
|
306
|
-
return Default;
|
|
307
|
-
}
|
|
308
|
-
}]);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
309
255
|
|
|
310
|
-
return ScrollSpy;
|
|
311
|
-
}();
|
|
312
256
|
/**
|
|
313
|
-
*
|
|
314
|
-
* Data Api implementation
|
|
315
|
-
* ------------------------------------------------------------------------
|
|
257
|
+
* Data API implementation
|
|
316
258
|
*/
|
|
317
259
|
|
|
318
|
-
|
|
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());
|
|
260
|
+
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
|
|
261
|
+
for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
|
|
262
|
+
ScrollSpy.getOrCreateInstance(spy);
|
|
327
263
|
}
|
|
328
264
|
});
|
|
265
|
+
|
|
329
266
|
/**
|
|
330
|
-
* ------------------------------------------------------------------------
|
|
331
267
|
* jQuery
|
|
332
|
-
* ------------------------------------------------------------------------
|
|
333
268
|
*/
|
|
334
269
|
|
|
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
|
-
};
|
|
270
|
+
index_js.defineJQueryPlugin(ScrollSpy);
|
|
342
271
|
|
|
343
272
|
return ScrollSpy;
|
|
344
273
|
|
|
345
|
-
}))
|
|
274
|
+
}));
|