@openeuropa/bcl-bootstrap 0.25.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/bootstrap-icons.svg +1 -1
  2. package/icons/apple.svg +2 -2
  3. package/icons/boombox-fill.svg +2 -2
  4. package/icons/cup-fill.svg +1 -1
  5. package/icons/cup.svg +1 -1
  6. package/js/dist/alert.js +3 -12
  7. package/js/dist/alert.js.map +1 -1
  8. package/js/dist/base-component.js +32 -18
  9. package/js/dist/base-component.js.map +1 -1
  10. package/js/dist/button.js +3 -12
  11. package/js/dist/button.js.map +1 -1
  12. package/js/dist/carousel.js +207 -307
  13. package/js/dist/carousel.js.map +1 -1
  14. package/js/dist/collapse.js +57 -88
  15. package/js/dist/collapse.js.map +1 -1
  16. package/js/dist/dom/data.js +1 -3
  17. package/js/dist/dom/data.js.map +1 -1
  18. package/js/dist/dom/event-handler.js +87 -106
  19. package/js/dist/dom/event-handler.js.map +1 -1
  20. package/js/dist/dom/manipulator.js +21 -25
  21. package/js/dist/dom/manipulator.js.map +1 -1
  22. package/js/dist/dom/selector-engine.js +11 -10
  23. package/js/dist/dom/selector-engine.js.map +1 -1
  24. package/js/dist/dropdown.js +83 -115
  25. package/js/dist/dropdown.js.map +1 -1
  26. package/js/dist/modal.js +95 -152
  27. package/js/dist/modal.js.map +1 -1
  28. package/js/dist/offcanvas.js +75 -58
  29. package/js/dist/offcanvas.js.map +1 -1
  30. package/js/dist/popover.js +29 -56
  31. package/js/dist/popover.js.map +1 -1
  32. package/js/dist/scrollspy.js +176 -125
  33. package/js/dist/scrollspy.js.map +1 -1
  34. package/js/dist/tab.js +207 -92
  35. package/js/dist/tab.js.map +1 -1
  36. package/js/dist/toast.js +23 -37
  37. package/js/dist/toast.js.map +1 -1
  38. package/js/dist/tooltip.js +259 -348
  39. package/js/dist/tooltip.js.map +1 -1
  40. package/js/dist/util/backdrop.js +62 -39
  41. package/js/dist/util/backdrop.js.map +1 -1
  42. package/js/dist/util/component-functions.js +1 -1
  43. package/js/dist/util/component-functions.js.map +1 -1
  44. package/js/dist/util/config.js +75 -0
  45. package/js/dist/util/config.js.map +1 -0
  46. package/js/dist/util/focustrap.js +41 -34
  47. package/js/dist/util/focustrap.js.map +1 -1
  48. package/js/dist/util/index.js +56 -52
  49. package/js/dist/util/index.js.map +1 -1
  50. package/js/dist/util/sanitizer.js +12 -19
  51. package/js/dist/util/sanitizer.js.map +1 -1
  52. package/js/dist/util/scrollbar.js +49 -34
  53. package/js/dist/util/scrollbar.js.map +1 -1
  54. package/js/dist/util/swipe.js +151 -0
  55. package/js/dist/util/swipe.js.map +1 -0
  56. package/js/dist/util/template-factory.js +173 -0
  57. package/js/dist/util/template-factory.js.map +1 -0
  58. package/js/src/alert.js +3 -15
  59. package/js/src/base-component.js +28 -18
  60. package/js/src/button.js +3 -17
  61. package/js/src/carousel.js +203 -319
  62. package/js/src/collapse.js +61 -94
  63. package/js/src/dom/data.js +1 -3
  64. package/js/src/dom/event-handler.js +80 -108
  65. package/js/src/dom/manipulator.js +22 -31
  66. package/js/src/dom/selector-engine.js +10 -19
  67. package/js/src/dropdown.js +84 -138
  68. package/js/src/modal.js +94 -158
  69. package/js/src/offcanvas.js +72 -61
  70. package/js/src/popover.js +31 -62
  71. package/js/src/scrollspy.js +166 -171
  72. package/js/src/tab.js +193 -110
  73. package/js/src/toast.js +19 -41
  74. package/js/src/tooltip.js +259 -371
  75. package/js/src/util/backdrop.js +55 -36
  76. package/js/src/util/component-functions.js +1 -1
  77. package/js/src/util/config.js +66 -0
  78. package/js/src/util/focustrap.js +38 -28
  79. package/js/src/util/index.js +67 -64
  80. package/js/src/util/sanitizer.js +11 -19
  81. package/js/src/util/scrollbar.js +47 -30
  82. package/js/src/util/swipe.js +146 -0
  83. package/js/src/util/template-factory.js +160 -0
  84. package/package.json +4 -4
  85. package/scss/_accordion.scss +52 -24
  86. package/scss/_alert.scss +18 -4
  87. package/scss/_badge.scss +14 -5
  88. package/scss/_breadcrumb.scss +22 -10
  89. package/scss/_button-group.scss +3 -0
  90. package/scss/_buttons.scss +97 -22
  91. package/scss/_card.scss +55 -37
  92. package/scss/_close.scss +1 -1
  93. package/scss/_containers.scss +1 -1
  94. package/scss/_dropdown.scss +83 -75
  95. package/scss/_functions.scss +7 -7
  96. package/scss/_grid.scss +3 -3
  97. package/scss/_helpers.scss +1 -0
  98. package/scss/_list-group.scss +44 -27
  99. package/scss/_maps.scss +54 -0
  100. package/scss/_modal.scss +71 -43
  101. package/scss/_nav.scss +53 -20
  102. package/scss/_navbar.scss +91 -150
  103. package/scss/_offcanvas.scss +119 -59
  104. package/scss/_pagination.scss +66 -21
  105. package/scss/_placeholders.scss +1 -1
  106. package/scss/_popover.scss +90 -52
  107. package/scss/_progress.scss +20 -9
  108. package/scss/_reboot.scss +25 -40
  109. package/scss/_root.scss +40 -21
  110. package/scss/_spinners.scss +38 -22
  111. package/scss/_tables.scss +32 -23
  112. package/scss/_toasts.scss +35 -16
  113. package/scss/_tooltip.scss +61 -56
  114. package/scss/_type.scss +2 -0
  115. package/scss/_utilities.scss +43 -26
  116. package/scss/_variables.scss +113 -121
  117. package/scss/bootstrap-grid.scss +3 -6
  118. package/scss/bootstrap-reboot.scss +3 -7
  119. package/scss/bootstrap-utilities.scss +3 -6
  120. package/scss/bootstrap.scss +4 -6
  121. package/scss/forms/_floating-labels.scss +14 -3
  122. package/scss/forms/_form-check.scss +28 -5
  123. package/scss/forms/_form-control.scss +12 -37
  124. package/scss/forms/_form-select.scss +0 -1
  125. package/scss/forms/_input-group.scss +15 -7
  126. package/scss/helpers/_color-bg.scss +10 -0
  127. package/scss/helpers/_colored-links.scss +2 -2
  128. package/scss/helpers/_position.scss +7 -1
  129. package/scss/helpers/_ratio.scss +2 -2
  130. package/scss/helpers/_vr.scss +1 -1
  131. package/scss/mixins/_alert.scss +7 -3
  132. package/scss/mixins/_banner.scss +9 -0
  133. package/scss/mixins/_breakpoints.scss +8 -8
  134. package/scss/mixins/_buttons.scss +32 -95
  135. package/scss/mixins/_container.scss +4 -2
  136. package/scss/mixins/_forms.scss +8 -0
  137. package/scss/mixins/_gradients.scss +1 -1
  138. package/scss/mixins/_grid.scss +12 -12
  139. package/scss/mixins/_pagination.scss +4 -25
  140. package/scss/mixins/_reset-text.scss +1 -1
  141. package/scss/mixins/_table-variants.scss +12 -9
  142. package/scss/mixins/_utilities.scss +12 -4
