bootstrap-italia 2.14.0 → 2.15.1

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.
@@ -3,8 +3,9 @@ import { getElementFromSelector, isVisible, reflow } from './util/index.js';
3
3
  import EventHandler from './dom/event-handler.js';
4
4
  import SelectorEngine from './dom/selector-engine.js';
5
5
  import { isScreenMobile } from './util/device.js';
6
- import { getElementIndex } from './util/dom.js';
7
- import { disablePageScroll, enablePageScroll } from './util/pageScroll.js';
6
+ import ScrollBarHelper from './util/scrollbar.js';
7
+ import FocusTrap from './util/focustrap.js';
8
+ import Backdrop from './util/backdrop.js';
8
9
 
9
10
  /**
10
11
  * --------------------------------------------------------------------------
@@ -22,7 +23,6 @@ const DATA_API_KEY = '.data-api';
22
23
 
23
24
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
24
25
  const EVENT_CLICK = `click${EVENT_KEY}`;
25
- const EVENT_KEYUP = `keyup${EVENT_KEY}`;
26
26
  const EVENT_KEYDOWN = `keydown${EVENT_KEY}`;
27
27
  const EVENT_HIDE = `hide${EVENT_KEY}`;
28
28
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
@@ -30,54 +30,88 @@ const EVENT_SHOW = `show${EVENT_KEY}`;
30
30
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
31
31
  const EVENT_RESIZE = `resize${EVENT_KEY}`;
32
32
 
33
- const CLASS_NAME_FADE = 'fade';
33
+ const CLASS_NAME_OPEN = 'navbar-open';
34
34
  const CLASS_NAME_SHOW = 'show';
35
35
  const CLASS_NAME_EXPANDED = 'expanded';
36
36
 
37
37
  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="navbarcollapsible"]';
38
-
39
- //const SELECTOR_NAVBAR = '.navbar-collapsable'
40
38
  const SELECTOR_BTN_CLOSE = '.close-div button';
41
39
  const SELECTOR_BTN_MENU_CLOSE = '.close-menu';
42
40
  const SELECTOR_BTN_BACK = '.it-back-button';
43
- const SELECTOR_OVERLAY = '.overlay';
44
41
  const SELECTOR_MENU_WRAPPER = '.menu-wrapper';
45
42
  const SELECTOR_NAVLINK = '.nav-link';
46
43
  const SELECTOR_MEGAMENUNAVLINK = '.nav-item .list-item';
47
44
  const SELECTOR_HEADINGLINK = '.it-heading-link';
48
45
  const SELECTOR_FOOTERLINK = '.it-footer-link';
49
46
 
47
+ const Default = {
48
+ backdrop: true,
49
+ focus: true,
50
+ };
51
+
52
+ const DefaultType = {
53
+ backdrop: '(boolean|string)',
54
+ focus: 'boolean',
55
+ };
56
+
50
57
  class NavBarCollapsible extends BaseComponent {
51
- constructor(element) {
52
- super(element);
58
+ constructor(element, config) {
59
+ super(element, config);
60
+
61
+ this._mainElement = SelectorEngine.findOne('main');
62
+ this._isNavbarOutsideMain = this._mainElement && !this._mainElement.contains(this._element);
63
+ this._parentElement = this._element.parentNode;
53
64
 
54
65
  this._isShown = this._element.classList.contains(CLASS_NAME_EXPANDED);
55
- this._isTransitioning = false;
56
66
 
57
- this._isMobile = isScreenMobile();
58
- this._isKeyShift = false;
67
+ if (!this._element.getAttribute('tabindex')) {
68
+ this._element.setAttribute('tabindex', '-1');
69
+ }
59
70
 
60
- this._currItemIdx = 0;
71
+ this._backdrop = this._initializeBackDrop();
72
+ this._focustrap = this._initializeFocusTrap();
73
+ this._scrollBar = new ScrollBarHelper();
74
+ this._isTransitioning = false;
75
+ this._isMobile = isScreenMobile();
61
76
 
62
77
  this._btnClose = SelectorEngine.findOne(SELECTOR_BTN_CLOSE, this._element);
63
78
  this._btnBack = SelectorEngine.findOne(SELECTOR_BTN_BACK, this._element);
64
79
  this._menuWrapper = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, this._element);
65
- this._overlay = null;
66
- this._setOverlay();
80
+
67
81
  this._menuItems = SelectorEngine.find(
68
82
  [SELECTOR_NAVLINK, SELECTOR_MEGAMENUNAVLINK, SELECTOR_HEADINGLINK, SELECTOR_FOOTERLINK, SELECTOR_BTN_MENU_CLOSE].join(','),
69
83
  this._element
70
84
  );
71
85
 
86
+ this._toggleButton =
87
+ SelectorEngine.findOne(`${SELECTOR_DATA_TOGGLE}[data-bs-target="#${this._element.id}"]`) ||
88
+ SelectorEngine.findOne(`${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"]`);
89
+
90
+ if (this._toggleButton) {
91
+ if (!this._toggleButton.getAttribute('aria-expanded')) {
92
+ this._toggleButton.setAttribute('aria-expanded', this._isShown ? 'true' : 'false');
93
+ }
94
+ }
72
95
  this._bindEvents();
73
96
  }
97
+
74
98
  // Getters
99
+ static get Default() {
100
+ return Default
101
+ }
102
+
103
+ static get DefaultType() {
104
+ return DefaultType
105
+ }
75
106
 
76
107
  static get NAME() {
77
108
  return NAME
78
109
  }
79
110
 
80
111
  // Public
112
+ toggle(relatedTarget) {
113
+ this._isShown ? this.hide() : this.show(relatedTarget);
114
+ }
81
115
 
82
116
  show(relatedTarget) {
83
117
  if (this._isShown || this._isTransitioning) {
@@ -92,14 +126,22 @@ class NavBarCollapsible extends BaseComponent {
92
126
  return
93
127
  }
94
128
 
129
+ this._isShown = true;
130
+ this._isTransitioning = true;
131
+ this._scrollBar.hide();
132
+
95
133
  if (this._btnBack) {
96
134
  this._btnBack.classList.add(CLASS_NAME_SHOW);
97
135
  }
98
136
 
99
- this._isShown = true;
137
+ document.body.classList.add(CLASS_NAME_OPEN);
100
138
 
101
- disablePageScroll();
139
+ this._backdrop.show();
102
140
  this._showElement();
141
+
142
+ if (this._toggleButton) {
143
+ this._toggleButton.setAttribute('aria-expanded', 'true');
144
+ }
103
145
  }
104
146
 
105
147
  hide() {
@@ -115,45 +157,64 @@ class NavBarCollapsible extends BaseComponent {
115
157
 
116
158
  this._isShown = false;
117
159
 
118
- const isAnimated = this._isAnimated();
119
-
120
- if (isAnimated) {
121
- this._isTransitioning = true;
122
- }
160
+ this._isTransitioning = true;
161
+ this._focustrap.deactivate();
123
162
 
124
163
  if (this._btnBack) {
125
164
  this._btnBack.classList.remove(CLASS_NAME_SHOW);
126
165
  }
127
- if (this._overlay) {
128
- this._overlay.classList.remove(CLASS_NAME_SHOW);
129
- }
130
166
 
131
167
  this._element.classList.remove(CLASS_NAME_EXPANDED);
132
168
 
133
- enablePageScroll();
134
- this._queueCallback(() => this._hideElement(), this._menuWrapper, isAnimated);
135
- }
169
+ this._backdrop.hide();
136
170
 
137
- toggle(relatedTarget) {
138
- this._isShown ? this.hide() : this.show(relatedTarget);
171
+ this._queueCallback(() => this._hideElement(), this._menuWrapper, this._isAnimated());
172
+
173
+ if (this._toggleButton) {
174
+ this._toggleButton.setAttribute('aria-expanded', 'false');
175
+ }
139
176
  }
140
177
 
141
178
  dispose() {
142
179
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
143
180
  EventHandler.off(window, EVENT_RESIZE);
144
- super.dispose();
181
+ EventHandler.off(document, EVENT_KEYDOWN);
145
182
  }
183
+ this._backdrop.dispose();
184
+
185
+ this._focustrap.deactivate();
186
+ super.dispose();
146
187
  }
147
188
 
148
- // Private
189
+ _initializeBackDrop() {
190
+ return new Backdrop({
191
+ isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,
192
+ isAnimated: this._isAnimated(),
193
+ className: 'navbar-backdrop',
194
+ rootElement: this._parentElement,
195
+ clickCallback: () => {
196
+ this.hide();
197
+ },
198
+ })
199
+ }
149
200
 
201
+ _initializeFocusTrap() {
202
+ return new FocusTrap({
203
+ trapElement: this._element,
204
+ initialFocus: () => this._btnClose || this._element.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),
205
+ })
206
+ }
207
+
208
+ // Private
150
209
  _bindEvents() {
151
210
  if (typeof window !== 'undefined' && typeof document !== 'undefined') {
152
211
  EventHandler.on(window, EVENT_RESIZE, () => this._onResize());
212
+ EventHandler.on(document, EVENT_KEYDOWN, (evt) => {
213
+ if (this._isShown && evt.key === 'Escape') {
214
+ this.hide();
215
+ }
216
+ });
153
217
 
154
- if (this._overlay) {
155
- EventHandler.on(this._overlay, EVENT_CLICK, () => this.hide());
156
- }
157
218
  EventHandler.on(this._btnClose, EVENT_CLICK, (evt) => {
158
219
  evt.preventDefault();
159
220
  this.hide();
@@ -162,11 +223,8 @@ class NavBarCollapsible extends BaseComponent {
162
223
  evt.preventDefault();
163
224
  this.hide();
164
225
  });
165
-
166
226
  this._menuItems.forEach((item) => {
167
227
  EventHandler.on(item, EVENT_KEYDOWN, (evt) => this._isMobile && this._onMenuItemKeyDown(evt));
168
- EventHandler.on(item, EVENT_KEYUP, (evt) => this._isMobile && this._onMenuItemKeyUp(evt));
169
- EventHandler.on(item, EVENT_CLICK, (evt) => this._isMobile && this._onMenuItemClick(evt));
170
228
  });
171
229
  }
172
230
  }
@@ -175,30 +233,14 @@ class NavBarCollapsible extends BaseComponent {
175
233
  this._isMobile = isScreenMobile();
176
234
  }
177
235
 
178
- _onMenuItemKeyUp(evt) {
179
- if (evt.key === 'Shift') {
180
- this._isKeyShift = false;
181
- }
182
- }
183
236
  _onMenuItemKeyDown(evt) {
184
- if (evt.key === 'Shift') {
185
- this._isKeyShift = true;
186
- }
187
- if (evt.key === 'Tab') {
188
- evt.preventDefault();
189
- this._focusNext();
237
+ if (evt.key === 'Escape') {
238
+ this.hide();
190
239
  }
191
240
  }
192
- /**
193
- * Update the last focused element when an interactive element is clicked
194
- */
195
- _onMenuItemClick(evt) {
196
- this.currItemIdx = getElementIndex(evt.currentTarget, this._menuItems);
197
- }
198
241
 
199
242
  _isAnimated() {
200
- //there's no an animation css class you can toggle with a "show" css class, so it is supposed true
201
- return true //this._element.classList.contains(CLASS_NAME_EXPANDED)
243
+ return true
202
244
  }
203
245
 
204
246
  _isElementHidden(element) {
@@ -206,108 +248,47 @@ class NavBarCollapsible extends BaseComponent {
206
248
  }
207
249
 
208
250
  _showElement() {
209
- const isAnimated = this._isAnimated();
210
-
211
251
  this._element.style.display = 'block';
212
- this._element.removeAttribute('aria-hidden');
213
- this._element.setAttribute('aria-expanded', true);
214
- //this._element.setAttribute('role', 'dialog')
215
- if (this._overlay) {
216
- this._overlay.style.display = 'block';
252
+ if (!this._element.getAttribute('aria-label') && !this._element.getAttribute('aria-labelledby')) {
253
+ this._element.setAttribute('aria-label', 'Menu');
217
254
  }
255
+ this._element.setAttribute('aria-modal', true);
256
+ this._element.setAttribute('role', 'dialog');
218
257
 
219
- if (isAnimated) {
220
- reflow(this._element);
258
+ if (this._mainElement && this._isNavbarOutsideMain) {
259
+ this._mainElement.setAttribute('inert', '');
221
260
  }
222
261
 
262
+ reflow(this._element);
263
+
223
264
  this._element.classList.add(CLASS_NAME_EXPANDED);
224
- if (this._overlay) {
225
- this._overlay.classList.add(CLASS_NAME_SHOW);
226
- }
227
265
 
228
266
  const transitionComplete = () => {
229
- this._isTransitioning = false;
230
- const firstItem = this._getNextVisibleItem(0); //at pos 0 there's the close button
231
- if (firstItem.item) {
232
- firstItem.item.focus();
233
- this._currItemIdx = firstItem.index;
267
+ if (this._config.focus) {
268
+ this._focustrap.activate();
234
269
  }
270
+ this._isTransitioning = false;
235
271
  EventHandler.trigger(this._element, EVENT_SHOWN);
236
272
  };
237
273
 
238
- this._queueCallback(transitionComplete, this._menuWrapper, isAnimated);
274
+ this._queueCallback(transitionComplete, this._menuWrapper, this._isAnimated());
239
275
  }
240
276
 
241
277
  _hideElement() {
242
- if (this._overlay) {
243
- this._overlay.style.display = 'none';
244
- }
245
-
246
278
  this._element.style.display = 'none';
247
- this._element.setAttribute('aria-hidden', true);
248
- this._element.removeAttribute('aria-expanded');
249
- //this._element.removeAttribute('aria-modal')
250
- //this._element.removeAttribute('role')
251
- this._isTransitioning = false;
252
- EventHandler.trigger(this._element, EVENT_HIDDEN);
253
- }
279
+ this._element.removeAttribute('aria-modal');
280
+ this._element.removeAttribute('role');
254
281
 
255
- _setOverlay() {
256
- this._overlay = SelectorEngine.findOne(SELECTOR_OVERLAY, this._element);
257
- if (this._isAnimated) {
258
- this._overlay.classList.add(CLASS_NAME_FADE);
259
- }
260
- }
282
+ document.body.classList.remove(CLASS_NAME_OPEN);
261
283
 
262
- /**
263
- * Moves focus to the next focusable element based on the DOM exploration direction
264
- */
265
- _focusNext() {
266
- let nextIdx = this._currItemIdx + (this._isKeyShift ? -1 : 1);
267
- if (nextIdx < 0) {
268
- nextIdx = this._menuItems.length - 1;
269
- } else if (nextIdx >= this._menuItems.length) {
270
- nextIdx = 0;
271
- }
272
- const target = this._getNextVisibleItem(nextIdx, this._isKeyShift);
273
- if (target.item) {
274
- target.item.focus();
275
- this._currItemIdx = target.index;
276
- }
277
- }
278
- /**
279
- * Get the next focusable element from a starting point
280
- * @param {int} start - the index of the array of the elements as starting point (included)
281
- * @param {boolean} wayTop - the array search direction (true: bottom to top, false: top to bottom)
282
- * @returns {Object} the item found and its index in the array
283
- */
284
- _getNextVisibleItem(start, wayTop) {
285
- let found = null;
286
- let foundIdx = null;
287
-
288
- let i = start;
289
- let incr = wayTop ? -1 : 1;
290
- let firstCheck = false;
291
- while (!found && (i != start || !firstCheck)) {
292
- if (i == start) {
293
- firstCheck = true;
294
- }
295
- if (!this._isElementHidden(this._menuItems[i])) {
296
- found = this._menuItems[i];
297
- foundIdx = i;
298
- }
299
- i = i + incr;
300
- if (i < 0) {
301
- i = this._menuItems.length - 1;
302
- } else if (i >= this._menuItems.length) {
303
- i = 0;
304
- }
284
+ if (this._mainElement && this._isNavbarOutsideMain) {
285
+ this._mainElement.removeAttribute('inert');
305
286
  }
306
287
 
307
- return {
308
- item: found,
309
- index: foundIdx,
310
- }
288
+ this._scrollBar.reset();
289
+ this._isTransitioning = false;
290
+
291
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
311
292
  }
312
293
  }
313
294
 
@@ -1 +1 @@
1
- {"version":3,"file":"navbar-collapsible.js","sources":["../../src/js/plugins/navbar-collapsible.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap Italia (https://italia.github.io/bootstrap-italia/)\n * Authors: https://github.com/italia/bootstrap-italia/blob/main/AUTHORS\n * Licensed under BSD-3-Clause license (https://github.com/italia/bootstrap-italia/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\n\nimport { getElementFromSelector, isVisible, reflow } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\n\nimport { isScreenMobile } from './util/device'\nimport { getElementIndex } from './util/dom'\nimport { disablePageScroll, enablePageScroll } from './util/pageScroll'\n\nconst NAME = 'navbarcollapsible'\nconst DATA_KEY = 'bs.navbarcollapsible'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_KEYUP = `keyup${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_EXPANDED = 'expanded'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"navbarcollapsible\"]'\n\n//const SELECTOR_NAVBAR = '.navbar-collapsable'\nconst SELECTOR_BTN_CLOSE = '.close-div button'\nconst SELECTOR_BTN_MENU_CLOSE = '.close-menu'\nconst SELECTOR_BTN_BACK = '.it-back-button'\nconst SELECTOR_OVERLAY = '.overlay'\nconst SELECTOR_MENU_WRAPPER = '.menu-wrapper'\nconst SELECTOR_NAVLINK = '.nav-link'\nconst SELECTOR_MEGAMENUNAVLINK = '.nav-item .list-item'\nconst SELECTOR_HEADINGLINK = '.it-heading-link'\nconst SELECTOR_FOOTERLINK = '.it-footer-link'\n\nclass NavBarCollapsible extends BaseComponent {\n constructor(element) {\n super(element)\n\n this._isShown = this._element.classList.contains(CLASS_NAME_EXPANDED)\n this._isTransitioning = false\n\n this._isMobile = isScreenMobile()\n this._isKeyShift = false\n\n this._currItemIdx = 0\n\n this._btnClose = SelectorEngine.findOne(SELECTOR_BTN_CLOSE, this._element)\n this._btnBack = SelectorEngine.findOne(SELECTOR_BTN_BACK, this._element)\n this._menuWrapper = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, this._element)\n this._overlay = null\n this._setOverlay()\n this._menuItems = SelectorEngine.find(\n [SELECTOR_NAVLINK, SELECTOR_MEGAMENUNAVLINK, SELECTOR_HEADINGLINK, SELECTOR_FOOTERLINK, SELECTOR_BTN_MENU_CLOSE].join(','),\n this._element\n )\n\n this._bindEvents()\n }\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget,\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n if (this._btnBack) {\n this._btnBack.classList.add(CLASS_NAME_SHOW)\n }\n\n this._isShown = true\n\n disablePageScroll()\n this._showElement()\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n\n const isAnimated = this._isAnimated()\n\n if (isAnimated) {\n this._isTransitioning = true\n }\n\n if (this._btnBack) {\n this._btnBack.classList.remove(CLASS_NAME_SHOW)\n }\n if (this._overlay) {\n this._overlay.classList.remove(CLASS_NAME_SHOW)\n }\n\n this._element.classList.remove(CLASS_NAME_EXPANDED)\n\n enablePageScroll()\n this._queueCallback(() => this._hideElement(), this._menuWrapper, isAnimated)\n }\n\n toggle(relatedTarget) {\n this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n dispose() {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.off(window, EVENT_RESIZE)\n super.dispose()\n }\n }\n\n // Private\n\n _bindEvents() {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.on(window, EVENT_RESIZE, () => this._onResize())\n\n if (this._overlay) {\n EventHandler.on(this._overlay, EVENT_CLICK, () => this.hide())\n }\n EventHandler.on(this._btnClose, EVENT_CLICK, (evt) => {\n evt.preventDefault()\n this.hide()\n })\n EventHandler.on(this._btnBack, EVENT_CLICK, (evt) => {\n evt.preventDefault()\n this.hide()\n })\n\n this._menuItems.forEach((item) => {\n EventHandler.on(item, EVENT_KEYDOWN, (evt) => this._isMobile && this._onMenuItemKeyDown(evt))\n EventHandler.on(item, EVENT_KEYUP, (evt) => this._isMobile && this._onMenuItemKeyUp(evt))\n EventHandler.on(item, EVENT_CLICK, (evt) => this._isMobile && this._onMenuItemClick(evt))\n })\n }\n }\n\n _onResize() {\n this._isMobile = isScreenMobile()\n }\n\n _onMenuItemKeyUp(evt) {\n if (evt.key === 'Shift') {\n this._isKeyShift = false\n }\n }\n _onMenuItemKeyDown(evt) {\n if (evt.key === 'Shift') {\n this._isKeyShift = true\n }\n if (evt.key === 'Tab') {\n evt.preventDefault()\n this._focusNext()\n }\n }\n /**\n * Update the last focused element when an interactive element is clicked\n */\n _onMenuItemClick(evt) {\n this.currItemIdx = getElementIndex(evt.currentTarget, this._menuItems)\n }\n\n _isAnimated() {\n //there's no an animation css class you can toggle with a \"show\" css class, so it is supposed true\n return true //this._element.classList.contains(CLASS_NAME_EXPANDED)\n }\n\n _isElementHidden(element) {\n return element.offsetParent === null\n }\n\n _showElement() {\n const isAnimated = this._isAnimated()\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-expanded', true)\n //this._element.setAttribute('role', 'dialog')\n if (this._overlay) {\n this._overlay.style.display = 'block'\n }\n\n if (isAnimated) {\n reflow(this._element)\n }\n\n this._element.classList.add(CLASS_NAME_EXPANDED)\n if (this._overlay) {\n this._overlay.classList.add(CLASS_NAME_SHOW)\n }\n\n const transitionComplete = () => {\n this._isTransitioning = false\n const firstItem = this._getNextVisibleItem(0) //at pos 0 there's the close button\n if (firstItem.item) {\n firstItem.item.focus()\n this._currItemIdx = firstItem.index\n }\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n this._queueCallback(transitionComplete, this._menuWrapper, isAnimated)\n }\n\n _hideElement() {\n if (this._overlay) {\n this._overlay.style.display = 'none'\n }\n\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-expanded')\n //this._element.removeAttribute('aria-modal')\n //this._element.removeAttribute('role')\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n _setOverlay() {\n this._overlay = SelectorEngine.findOne(SELECTOR_OVERLAY, this._element)\n if (this._isAnimated) {\n this._overlay.classList.add(CLASS_NAME_FADE)\n }\n }\n\n /**\n * Moves focus to the next focusable element based on the DOM exploration direction\n */\n _focusNext() {\n let nextIdx = this._currItemIdx + (this._isKeyShift ? -1 : 1)\n if (nextIdx < 0) {\n nextIdx = this._menuItems.length - 1\n } else if (nextIdx >= this._menuItems.length) {\n nextIdx = 0\n }\n const target = this._getNextVisibleItem(nextIdx, this._isKeyShift)\n if (target.item) {\n target.item.focus()\n this._currItemIdx = target.index\n }\n }\n /**\n * Get the next focusable element from a starting point\n * @param {int} start - the index of the array of the elements as starting point (included)\n * @param {boolean} wayTop - the array search direction (true: bottom to top, false: top to bottom)\n * @returns {Object} the item found and its index in the array\n */\n _getNextVisibleItem(start, wayTop) {\n let found = null\n let foundIdx = null\n\n let i = start\n let incr = wayTop ? -1 : 1\n let firstCheck = false\n while (!found && (i != start || !firstCheck)) {\n if (i == start) {\n firstCheck = true\n }\n if (!this._isElementHidden(this._menuItems[i])) {\n found = this._menuItems[i]\n foundIdx = i\n }\n i = i + incr\n if (i < 0) {\n i = this._menuItems.length - 1\n } else if (i >= this._menuItems.length) {\n i = 0\n }\n }\n\n return {\n item: found,\n index: foundIdx,\n }\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, (showEvent) => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n const data = NavBarCollapsible.getOrCreateInstance(target)\n\n data.toggle(this)\n })\n}\n\nexport default NavBarCollapsible\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"navbar-collapsible.js","sources":["../../src/js/plugins/navbar-collapsible.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap Italia (https://italia.github.io/bootstrap-italia/)\n * Authors: https://github.com/italia/bootstrap-italia/blob/main/AUTHORS\n * Licensed under BSD-3-Clause license (https://github.com/italia/bootstrap-italia/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport { getElementFromSelector, isVisible, reflow } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport { isScreenMobile } from './util/device'\nimport ScrollBarHelper from './util/scrollbar'\nimport FocusTrap from './util/focustrap'\nimport Backdrop from './util/backdrop'\n\nconst NAME = 'navbarcollapsible'\nconst DATA_KEY = 'bs.navbarcollapsible'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\n\nconst CLASS_NAME_OPEN = 'navbar-open'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_EXPANDED = 'expanded'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"navbarcollapsible\"]'\nconst SELECTOR_BTN_CLOSE = '.close-div button'\nconst SELECTOR_BTN_MENU_CLOSE = '.close-menu'\nconst SELECTOR_BTN_BACK = '.it-back-button'\nconst SELECTOR_MENU_WRAPPER = '.menu-wrapper'\nconst SELECTOR_NAVLINK = '.nav-link'\nconst SELECTOR_MEGAMENUNAVLINK = '.nav-item .list-item'\nconst SELECTOR_HEADINGLINK = '.it-heading-link'\nconst SELECTOR_FOOTERLINK = '.it-footer-link'\n\nconst Default = {\n backdrop: true,\n focus: true,\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n}\n\nclass NavBarCollapsible extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._mainElement = SelectorEngine.findOne('main')\n this._isNavbarOutsideMain = this._mainElement && !this._mainElement.contains(this._element)\n this._parentElement = this._element.parentNode\n\n this._isShown = this._element.classList.contains(CLASS_NAME_EXPANDED)\n\n if (!this._element.getAttribute('tabindex')) {\n this._element.setAttribute('tabindex', '-1')\n }\n\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._scrollBar = new ScrollBarHelper()\n this._isTransitioning = false\n this._isMobile = isScreenMobile()\n\n this._btnClose = SelectorEngine.findOne(SELECTOR_BTN_CLOSE, this._element)\n this._btnBack = SelectorEngine.findOne(SELECTOR_BTN_BACK, this._element)\n this._menuWrapper = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, this._element)\n\n this._menuItems = SelectorEngine.find(\n [SELECTOR_NAVLINK, SELECTOR_MEGAMENUNAVLINK, SELECTOR_HEADINGLINK, SELECTOR_FOOTERLINK, SELECTOR_BTN_MENU_CLOSE].join(','),\n this._element\n )\n\n this._toggleButton =\n SelectorEngine.findOne(`${SELECTOR_DATA_TOGGLE}[data-bs-target=\"#${this._element.id}\"]`) ||\n SelectorEngine.findOne(`${SELECTOR_DATA_TOGGLE}[href=\"#${this._element.id}\"]`)\n\n if (this._toggleButton) {\n if (!this._toggleButton.getAttribute('aria-expanded')) {\n this._toggleButton.setAttribute('aria-expanded', this._isShown ? 'true' : 'false')\n }\n }\n this._bindEvents()\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 toggle(relatedTarget) {\n this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget,\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n this._scrollBar.hide()\n\n if (this._btnBack) {\n this._btnBack.classList.add(CLASS_NAME_SHOW)\n }\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._backdrop.show()\n this._showElement()\n\n if (this._toggleButton) {\n this._toggleButton.setAttribute('aria-expanded', 'true')\n }\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n if (this._btnBack) {\n this._btnBack.classList.remove(CLASS_NAME_SHOW)\n }\n\n this._element.classList.remove(CLASS_NAME_EXPANDED)\n\n this._backdrop.hide()\n\n this._queueCallback(() => this._hideElement(), this._menuWrapper, this._isAnimated())\n\n if (this._toggleButton) {\n this._toggleButton.setAttribute('aria-expanded', 'false')\n }\n }\n\n dispose() {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.off(window, EVENT_RESIZE)\n EventHandler.off(document, EVENT_KEYDOWN)\n }\n this._backdrop.dispose()\n\n this._focustrap.deactivate()\n super.dispose()\n }\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated(),\n className: 'navbar-backdrop',\n rootElement: this._parentElement,\n clickCallback: () => {\n this.hide()\n },\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element,\n initialFocus: () => this._btnClose || this._element.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n })\n }\n\n // Private\n _bindEvents() {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.on(window, EVENT_RESIZE, () => this._onResize())\n EventHandler.on(document, EVENT_KEYDOWN, (evt) => {\n if (this._isShown && evt.key === 'Escape') {\n this.hide()\n }\n })\n\n EventHandler.on(this._btnClose, EVENT_CLICK, (evt) => {\n evt.preventDefault()\n this.hide()\n })\n EventHandler.on(this._btnBack, EVENT_CLICK, (evt) => {\n evt.preventDefault()\n this.hide()\n })\n this._menuItems.forEach((item) => {\n EventHandler.on(item, EVENT_KEYDOWN, (evt) => this._isMobile && this._onMenuItemKeyDown(evt))\n })\n }\n }\n\n _onResize() {\n this._isMobile = isScreenMobile()\n }\n\n _onMenuItemKeyDown(evt) {\n if (evt.key === 'Escape') {\n this.hide()\n }\n }\n\n _isAnimated() {\n return true\n }\n\n _isElementHidden(element) {\n return element.offsetParent === null\n }\n\n _showElement() {\n this._element.style.display = 'block'\n if (!this._element.getAttribute('aria-label') && !this._element.getAttribute('aria-labelledby')) {\n this._element.setAttribute('aria-label', 'Menu')\n }\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n\n if (this._mainElement && this._isNavbarOutsideMain) {\n this._mainElement.setAttribute('inert', '')\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_EXPANDED)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n this._queueCallback(transitionComplete, this._menuWrapper, this._isAnimated())\n }\n\n _hideElement() {\n this._element.style.display = 'none'\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n document.body.classList.remove(CLASS_NAME_OPEN)\n\n if (this._mainElement && this._isNavbarOutsideMain) {\n this._mainElement.removeAttribute('inert')\n }\n\n this._scrollBar.reset()\n this._isTransitioning = false\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, (showEvent) => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n const data = NavBarCollapsible.getOrCreateInstance(target)\n\n data.toggle(this)\n })\n}\n\nexport default NavBarCollapsible\n"],"names":[],"mappings":"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"}
@@ -22,6 +22,7 @@ const SELECTOR_TOGGLER = '.custom-navbar-toggler';
22
22
  const SELECTOR_TOGGLER_ICON = '.it-list';
23
23
  const SELECTOR_COLLAPSIBLE = '.navbar-collapsable';
24
24
  const SELECTOR_PROGRESS_BAR = '.it-navscroll-progressbar';
25
+ const SELECTOR_MENU_WRAPPER = '.menu-wrapper';
25
26
 
26
27
  const Default = {
27
28
  scrollPadding: 10,
@@ -41,6 +42,11 @@ class NavScroll extends BaseComponent {
41
42
  this._callbackQueue = [];
42
43
  this._scrollCb = null;
43
44
 
45
+ const menuWrapper = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, this._element);
46
+ if (menuWrapper && !menuWrapper.hasAttribute('tabindex')) {
47
+ menuWrapper.setAttribute('tabindex', '-1');
48
+ }
49
+
44
50
  this._bindEvents();
45
51
  }
46
52
  // Getters
@@ -144,13 +150,31 @@ class NavScroll extends BaseComponent {
144
150
  }
145
151
 
146
152
  _scrollToHash(hash) {
147
- const target = SelectorEngine.findOne(hash, this._sectionContainer);
153
+ if (!hash || hash === '#') {
154
+ // Validate hash to prevent errors
155
+ return
156
+ }
157
+ const target = this._sectionContainer // Fallback: when container is null, omit the second parameter entirely
158
+ ? SelectorEngine.findOne(hash, this._sectionContainer)
159
+ : SelectorEngine.findOne(hash);
148
160
  if (target) {
149
161
  documentScrollTo(target.offsetTop - this._getScrollPadding(), {
150
162
  duration: this._config.duration,
151
163
  easing: this._config.easing,
152
- /*complete: () => {
153
- },*/
164
+ complete: () => {
165
+ const isHeading = target.matches('h1, h2, h3, h4, h5, h6');
166
+ const needsTabIndex = !target.hasAttribute('tabindex');
167
+ if (needsTabIndex) {
168
+ target.setAttribute('tabindex', '-1');
169
+ }
170
+ target.focus({ preventScroll: true }); // preventScroll to avoid double scrolling
171
+ if (needsTabIndex && isHeading) {
172
+ // remove tabIndex for headings after 500ms
173
+ setTimeout(() => {
174
+ target.removeAttribute('tabindex');
175
+ }, 500);
176
+ }
177
+ },
154
178
  });
155
179
 
156
180
  if (history.pushState) {
@@ -1 +1 @@
1
- {"version":3,"file":"navscroll.js","sources":["../../src/js/plugins/navscroll.js"],"sourcesContent":["import BaseComponent from './base-component.js'\n\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\n\nimport onDocumentScroll from './util/on-document-scroll'\nimport NavBarCollapsible from './navbar-collapsible'\n\nimport { documentScrollTo } from './util/tween'\n\nconst NAME = 'navscroll'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_NAVSCROLL = '[data-bs-navscroll]' //'.it-navscroll-wrapper'\nconst SELECTOR_LIST = 'ul.link-list'\nconst SELECTOR_LINK_CONTAINER = 'li.nav-link, li.nav-item'\nconst SELECTOR_LINK = 'a.nav-link'\nconst SELECTOR_LINK_ACTIVE = `${SELECTOR_LINK}.${CLASS_NAME_ACTIVE}`\nconst SELECTOR_LINK_CLICKABLE = `${SELECTOR_LINK}[href^=\"#\"]`\nconst SELECTOR_CONTAINER = '.it-page-sections-container'\nconst SELECTOR_PAGE_SECTION = '.it-page-section'\nconst SELECTOR_TOGGLER = '.custom-navbar-toggler'\nconst SELECTOR_TOGGLER_ICON = '.it-list'\nconst SELECTOR_COLLAPSIBLE = '.navbar-collapsable'\nconst SELECTOR_PROGRESS_BAR = '.it-navscroll-progressbar'\n\nconst Default = {\n scrollPadding: 10,\n duration: 800,\n easing: 'easeInOutSine',\n}\nclass NavScroll extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n\n this._togglerElement = SelectorEngine.findOne(SELECTOR_TOGGLER, this._element)\n this._sectionContainer = SelectorEngine.findOne(SELECTOR_CONTAINER)\n this._collapsible = this._getCollapsible()\n this._isCollapseOpened = false\n this._callbackQueue = []\n this._scrollCb = null\n\n this._bindEvents()\n }\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n setScrollPadding(scrollPadding) {\n this._config.scrollPadding = scrollPadding\n }\n\n dispose() {\n if (this._scrollCb) {\n this._scrollCb.dispose()\n }\n super.dispose()\n }\n\n // Private\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {}),\n }\n return config\n }\n\n _bindEvents() {\n this._scrollCb = onDocumentScroll(() => this._onScroll())\n\n if (this._collapsible) {\n EventHandler.on(this._collapsible._element, 'shown.bs.navbarcollapsible', () => this._onCollapseOpened())\n EventHandler.on(this._collapsible._element, 'hidden.bs.navbarcollapsible', () => this._onCollapseClosed())\n }\n\n SelectorEngine.find(SELECTOR_LINK_CLICKABLE, this._element).forEach((link) => {\n link.addEventListener('click', () => {\n const scrollHash = () => this._scrollToHash(link.hash)\n if (this._isCollapseOpened) {\n this._callbackQueue.push(scrollHash)\n this._collapsible.hide()\n } else {\n scrollHash()\n }\n })\n })\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.on(window, 'load', () => {\n //if page is already scrolled\n setTimeout(() => this._onScroll(), 150)\n })\n }\n }\n\n _onCollapseOpened() {\n this._isCollapseOpened = true\n }\n _onCollapseClosed() {\n while (this._callbackQueue.length > 0) {\n const cb = this._callbackQueue.shift()\n if (typeof cb === 'function') {\n cb()\n }\n }\n this._isCollapseOpened = false\n }\n\n _getParentLinks(element) {\n const parents = []\n let parentContainer = element.closest(SELECTOR_LIST)\n let parentContainerPrev = null\n let exit = false\n while (parentContainer && !exit) {\n const parentLinkContainer = parentContainer.closest(SELECTOR_LINK_CONTAINER)\n if (parentLinkContainer) {\n const link = parentLinkContainer.querySelector(SELECTOR_LINK)\n if (link) {\n parents.push(link)\n }\n }\n parentContainerPrev = parentContainer\n parentContainer = (parentContainer.parentElement || parentContainer).closest(SELECTOR_LIST) //avoid self select of closest\n if (parentContainer === parentContainerPrev) {\n exit = true\n }\n }\n return parents\n }\n\n _decorateToggler(text) {\n if (this._togglerElement) {\n const icon = SelectorEngine.findOne(SELECTOR_TOGGLER_ICON, this._togglerElement)\n this._togglerElement.innerText = ''\n this._togglerElement.textContent = ''\n this._togglerElement.append(icon)\n this._togglerElement.append(text)\n }\n }\n\n _scrollToHash(hash) {\n const target = SelectorEngine.findOne(hash, this._sectionContainer)\n if (target) {\n documentScrollTo(target.offsetTop - this._getScrollPadding(), {\n duration: this._config.duration,\n easing: this._config.easing,\n /*complete: () => {\n },*/\n })\n\n if (history.pushState) {\n history.pushState(null, null, hash)\n } else {\n location.hash = hash\n }\n }\n }\n\n _updateProgress(content) {\n if (!content) {\n return\n }\n const progressBars = SelectorEngine.find(SELECTOR_PROGRESS_BAR)\n if (progressBars) {\n const offset = Math.abs(content.getBoundingClientRect().top)\n const height = content.getBoundingClientRect().height\n const scrollAmount = (offset / height) * 100\n const scrollValue = Math.min(100, Math.max(0, scrollAmount))\n\n progressBars.forEach((progressBar) => {\n if (content.getBoundingClientRect().top <= 0) {\n progressBar.style.width = scrollValue + '%'\n progressBar.setAttribute('aria-valuenow', scrollValue)\n } else {\n progressBar.style.width = 0 + '%'\n progressBar.setAttribute('aria-valuenow', 0)\n }\n })\n }\n }\n\n _onScroll() {\n const sectionsContainerTop = this._sectionContainer ? this._sectionContainer.offsetTop : 0\n if (typeof document === 'undefined') {\n return\n }\n const scrollDistance = document.scrollingElement.scrollTop - sectionsContainerTop\n\n const navItems = SelectorEngine.find(SELECTOR_LINK, this._element)\n\n const scrollPadding = this._getScrollPadding()\n\n SelectorEngine.find(SELECTOR_PAGE_SECTION).forEach((pageSec, idx) => {\n if (pageSec.offsetTop - sectionsContainerTop <= scrollDistance + scrollPadding) {\n SelectorEngine.find(SELECTOR_LINK_ACTIVE, this._element).forEach((link) => {\n link.classList.remove(CLASS_NAME_ACTIVE)\n })\n if (idx < navItems.length) {\n const currActive = navItems[idx]\n this._getParentLinks(currActive).forEach((parentLink) => {\n parentLink.classList.add(CLASS_NAME_ACTIVE)\n })\n currActive.classList.add(CLASS_NAME_ACTIVE)\n this._decorateToggler(currActive.innerText)\n }\n }\n })\n this._updateProgress(this._sectionContainer)\n }\n\n _getCollapsible() {\n const coll = SelectorEngine.findOne(SELECTOR_COLLAPSIBLE, this._element)\n if (coll) {\n return NavBarCollapsible.getOrCreateInstance(coll)\n }\n return null\n }\n\n _getScrollPadding() {\n if (typeof this._config.scrollPadding === 'function') {\n return this._config.scrollPadding()\n }\n return this._config.scrollPadding\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n const navs = SelectorEngine.find(SELECTOR_NAVSCROLL)\n navs.map((nav) => {\n NavScroll.getOrCreateInstance(nav)\n })\n}\n\nexport default NavScroll\n"],"names":[],"mappings":";;;;;;;;AAWA,MAAM,IAAI,GAAG;;AAEb,MAAM,iBAAiB,GAAG;;AAE1B,MAAM,kBAAkB,GAAG,sBAAqB;AAChD,MAAM,aAAa,GAAG;AACtB,MAAM,uBAAuB,GAAG;AAChC,MAAM,aAAa,GAAG;AACtB,MAAM,oBAAoB,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,EAAE,iBAAiB,CAAC;AACnE,MAAM,uBAAuB,GAAG,CAAC,EAAE,aAAa,CAAC,WAAW;AAC5D,MAAM,kBAAkB,GAAG;AAC3B,MAAM,qBAAqB,GAAG;AAC9B,MAAM,gBAAgB,GAAG;AACzB,MAAM,qBAAqB,GAAG;AAC9B,MAAM,oBAAoB,GAAG;AAC7B,MAAM,qBAAqB,GAAG;;AAE9B,MAAM,OAAO,GAAG;AAChB,EAAE,aAAa,EAAE,EAAE;AACnB,EAAE,QAAQ,EAAE,GAAG;AACf,EAAE,MAAM,EAAE,eAAe;AACzB;AACA,MAAM,SAAS,SAAS,aAAa,CAAC;AACtC,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE;AAC/B,IAAI,KAAK,CAAC,OAAO;;AAEjB,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;;AAEzC,IAAI,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ;AACjF,IAAI,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,OAAO,CAAC,kBAAkB;AACtE,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe;AAC5C,IAAI,IAAI,CAAC,iBAAiB,GAAG;AAC7B,IAAI,IAAI,CAAC,cAAc,GAAG;AAC1B,IAAI,IAAI,CAAC,SAAS,GAAG;;AAErB,IAAI,IAAI,CAAC,WAAW;AACpB;AACA;;AAEA,EAAE,WAAW,IAAI,GAAG;AACpB,IAAI,OAAO;AACX;;AAEA;AACA,EAAE,gBAAgB,CAAC,aAAa,EAAE;AAClC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,GAAG;AACjC;;AAEA,EAAE,OAAO,GAAG;AACZ,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AACxB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO;AAC5B;AACA,IAAI,KAAK,CAAC,OAAO;AACjB;;AAEA;AACA,EAAE,UAAU,CAAC,MAAM,EAAE;AACrB,IAAI,MAAM,GAAG;AACb,MAAM,GAAG,OAAO;AAChB,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACrD,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,EAAE,CAAC;AACnD;AACA,IAAI,OAAO;AACX;;AAEA,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE;;AAE5D,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE;AAC3B,MAAM,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,4BAA4B,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE;AAC9G,MAAM,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,6BAA6B,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE;AAC/G;;AAEA,IAAI,cAAc,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK;AAClF,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM;AAC3C,QAAQ,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI;AAC7D,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACpC,UAAU,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU;AAC7C,UAAU,IAAI,CAAC,YAAY,CAAC,IAAI;AAChC,SAAS,MAAM;AACf,UAAU,UAAU;AACpB;AACA,OAAO;AACP,KAAK;AACL,IAAI,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AAC1E,MAAM,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM;AAC5C;AACA,QAAQ,UAAU,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG;AAC9C,OAAO;AACP;AACA;;AAEA,EAAE,iBAAiB,GAAG;AACtB,IAAI,IAAI,CAAC,iBAAiB,GAAG;AAC7B;AACA,EAAE,iBAAiB,GAAG;AACtB,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,MAAM,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK;AAC1C,MAAM,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE;AACpC,QAAQ,EAAE;AACV;AACA;AACA,IAAI,IAAI,CAAC,iBAAiB,GAAG;AAC7B;;AAEA,EAAE,eAAe,CAAC,OAAO,EAAE;AAC3B,IAAI,MAAM,OAAO,GAAG;AACpB,IAAI,IAAI,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa;AACvD,IAAI,IAAI,mBAAmB,GAAG;AAC9B,IAAI,IAAI,IAAI,GAAG;AACf,IAAI,OAAO,eAAe,IAAI,CAAC,IAAI,EAAE;AACrC,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,CAAC,uBAAuB;AACjF,MAAM,IAAI,mBAAmB,EAAE;AAC/B,QAAQ,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,CAAC,aAAa;AACpE,QAAQ,IAAI,IAAI,EAAE;AAClB,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI;AAC3B;AACA;AACA,MAAM,mBAAmB,GAAG;AAC5B,MAAM,eAAe,GAAG,CAAC,eAAe,CAAC,aAAa,IAAI,eAAe,EAAE,OAAO,CAAC,aAAa,EAAC;AACjG,MAAM,IAAI,eAAe,KAAK,mBAAmB,EAAE;AACnD,QAAQ,IAAI,GAAG;AACf;AACA;AACA,IAAI,OAAO;AACX;;AAEA,EAAE,gBAAgB,CAAC,IAAI,EAAE;AACzB,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE;AAC9B,MAAM,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,eAAe;AACrF,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,GAAG;AACvC,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,GAAG;AACzC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI;AACtC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI;AACtC;AACA;;AAEA,EAAE,aAAa,CAAC,IAAI,EAAE;AACtB,IAAI,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB;AACtE,IAAI,IAAI,MAAM,EAAE;AAChB,MAAM,gBAAgB,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE;AACpE,QAAQ,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;AACvC,QAAQ,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;AACnC;AACA;AACA,OAAO;;AAEP,MAAM,IAAI,OAAO,CAAC,SAAS,EAAE;AAC7B,QAAQ,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI;AAC1C,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,IAAI,GAAG;AACxB;AACA;AACA;;AAEA,EAAE,eAAe,CAAC,OAAO,EAAE;AAC3B,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM;AACN;AACA,IAAI,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,qBAAqB;AAClE,IAAI,IAAI,YAAY,EAAE;AACtB,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG;AACjE,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;AACrD,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,GAAG,MAAM,IAAI;AAC/C,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC;;AAEjE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAK;AAC5C,QAAQ,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;AACtD,UAAU,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,GAAG;AAClD,UAAU,WAAW,CAAC,YAAY,CAAC,eAAe,EAAE,WAAW;AAC/D,SAAS,MAAM;AACf,UAAU,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG;AACxC,UAAU,WAAW,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;AACrD;AACA,OAAO;AACP;AACA;;AAEA,EAAE,SAAS,GAAG;AACd,IAAI,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,GAAG;AAC7F,IAAI,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACzC,MAAM;AACN;AACA,IAAI,MAAM,cAAc,GAAG,QAAQ,CAAC,gBAAgB,CAAC,SAAS,GAAG;;AAEjE,IAAI,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ;;AAErE,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB;;AAEhD,IAAI,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK;AACzE,MAAM,IAAI,OAAO,CAAC,SAAS,GAAG,oBAAoB,IAAI,cAAc,GAAG,aAAa,EAAE;AACtF,QAAQ,cAAc,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK;AACnF,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB;AACjD,SAAS;AACT,QAAQ,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE;AACnC,UAAU,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG;AACzC,UAAU,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,KAAK;AACnE,YAAY,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB;AACtD,WAAW;AACX,UAAU,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB;AACpD,UAAU,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,SAAS;AACpD;AACA;AACA,KAAK;AACL,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB;AAC/C;;AAEA,EAAE,eAAe,GAAG;AACpB,IAAI,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ;AAC3E,IAAI,IAAI,IAAI,EAAE;AACd,MAAM,OAAO,iBAAiB,CAAC,mBAAmB,CAAC,IAAI;AACvD;AACA,IAAI,OAAO;AACX;;AAEA,EAAE,iBAAiB,GAAG;AACtB,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,UAAU,EAAE;AAC1D,MAAM,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa;AACvC;AACA,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC;AACxB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;AACtE,EAAE,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,kBAAkB;AACrD,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;AACpB,IAAI,SAAS,CAAC,mBAAmB,CAAC,GAAG;AACrC,GAAG;AACH;;;;"}
1
+ {"version":3,"file":"navscroll.js","sources":["../../src/js/plugins/navscroll.js"],"sourcesContent":["import BaseComponent from './base-component.js'\n\nimport EventHandler from './dom/event-handler'\nimport SelectorEngine from './dom/selector-engine'\nimport Manipulator from './dom/manipulator'\n\nimport onDocumentScroll from './util/on-document-scroll'\nimport NavBarCollapsible from './navbar-collapsible'\n\nimport { documentScrollTo } from './util/tween'\n\nconst NAME = 'navscroll'\n\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_NAVSCROLL = '[data-bs-navscroll]' //'.it-navscroll-wrapper'\nconst SELECTOR_LIST = 'ul.link-list'\nconst SELECTOR_LINK_CONTAINER = 'li.nav-link, li.nav-item'\nconst SELECTOR_LINK = 'a.nav-link'\nconst SELECTOR_LINK_ACTIVE = `${SELECTOR_LINK}.${CLASS_NAME_ACTIVE}`\nconst SELECTOR_LINK_CLICKABLE = `${SELECTOR_LINK}[href^=\"#\"]`\nconst SELECTOR_CONTAINER = '.it-page-sections-container'\nconst SELECTOR_PAGE_SECTION = '.it-page-section'\nconst SELECTOR_TOGGLER = '.custom-navbar-toggler'\nconst SELECTOR_TOGGLER_ICON = '.it-list'\nconst SELECTOR_COLLAPSIBLE = '.navbar-collapsable'\nconst SELECTOR_PROGRESS_BAR = '.it-navscroll-progressbar'\nconst SELECTOR_MENU_WRAPPER = '.menu-wrapper'\n\nconst Default = {\n scrollPadding: 10,\n duration: 800,\n easing: 'easeInOutSine',\n}\nclass NavScroll extends BaseComponent {\n constructor(element, config) {\n super(element)\n\n this._config = this._getConfig(config)\n\n this._togglerElement = SelectorEngine.findOne(SELECTOR_TOGGLER, this._element)\n this._sectionContainer = SelectorEngine.findOne(SELECTOR_CONTAINER)\n this._collapsible = this._getCollapsible()\n this._isCollapseOpened = false\n this._callbackQueue = []\n this._scrollCb = null\n\n const menuWrapper = SelectorEngine.findOne(SELECTOR_MENU_WRAPPER, this._element)\n if (menuWrapper && !menuWrapper.hasAttribute('tabindex')) {\n menuWrapper.setAttribute('tabindex', '-1')\n }\n\n this._bindEvents()\n }\n // Getters\n\n static get NAME() {\n return NAME\n }\n\n // Public\n setScrollPadding(scrollPadding) {\n this._config.scrollPadding = scrollPadding\n }\n\n dispose() {\n if (this._scrollCb) {\n this._scrollCb.dispose()\n }\n super.dispose()\n }\n\n // Private\n _getConfig(config) {\n config = {\n ...Default,\n ...Manipulator.getDataAttributes(this._element),\n ...(typeof config === 'object' ? config : {}),\n }\n return config\n }\n\n _bindEvents() {\n this._scrollCb = onDocumentScroll(() => this._onScroll())\n\n if (this._collapsible) {\n EventHandler.on(this._collapsible._element, 'shown.bs.navbarcollapsible', () => this._onCollapseOpened())\n EventHandler.on(this._collapsible._element, 'hidden.bs.navbarcollapsible', () => this._onCollapseClosed())\n }\n\n SelectorEngine.find(SELECTOR_LINK_CLICKABLE, this._element).forEach((link) => {\n link.addEventListener('click', () => {\n const scrollHash = () => this._scrollToHash(link.hash)\n if (this._isCollapseOpened) {\n this._callbackQueue.push(scrollHash)\n this._collapsible.hide()\n } else {\n scrollHash()\n }\n })\n })\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n EventHandler.on(window, 'load', () => {\n //if page is already scrolled\n setTimeout(() => this._onScroll(), 150)\n })\n }\n }\n\n _onCollapseOpened() {\n this._isCollapseOpened = true\n }\n _onCollapseClosed() {\n while (this._callbackQueue.length > 0) {\n const cb = this._callbackQueue.shift()\n if (typeof cb === 'function') {\n cb()\n }\n }\n this._isCollapseOpened = false\n }\n\n _getParentLinks(element) {\n const parents = []\n let parentContainer = element.closest(SELECTOR_LIST)\n let parentContainerPrev = null\n let exit = false\n while (parentContainer && !exit) {\n const parentLinkContainer = parentContainer.closest(SELECTOR_LINK_CONTAINER)\n if (parentLinkContainer) {\n const link = parentLinkContainer.querySelector(SELECTOR_LINK)\n if (link) {\n parents.push(link)\n }\n }\n parentContainerPrev = parentContainer\n parentContainer = (parentContainer.parentElement || parentContainer).closest(SELECTOR_LIST) //avoid self select of closest\n if (parentContainer === parentContainerPrev) {\n exit = true\n }\n }\n return parents\n }\n\n _decorateToggler(text) {\n if (this._togglerElement) {\n const icon = SelectorEngine.findOne(SELECTOR_TOGGLER_ICON, this._togglerElement)\n this._togglerElement.innerText = ''\n this._togglerElement.textContent = ''\n this._togglerElement.append(icon)\n this._togglerElement.append(text)\n }\n }\n\n _scrollToHash(hash) {\n if (!hash || hash === '#') {\n // Validate hash to prevent errors\n return\n }\n const target = this._sectionContainer // Fallback: when container is null, omit the second parameter entirely\n ? SelectorEngine.findOne(hash, this._sectionContainer)\n : SelectorEngine.findOne(hash)\n if (target) {\n documentScrollTo(target.offsetTop - this._getScrollPadding(), {\n duration: this._config.duration,\n easing: this._config.easing,\n complete: () => {\n const isHeading = target.matches('h1, h2, h3, h4, h5, h6')\n const needsTabIndex = !target.hasAttribute('tabindex')\n if (needsTabIndex) {\n target.setAttribute('tabindex', '-1')\n }\n target.focus({ preventScroll: true }) // preventScroll to avoid double scrolling\n if (needsTabIndex && isHeading) {\n // remove tabIndex for headings after 500ms\n setTimeout(() => {\n target.removeAttribute('tabindex')\n }, 500)\n }\n },\n })\n\n if (history.pushState) {\n history.pushState(null, null, hash)\n } else {\n location.hash = hash\n }\n }\n }\n\n _updateProgress(content) {\n if (!content) {\n return\n }\n const progressBars = SelectorEngine.find(SELECTOR_PROGRESS_BAR)\n if (progressBars) {\n const offset = Math.abs(content.getBoundingClientRect().top)\n const height = content.getBoundingClientRect().height\n const scrollAmount = (offset / height) * 100\n const scrollValue = Math.min(100, Math.max(0, scrollAmount))\n\n progressBars.forEach((progressBar) => {\n if (content.getBoundingClientRect().top <= 0) {\n progressBar.style.width = scrollValue + '%'\n progressBar.setAttribute('aria-valuenow', scrollValue)\n } else {\n progressBar.style.width = 0 + '%'\n progressBar.setAttribute('aria-valuenow', 0)\n }\n })\n }\n }\n\n _onScroll() {\n const sectionsContainerTop = this._sectionContainer ? this._sectionContainer.offsetTop : 0\n if (typeof document === 'undefined') {\n return\n }\n const scrollDistance = document.scrollingElement.scrollTop - sectionsContainerTop\n\n const navItems = SelectorEngine.find(SELECTOR_LINK, this._element)\n\n const scrollPadding = this._getScrollPadding()\n\n SelectorEngine.find(SELECTOR_PAGE_SECTION).forEach((pageSec, idx) => {\n if (pageSec.offsetTop - sectionsContainerTop <= scrollDistance + scrollPadding) {\n SelectorEngine.find(SELECTOR_LINK_ACTIVE, this._element).forEach((link) => {\n link.classList.remove(CLASS_NAME_ACTIVE)\n })\n if (idx < navItems.length) {\n const currActive = navItems[idx]\n this._getParentLinks(currActive).forEach((parentLink) => {\n parentLink.classList.add(CLASS_NAME_ACTIVE)\n })\n currActive.classList.add(CLASS_NAME_ACTIVE)\n this._decorateToggler(currActive.innerText)\n }\n }\n })\n this._updateProgress(this._sectionContainer)\n }\n\n _getCollapsible() {\n const coll = SelectorEngine.findOne(SELECTOR_COLLAPSIBLE, this._element)\n if (coll) {\n return NavBarCollapsible.getOrCreateInstance(coll)\n }\n return null\n }\n\n _getScrollPadding() {\n if (typeof this._config.scrollPadding === 'function') {\n return this._config.scrollPadding()\n }\n return this._config.scrollPadding\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n const navs = SelectorEngine.find(SELECTOR_NAVSCROLL)\n navs.map((nav) => {\n NavScroll.getOrCreateInstance(nav)\n })\n}\n\nexport default NavScroll\n"],"names":[],"mappings":"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"}