@@ -1,76 +1,75 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./util/index'), require('./dom/event-handler'), require('./dom/manipulator'), require('./dom/selector-engine'), require('./base-component')) :
3
- typeof define === 'function' && define.amd ? define(['./util/index', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollspy = factory(global.Index, global.EventHandler, global.Manipulator, global.SelectorEngine, global.BaseComponent));
5
- })(this, (function (index, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./util/index'), require('./dom/event-handler'), require('./dom/selector-engine'), require('./base-component')) :
3
+ typeof define === 'function' && define.amd ? define(['./util/index', './dom/event-handler', './dom/selector-engine', './base-component'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollspy = factory(global.Index, global.EventHandler, global.SelectorEngine, global.BaseComponent));
5
+ })(this, (function (index, EventHandler, SelectorEngine, BaseComponent) { 'use strict';
6
6
 
7
7
  const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
8
8
 
9
9
  const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
10
- const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
11
10
  const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
12
11
  const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
13
12
 
14
13
  /**
15
14
  * --------------------------------------------------------------------------
16
- * Bootstrap (v5.1.3): scrollspy.js
15
+ * Bootstrap (v5.2.0): scrollspy.js
17
16
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
18
17
  * --------------------------------------------------------------------------
19
18
  */
20
19
  /**
21
- * ------------------------------------------------------------------------
22
20
  * Constants
23
- * ------------------------------------------------------------------------
24
21
  */
25
22
 
26
23
  const NAME = 'scrollspy';
27
24
  const DATA_KEY = 'bs.scrollspy';
28
25
  const EVENT_KEY = `.${DATA_KEY}`;
29
26
  const DATA_API_KEY = '.data-api';
30
- const Default = {
31
- offset: 10,
32
- method: 'auto',
33
- target: ''
34
- };
35
- const DefaultType = {
36
- offset: 'number',
37
- method: 'string',
38
- target: '(string|element)'
39
- };
40
27
  const EVENT_ACTIVATE = `activate${EVENT_KEY}`;
41
- const EVENT_SCROLL = `scroll${EVENT_KEY}`;
28
+ const EVENT_CLICK = `click${EVENT_KEY}`;
42
29
  const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
43
30
  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
44
31
  const CLASS_NAME_ACTIVE = 'active';
45
32
  const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
33
+ const SELECTOR_TARGET_LINKS = '[href]';
46
34
  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
47
35
  const SELECTOR_NAV_LINKS = '.nav-link';
48
36
  const SELECTOR_NAV_ITEMS = '.nav-item';
49
37
  const SELECTOR_LIST_ITEMS = '.list-group-item';
50
- const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
38
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
51
39
  const SELECTOR_DROPDOWN = '.dropdown';
52
40
  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
53
- const METHOD_OFFSET = 'offset';
54
- const METHOD_POSITION = 'position';
41
+ const Default = {
42
+ offset: null,
43
+ // TODO: v6 @deprecated, keep it for backwards compatibility reasons
44
+ rootMargin: '0px 0px -25%',
45
+ smoothScroll: false,
46
+ target: null
47
+ };
48
+ const DefaultType = {
49
+ offset: '(number|null)',
50
+ // TODO v6 @deprecated, keep it for backwards compatibility reasons
51
+ rootMargin: 'string',
52
+ smoothScroll: 'boolean',
53
+ target: 'element'
54
+ };
55
55
  /**
56
- * ------------------------------------------------------------------------
57
- * Class Definition
58
- * ------------------------------------------------------------------------
56
+ * Class definition
59
57
  */
60
58
 
61
59
  class ScrollSpy extends BaseComponent__default.default {
62
60
  constructor(element, config) {
63
- super(element);
64
- this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
65
- this._config = this._getConfig(config);
66
- this._offsets = [];
67
- this._targets = [];
68
- this._activeTarget = null;
69
- this._scrollHeight = 0;
70
- EventHandler__default.default.on(this._scrollElement, EVENT_SCROLL, () => this._process());
71
- this.refresh();
61
+ super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper
72
62
 
73
- this._process();
63
+ this._targetLinks = new Map();
64
+ this._observableSections = new Map();
65
+ this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
66
+ this._activeTarget = null;
67
+ this._observer = null;
68
+ this._previousScrollData = {
69
+ visibleEntryTop: 0,
70
+ parentScrollTop: 0
71
+ };
72
+ this.refresh(); // initialize
74
73
  } // Getters
75
74
 
76
75
 
@@ -78,135 +77,190 @@
78
77
  return Default;
79
78
  }
80
79
 
80
+ static get DefaultType() {
81
+ return DefaultType;
82
+ }
83
+
81
84
  static get NAME() {
82
85
  return NAME;
83
86
  } // Public
84
87
 
85
88
 
86
89
  refresh() {
87
- const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
88
- const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
89
- const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
90
- this._offsets = [];
91
- this._targets = [];
92
- this._scrollHeight = this._getScrollHeight();
93
- const targets = SelectorEngine__default.default.find(SELECTOR_LINK_ITEMS, this._config.target);
94
- targets.map(element => {
95
- const targetSelector = index.getSelectorFromElement(element);
96
- const target = targetSelector ? SelectorEngine__default.default.findOne(targetSelector) : null;
97
-
98
- if (target) {
99
- const targetBCR = target.getBoundingClientRect();
100
-
101
- if (targetBCR.width || targetBCR.height) {
102
- return [Manipulator__default.default[offsetMethod](target).top + offsetBase, targetSelector];
103
- }
104
- }
90
+ this._initializeTargetsAndObservables();
105
91
 
106
- return null;
107
- }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {
108
- this._offsets.push(item[0]);
92
+ this._maybeEnableSmoothScroll();
109
93
 
110
- this._targets.push(item[1]);
111
- });
94
+ if (this._observer) {
95
+ this._observer.disconnect();
96
+ } else {
97
+ this._observer = this._getNewObserver();
98
+ }
99
+
100
+ for (const section of this._observableSections.values()) {
101
+ this._observer.observe(section);
102
+ }
112
103
  }
113
104
 
114
105
  dispose() {
115
- EventHandler__default.default.off(this._scrollElement, EVENT_KEY);
106
+ this._observer.disconnect();
107
+
116
108
  super.dispose();
117
109
  } // Private
118
110
 
119
111
 
120
- _getConfig(config) {
121
- config = { ...Default,
122
- ...Manipulator__default.default.getDataAttributes(this._element),
123
- ...(typeof config === 'object' && config ? config : {})
124
- };
125
- config.target = index.getElement(config.target) || document.documentElement;
126
- index.typeCheckConfig(NAME, config, DefaultType);
112
+ _configAfterMerge(config) {
113
+ // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
114
+ config.target = index.getElement(config.target) || document.body;
127
115
  return config;
128
116
  }
129
117
 
130
- _getScrollTop() {
131
- return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
132
- }
118
+ _maybeEnableSmoothScroll() {
119
+ if (!this._config.smoothScroll) {
120
+ return;
121
+ } // unregister any previous listeners
133
122
 
134
- _getScrollHeight() {
135
- return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
136
- }
137
123
 
138
- _getOffsetHeight() {
139
- return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
124
+ EventHandler__default.default.off(this._config.target, EVENT_CLICK);
125
+ EventHandler__default.default.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
126
+ const observableSection = this._observableSections.get(event.target.hash);
127
+
128
+ if (observableSection) {
129
+ event.preventDefault();
130
+ const root = this._rootElement || window;
131
+ const height = observableSection.offsetTop - this._element.offsetTop;
132
+
133
+ if (root.scrollTo) {
134
+ root.scrollTo({
135
+ top: height,
136
+ behavior: 'smooth'
137
+ });
138
+ return;
139
+ } // Chrome 60 doesn't support `scrollTo`
140
+
141
+
142
+ root.scrollTop = height;
143
+ }
144
+ });
140
145
  }
141
146
 
142
- _process() {
143
- const scrollTop = this._getScrollTop() + this._config.offset;
147
+ _getNewObserver() {
148
+ const options = {
149
+ root: this._rootElement,
150
+ threshold: [0.1, 0.5, 1],
151
+ rootMargin: this._getRootMargin()
152
+ };
153
+ return new IntersectionObserver(entries => this._observerCallback(entries), options);
154
+ } // The logic of selection
144
155
 
145
- const scrollHeight = this._getScrollHeight();
146
156
 
147
- const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
157
+ _observerCallback(entries) {
158
+ const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
148
159
 
149
- if (this._scrollHeight !== scrollHeight) {
150
- this.refresh();
151
- }
160
+ const activate = entry => {
161
+ this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
152
162
 
153
- if (scrollTop >= maxScroll) {
154
- const target = this._targets[this._targets.length - 1];
163
+ this._process(targetElement(entry));
164
+ };
155
165
 
156
- if (this._activeTarget !== target) {
157
- this._activate(target);
166
+ const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
167
+ const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
168
+ this._previousScrollData.parentScrollTop = parentScrollTop;
169
+
170
+ for (const entry of entries) {
171
+ if (!entry.isIntersecting) {
172
+ this._activeTarget = null;
173
+
174
+ this._clearActiveClass(targetElement(entry));
175
+
176
+ continue;
158
177
  }
159
178
 
160
- return;
161
- }
179
+ const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop
162
180
 
163
- if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
164
- this._activeTarget = null;
181
+ if (userScrollsDown && entryIsLowerThanPrevious) {
182
+ activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
165
183
 
166
- this._clear();
184
+ if (!parentScrollTop) {
185
+ return;
186
+ }
167
187
 
168
- return;
169
- }
188
+ continue;
189
+ } // if we are scrolling up, pick the smallest offsetTop
170
190
 
171
- for (let i = this._offsets.length; i--;) {
172
- const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
173
191
 
174
- if (isActiveTarget) {
175
- this._activate(this._targets[i]);
192
+ if (!userScrollsDown && !entryIsLowerThanPrevious) {
193
+ activate(entry);
176
194
  }
177
195
  }
196
+ } // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
197
+
198
+
199
+ _getRootMargin() {
200
+ return this._config.offset ? `${this._config.offset}px 0px -30%` : this._config.rootMargin;
178
201
  }
179
202
 
180
- _activate(target) {
181
- this._activeTarget = target;
203
+ _initializeTargetsAndObservables() {
204
+ this._targetLinks = new Map();
205
+ this._observableSections = new Map();
206
+ const targetLinks = SelectorEngine__default.default.find(SELECTOR_TARGET_LINKS, this._config.target);
182
207
 
183
- this._clear();
208
+ for (const anchor of targetLinks) {
209
+ // ensure that the anchor has an id and is not disabled
210
+ if (!anchor.hash || index.isDisabled(anchor)) {
211
+ continue;
212
+ }
184
213
 
185
- const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
186
- const link = SelectorEngine__default.default.findOne(queries.join(','), this._config.target);
187
- link.classList.add(CLASS_NAME_ACTIVE);
214
+ const observableSection = SelectorEngine__default.default.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible
188
215
 
189
- if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
190
- SelectorEngine__default.default.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
191
- } else {
192
- SelectorEngine__default.default.parents(link, SELECTOR_NAV_LIST_GROUP).forEach(listGroup => {
193
- // Set triggered links parents as active
194
- // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
195
- 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
196
-
197
- SelectorEngine__default.default.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {
198
- SelectorEngine__default.default.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE));
199
- });
200
- });
216
+ if (index.isVisible(observableSection)) {
217
+ this._targetLinks.set(anchor.hash, anchor);
218
+
219
+ this._observableSections.set(anchor.hash, observableSection);
220
+ }
201
221
  }
222
+ }
202
223
 
203
- EventHandler__default.default.trigger(this._scrollElement, EVENT_ACTIVATE, {
224
+ _process(target) {
225
+ if (this._activeTarget === target) {
226
+ return;
227
+ }
228
+
229
+ this._clearActiveClass(this._config.target);
230
+
231
+ this._activeTarget = target;
232
+ target.classList.add(CLASS_NAME_ACTIVE);
233
+
234
+ this._activateParents(target);
235
+
236
+ EventHandler__default.default.trigger(this._element, EVENT_ACTIVATE, {
204
237
  relatedTarget: target
205
238
  });
206
239
  }
207
240
 
208
- _clear() {
209
- SelectorEngine__default.default.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE));
241
+ _activateParents(target) {
242
+ // Activate dropdown parents
243
+ if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
244
+ SelectorEngine__default.default.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);
245
+ return;
246
+ }
247
+
248
+ for (const listGroup of SelectorEngine__default.default.parents(target, SELECTOR_NAV_LIST_GROUP)) {
249
+ // Set triggered links parents as active
250
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
251
+ for (const item of SelectorEngine__default.default.prev(listGroup, SELECTOR_LINK_ITEMS)) {
252
+ item.classList.add(CLASS_NAME_ACTIVE);
253
+ }
254
+ }
255
+ }
256
+
257
+ _clearActiveClass(parent) {
258
+ parent.classList.remove(CLASS_NAME_ACTIVE);
259
+ const activeNodes = SelectorEngine__default.default.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent);
260
+
261
+ for (const node of activeNodes) {
262
+ node.classList.remove(CLASS_NAME_ACTIVE);
263
+ }
210
264
  } // Static
211
265
 
212
266
 
@@ -218,7 +272,7 @@
218
272
  return;
219
273
  }
220
274
 
221
- if (typeof data[config] === 'undefined') {
275
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
222
276
  throw new TypeError(`No method named "${config}"`);
223
277
  }
224
278
 
@@ -228,20 +282,17 @@
228
282
 
229
283
  }
230
284
  /**
231
- * ------------------------------------------------------------------------
232
- * Data Api implementation
233
- * ------------------------------------------------------------------------
285
+ * Data API implementation
234
286
  */
235
287
 
236
288
 
237
289
  EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => {
238
- SelectorEngine__default.default.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
290
+ for (const spy of SelectorEngine__default.default.find(SELECTOR_DATA_SPY)) {
291
+ ScrollSpy.getOrCreateInstance(spy);
292
+ }
239
293
  });
240
294
  /**
241
- * ------------------------------------------------------------------------
242
295
  * jQuery
243
- * ------------------------------------------------------------------------
244
- * add .ScrollSpy to jQuery only if jQuery is present
245
296
  */
246
297
 
247
298
  index.defineJQueryPlugin(ScrollSpy);
@@ -1 +1 @@
1
- {"version":3,"file":"scrollspy.js","sources":["../src/scrollspy.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n defineJQueryPlugin,\n getElement,\n getSelectorFromElement,\n typeCheckConfig\n} from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Manipulator from './dom/manipulator'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst Default = {\n offset: 10,\n method: 'auto',\n target: ''\n}\n\nconst DefaultType = {\n offset: 'number',\n method: 'string',\n target: '(string|element)'\n}\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_SCROLL = `scroll${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst METHOD_OFFSET = 'offset'\nconst METHOD_POSITION = 'position'\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element)\n this._scrollElement = this._element.tagName === 'BODY' ? window : this._element\n this._config = this._getConfig(config)\n this._offsets = []\n this._targets = []\n this._activeTarget = null\n this._scrollHeight = 0\n\n EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process())\n\n this.refresh()\n this._process()\n }\n\n // Getters\n\n static get Default() {\n return Default\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n refresh() {\n const autoMethod = this._scrollElement === this._scrollElement.window ?\n METHOD_OFFSET :\n METHOD_POSITION\n\n const offsetMethod = this._config.method === 'auto' ?\n autoMethod :\n this._config.method\n\n const offsetBase = offsetMethod === METHOD_POSITION ?\n this._getScrollTop() :\n 0\n\n this._offsets = []\n this._targets = []\n this._scrollHeight = this._getScrollHeight()\n\n const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n\n targets.map(element => {\n const targetSelector = getSelectorFromElement(element)\n const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null\n\n if (target) {\n const targetBCR = target.getBoundingClientRect()\n if (targetBCR.width || targetBCR.height) {\n return [\n Manipulator[offsetMethod](target).top + offsetBase,\n targetSelector\n ]\n }\n }\n\n return null\n })\n .filter(item => item)\n .sort((a, b) => a[0] - b[0])\n .forEach(item => {\n this._offsets.push(item[0])\n this._targets.push(item[1])\n })\n }\n\n dispose() {\n EventHandler.off(this._scrollElement, EVENT_KEY)\n super.dispose()\n }\n\n // Private\n\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' && config ? config : {})\n }\n\n config.target = getElement(config.target) || document.documentElement\n\n typeCheckConfig(NAME, config, DefaultType)\n\n return config\n }\n\n _getScrollTop() {\n return this._scrollElement === window ?\n this._scrollElement.pageYOffset :\n this._scrollElement.scrollTop\n }\n\n _getScrollHeight() {\n return this._scrollElement.scrollHeight || Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight\n )\n }\n\n _getOffsetHeight() {\n return this._scrollElement === window ?\n window.innerHeight :\n this._scrollElement.getBoundingClientRect().height\n }\n\n _process() {\n const scrollTop = this._getScrollTop() + this._config.offset\n const scrollHeight = this._getScrollHeight()\n const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()\n\n if (this._scrollHeight !== scrollHeight) {\n this.refresh()\n }\n\n if (scrollTop >= maxScroll) {\n const target = this._targets[this._targets.length - 1]\n\n if (this._activeTarget !== target) {\n this._activate(target)\n }\n\n return\n }\n\n if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n this._activeTarget = null\n this._clear()\n return\n }\n\n for (let i = this._offsets.length; i--;) {\n const isActiveTarget = this._activeTarget !== this._targets[i] &&\n scrollTop >= this._offsets[i] &&\n (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1])\n\n if (isActiveTarget) {\n this._activate(this._targets[i])\n }\n }\n }\n\n _activate(target) {\n this._activeTarget = target\n\n this._clear()\n\n const queries = SELECTOR_LINK_ITEMS.split(',')\n .map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n const link = SelectorEngine.findOne(queries.join(','), this._config.target)\n\n link.classList.add(CLASS_NAME_ACTIVE)\n if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, link.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n } else {\n SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP)\n .forEach(listGroup => {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n\n // Handle special case when .nav-link is inside .nav-item\n SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)\n .forEach(navItem => {\n SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)\n .forEach(item => item.classList.add(CLASS_NAME_ACTIVE))\n })\n })\n }\n\n EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n relatedTarget: target\n })\n }\n\n _clear() {\n SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target)\n .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))\n .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))\n }\n\n // Static\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n SelectorEngine.find(SELECTOR_DATA_SPY)\n .forEach(spy => new ScrollSpy(spy))\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n"],"names":["NAME","DATA_KEY","EVENT_KEY","DATA_API_KEY","Default","offset","method","target","DefaultType","EVENT_ACTIVATE","EVENT_SCROLL","EVENT_LOAD_DATA_API","CLASS_NAME_DROPDOWN_ITEM","CLASS_NAME_ACTIVE","SELECTOR_DATA_SPY","SELECTOR_NAV_LIST_GROUP","SELECTOR_NAV_LINKS","SELECTOR_NAV_ITEMS","SELECTOR_LIST_ITEMS","SELECTOR_LINK_ITEMS","SELECTOR_DROPDOWN","SELECTOR_DROPDOWN_TOGGLE","METHOD_OFFSET","METHOD_POSITION","ScrollSpy","BaseComponent","constructor","element","config","_scrollElement","_element","tagName","window","_config","_getConfig","_offsets","_targets","_activeTarget","_scrollHeight","EventHandler","on","_process","refresh","autoMethod","offsetMethod","offsetBase","_getScrollTop","_getScrollHeight","targets","SelectorEngine","find","map","targetSelector","getSelectorFromElement","findOne","targetBCR","getBoundingClientRect","width","height","Manipulator","top","filter","item","sort","a","b","forEach","push","dispose","off","getDataAttributes","getElement","document","documentElement","typeCheckConfig","pageYOffset","scrollTop","scrollHeight","Math","max","body","_getOffsetHeight","innerHeight","maxScroll","length","_activate","_clear","i","isActiveTarget","queries","split","selector","link","join","classList","add","contains","closest","parents","listGroup","prev","navItem","children","trigger","relatedTarget","node","remove","jQueryInterface","each","data","getOrCreateInstance","TypeError","spy","defineJQueryPlugin"],"mappings":"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"}
1
+ {"version":3,"file":"scrollspy.js","sources":["../src/scrollspy.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.0): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport BaseComponent from './base-component'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: [0.1, 0.5, 1],\n rootMargin: this._getRootMargin()\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n _getRootMargin() {\n return this._config.offset ? `${this._config.offset}px 0px -30%` : this._config.rootMargin\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(anchor.hash, this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(anchor.hash, anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n item.classList.add(CLASS_NAME_ACTIVE)\n }\n }\n }\n\n _clearActiveClass(parent) {\n parent.classList.remove(CLASS_NAME_ACTIVE)\n\n const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n for (const node of activeNodes) {\n node.classList.remove(CLASS_NAME_ACTIVE)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = ScrollSpy.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n ScrollSpy.getOrCreateInstance(spy)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n"],"names":["NAME","DATA_KEY","EVENT_KEY","DATA_API_KEY","EVENT_ACTIVATE","EVENT_CLICK","EVENT_LOAD_DATA_API","CLASS_NAME_DROPDOWN_ITEM","CLASS_NAME_ACTIVE","SELECTOR_DATA_SPY","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LIST_GROUP","SELECTOR_NAV_LINKS","SELECTOR_NAV_ITEMS","SELECTOR_LIST_ITEMS","SELECTOR_LINK_ITEMS","SELECTOR_DROPDOWN","SELECTOR_DROPDOWN_TOGGLE","Default","offset","rootMargin","smoothScroll","target","DefaultType","ScrollSpy","BaseComponent","constructor","element","config","_targetLinks","Map","_observableSections","_rootElement","getComputedStyle","_element","overflowY","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","values","observe","dispose","_configAfterMerge","getElement","document","body","_config","EventHandler","off","on","event","observableSection","get","hash","preventDefault","root","window","height","offsetTop","scrollTo","top","behavior","scrollTop","options","threshold","_getRootMargin","IntersectionObserver","entries","_observerCallback","targetElement","entry","id","activate","_process","documentElement","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","SelectorEngine","find","anchor","isDisabled","findOne","isVisible","set","classList","add","_activateParents","trigger","relatedTarget","contains","closest","listGroup","parents","item","prev","parent","remove","activeNodes","node","jQueryInterface","each","data","getOrCreateInstance","undefined","startsWith","TypeError","spy","defineJQueryPlugin"],"mappings":"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"}