PluginProbe
UpdraftCentral Dashboard / 0.8.26
UpdraftCentral Dashboard v0.8.26
0.8.33 0.7.2 0.7.3 0.7.4 0.8.0 0.8.1 0.8.10 0.8.11 0.8.12 0.8.13 0.8.14 0.8.15 0.8.16 0.8.17 0.8.18 0.8.19 0.8.2 0.8.20 0.8.21 0.8.22 0.8.23 0.8.24 0.8.25 0.8.26 0.8.27 All 51 releases
updraftcentral / js / bootstrap / bootstrap.js

bootstrap.js in UpdraftCentral Dashboard 0.8.26, at js/bootstrap/bootstrap.js

5,250 lines 142.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*!
2 * Bootstrap v5.2.3 (https://getbootstrap.com/)
3 * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5 */
6 (function (global, factory) {
7 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :
8 typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :
9 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));
10 })(this, (function (Popper) { 'use strict';
11
12 function _interopNamespace(e) {
13 if (e && e.__esModule) return e;
14 const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
15 if (e) {
16 for (const k in e) {
17 if (k !== 'default') {
18 const d = Object.getOwnPropertyDescriptor(e, k);
19 Object.defineProperty(n, k, d.get ? d : {
20 enumerable: true,
21 get: () => e[k]
22 });
23 }
24 }
25 }
26 n.default = e;
27 return Object.freeze(n);
28 }
29
30 const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
31
32 /**
33 * --------------------------------------------------------------------------
34 * Bootstrap (v5.2.3): util/index.js
35 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
36 * --------------------------------------------------------------------------
37 */
38 const MAX_UID = 1000000;
39 const MILLISECONDS_MULTIPLIER = 1000;
40 const TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp)
41
42 const toType = object => {
43 if (object === null || object === undefined) {
44 return `${object}`;
45 }
46
47 return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
48 };
49 /**
50 * Public Util API
51 */
52
53
54 const getUID = prefix => {
55 do {
56 prefix += Math.floor(Math.random() * MAX_UID);
57 } while (document.getElementById(prefix));
58
59 return prefix;
60 };
61
62 const getSelector = element => {
63 let selector = element.getAttribute('data-bs-target');
64
65 if (!selector || selector === '#') {
66 let hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
67 // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
68 // `document.querySelector` will rightfully complain it is invalid.
69 // See https://github.com/twbs/bootstrap/issues/32273
70
71 if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
72 return null;
73 } // Just in case some CMS puts out a full URL with the anchor appended
74
75
76 if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
77 hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
78 }
79
80 selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
81 }
82
83 return selector;
84 };
85
86 const getSelectorFromElement = element => {
87 const selector = getSelector(element);
88
89 if (selector) {
90 return document.querySelector(selector) ? selector : null;
91 }
92
93 return null;
94 };
95
96 const getElementFromSelector = element => {
97 const selector = getSelector(element);
98 return selector ? document.querySelector(selector) : null;
99 };
100
101 const getTransitionDurationFromElement = element => {
102 if (!element) {
103 return 0;
104 } // Get transition-duration of the element
105
106
107 let {
108 transitionDuration,
109 transitionDelay
110 } = window.getComputedStyle(element);
111 const floatTransitionDuration = Number.parseFloat(transitionDuration);
112 const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
113
114 if (!floatTransitionDuration && !floatTransitionDelay) {
115 return 0;
116 } // If multiple durations are defined, take the first
117
118
119 transitionDuration = transitionDuration.split(',')[0];
120 transitionDelay = transitionDelay.split(',')[0];
121 return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
122 };
123
124 const triggerTransitionEnd = element => {
125 element.dispatchEvent(new Event(TRANSITION_END));
126 };
127
128 const isElement = object => {
129 if (!object || typeof object !== 'object') {
130 return false;
131 }
132
133 if (typeof object.jquery !== 'undefined') {
134 object = object[0];
135 }
136
137 return typeof object.nodeType !== 'undefined';
138 };
139
140 const getElement = object => {
141 // it's a jQuery object or a node element
142 if (isElement(object)) {
143 return object.jquery ? object[0] : object;
144 }
145
146 if (typeof object === 'string' && object.length > 0) {
147 return document.querySelector(object);
148 }
149
150 return null;
151 };
152
153 const isVisible = element => {
154 if (!isElement(element) || element.getClientRects().length === 0) {
155 return false;
156 }
157
158 const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed
159
160 const closedDetails = element.closest('details:not([open])');
161
162 if (!closedDetails) {
163 return elementIsVisible;
164 }
165
166 if (closedDetails !== element) {
167 const summary = element.closest('summary');
168
169 if (summary && summary.parentNode !== closedDetails) {
170 return false;
171 }
172
173 if (summary === null) {
174 return false;
175 }
176 }
177
178 return elementIsVisible;
179 };
180
181 const isDisabled = element => {
182 if (!element || element.nodeType !== Node.ELEMENT_NODE) {
183 return true;
184 }
185
186 if (element.classList.contains('disabled')) {
187 return true;
188 }
189
190 if (typeof element.disabled !== 'undefined') {
191 return element.disabled;
192 }
193
194 return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
195 };
196
197 const findShadowRoot = element => {
198 if (!document.documentElement.attachShadow) {
199 return null;
200 } // Can find the shadow root otherwise it'll return the document
201
202
203 if (typeof element.getRootNode === 'function') {
204 const root = element.getRootNode();
205 return root instanceof ShadowRoot ? root : null;
206 }
207
208 if (element instanceof ShadowRoot) {
209 return element;
210 } // when we don't find a shadow root
211
212
213 if (!element.parentNode) {
214 return null;
215 }
216
217 return findShadowRoot(element.parentNode);
218 };
219
220 const noop = () => {};
221 /**
222 * Trick to restart an element's animation
223 *
224 * @param {HTMLElement} element
225 * @return void
226 *
227 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
228 */
229
230
231 const reflow = element => {
232 element.offsetHeight; // eslint-disable-line no-unused-expressions
233 };
234
235 const getjQuery = () => {
236 if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
237 return window.jQuery;
238 }
239
240 return null;
241 };
242
243 const DOMContentLoadedCallbacks = [];
244
245 const onDOMContentLoaded = callback => {
246 if (document.readyState === 'loading') {
247 // add listener on the first call when the document is in loading state
248 if (!DOMContentLoadedCallbacks.length) {
249 document.addEventListener('DOMContentLoaded', () => {
250 for (const callback of DOMContentLoadedCallbacks) {
251 callback();
252 }
253 });
254 }
255
256 DOMContentLoadedCallbacks.push(callback);
257 } else {
258 callback();
259 }
260 };
261
262 const isRTL = () => document.documentElement.dir === 'rtl';
263
264 const defineJQueryPlugin = plugin => {
265 onDOMContentLoaded(() => {
266 const $ = getjQuery();
267 /* istanbul ignore if */
268
269 if ($) {
270 const name = plugin.NAME;
271 const JQUERY_NO_CONFLICT = $.fn[name];
272 $.fn[name] = plugin.jQueryInterface;
273 $.fn[name].Constructor = plugin;
274
275 $.fn[name].noConflict = () => {
276 $.fn[name] = JQUERY_NO_CONFLICT;
277 return plugin.jQueryInterface;
278 };
279 }
280 });
281 };
282
283 const execute = callback => {
284 if (typeof callback === 'function') {
285 callback();
286 }
287 };
288
289 const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
290 if (!waitForTransition) {
291 execute(callback);
292 return;
293 }
294
295 const durationPadding = 5;
296 const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
297 let called = false;
298
299 const handler = ({
300 target
301 }) => {
302 if (target !== transitionElement) {
303 return;
304 }
305
306 called = true;
307 transitionElement.removeEventListener(TRANSITION_END, handler);
308 execute(callback);
309 };
310
311 transitionElement.addEventListener(TRANSITION_END, handler);
312 setTimeout(() => {
313 if (!called) {
314 triggerTransitionEnd(transitionElement);
315 }
316 }, emulatedDuration);
317 };
318 /**
319 * Return the previous/next element of a list.
320 *
321 * @param {array} list The list of elements
322 * @param activeElement The active element
323 * @param shouldGetNext Choose to get next or previous element
324 * @param isCycleAllowed
325 * @return {Element|elem} The proper element
326 */
327
328
329 const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
330 const listLength = list.length;
331 let index = list.indexOf(activeElement); // if the element does not exist in the list return an element
332 // depending on the direction and if cycle is allowed
333
334 if (index === -1) {
335 return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
336 }
337
338 index += shouldGetNext ? 1 : -1;
339
340 if (isCycleAllowed) {
341 index = (index + listLength) % listLength;
342 }
343
344 return list[Math.max(0, Math.min(index, listLength - 1))];
345 };
346
347 /**
348 * --------------------------------------------------------------------------
349 * Bootstrap (v5.2.3): dom/event-handler.js
350 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
351 * --------------------------------------------------------------------------
352 */
353 /**
354 * Constants
355 */
356
357 const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
358 const stripNameRegex = /\..*/;
359 const stripUidRegex = /::\d+$/;
360 const eventRegistry = {}; // Events storage
361
362 let uidEvent = 1;
363 const customEvents = {
364 mouseenter: 'mouseover',
365 mouseleave: 'mouseout'
366 };
367 const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
368 /**
369 * Private methods
370 */
371
372 function makeEventUid(element, uid) {
373 return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
374 }
375
376 function getElementEvents(element) {
377 const uid = makeEventUid(element);
378 element.uidEvent = uid;
379 eventRegistry[uid] = eventRegistry[uid] || {};
380 return eventRegistry[uid];
381 }
382
383 function bootstrapHandler(element, fn) {
384 return function handler(event) {
385 hydrateObj(event, {
386 delegateTarget: element
387 });
388
389 if (handler.oneOff) {
390 EventHandler.off(element, event.type, fn);
391 }
392
393 return fn.apply(element, [event]);
394 };
395 }
396
397 function bootstrapDelegationHandler(element, selector, fn) {
398 return function handler(event) {
399 const domElements = element.querySelectorAll(selector);
400
401 for (let {
402 target
403 } = event; target && target !== this; target = target.parentNode) {
404 for (const domElement of domElements) {
405 if (domElement !== target) {
406 continue;
407 }
408
409 hydrateObj(event, {
410 delegateTarget: target
411 });
412
413 if (handler.oneOff) {
414 EventHandler.off(element, event.type, selector, fn);
415 }
416
417 return fn.apply(target, [event]);
418 }
419 }
420 };
421 }
422
423 function findHandler(events, callable, delegationSelector = null) {
424 return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
425 }
426
427 function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
428 const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check
429
430 const callable = isDelegated ? delegationFunction : handler || delegationFunction;
431 let typeEvent = getTypeEvent(originalTypeEvent);
432
433 if (!nativeEvents.has(typeEvent)) {
434 typeEvent = originalTypeEvent;
435 }
436
437 return [isDelegated, callable, typeEvent];
438 }
439
440 function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
441 if (typeof originalTypeEvent !== 'string' || !element) {
442 return;
443 }
444
445 let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
446 // this prevents the handler from being dispatched the same way as mouseover or mouseout does
447
448 if (originalTypeEvent in customEvents) {
449 const wrapFunction = fn => {
450 return function (event) {
451 if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
452 return fn.call(this, event);
453 }
454 };
455 };
456
457 callable = wrapFunction(callable);
458 }
459
460 const events = getElementEvents(element);
461 const handlers = events[typeEvent] || (events[typeEvent] = {});
462 const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
463
464 if (previousFunction) {
465 previousFunction.oneOff = previousFunction.oneOff && oneOff;
466 return;
467 }
468
469 const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
470 const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
471 fn.delegationSelector = isDelegated ? handler : null;
472 fn.callable = callable;
473 fn.oneOff = oneOff;
474 fn.uidEvent = uid;
475 handlers[uid] = fn;
476 element.addEventListener(typeEvent, fn, isDelegated);
477 }
478
479 function removeHandler(element, events, typeEvent, handler, delegationSelector) {
480 const fn = findHandler(events[typeEvent], handler, delegationSelector);
481
482 if (!fn) {
483 return;
484 }
485
486 element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
487 delete events[typeEvent][fn.uidEvent];
488 }
489
490 function removeNamespacedHandlers(element, events, typeEvent, namespace) {
491 const storeElementEvent = events[typeEvent] || {};
492
493 for (const handlerKey of Object.keys(storeElementEvent)) {
494 if (handlerKey.includes(namespace)) {
495 const event = storeElementEvent[handlerKey];
496 removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
497 }
498 }
499 }
500
501 function getTypeEvent(event) {
502 // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
503 event = event.replace(stripNameRegex, '');
504 return customEvents[event] || event;
505 }
506
507 const EventHandler = {
508 on(element, event, handler, delegationFunction) {
509 addHandler(element, event, handler, delegationFunction, false);
510 },
511
512 one(element, event, handler, delegationFunction) {
513 addHandler(element, event, handler, delegationFunction, true);
514 },
515
516 off(element, originalTypeEvent, handler, delegationFunction) {
517 if (typeof originalTypeEvent !== 'string' || !element) {
518 return;
519 }
520
521 const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
522 const inNamespace = typeEvent !== originalTypeEvent;
523 const events = getElementEvents(element);
524 const storeElementEvent = events[typeEvent] || {};
525 const isNamespace = originalTypeEvent.startsWith('.');
526
527 if (typeof callable !== 'undefined') {
528 // Simplest case: handler is passed, remove that listener ONLY.
529 if (!Object.keys(storeElementEvent).length) {
530 return;
531 }
532
533 removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
534 return;
535 }
536
537 if (isNamespace) {
538 for (const elementEvent of Object.keys(events)) {
539 removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
540 }
541 }
542
543 for (const keyHandlers of Object.keys(storeElementEvent)) {
544 const handlerKey = keyHandlers.replace(stripUidRegex, '');
545
546 if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
547 const event = storeElementEvent[keyHandlers];
548 removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
549 }
550 }
551 },
552
553 trigger(element, event, args) {
554 if (typeof event !== 'string' || !element) {
555 return null;
556 }
557
558 const $ = getjQuery();
559 const typeEvent = getTypeEvent(event);
560 const inNamespace = event !== typeEvent;
561 let jQueryEvent = null;
562 let bubbles = true;
563 let nativeDispatch = true;
564 let defaultPrevented = false;
565
566 if (inNamespace && $) {
567 jQueryEvent = $.Event(event, args);
568 $(element).trigger(jQueryEvent);
569 bubbles = !jQueryEvent.isPropagationStopped();
570 nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
571 defaultPrevented = jQueryEvent.isDefaultPrevented();
572 }
573
574 let evt = new Event(event, {
575 bubbles,
576 cancelable: true
577 });
578 evt = hydrateObj(evt, args);
579
580 if (defaultPrevented) {
581 evt.preventDefault();
582 }
583
584 if (nativeDispatch) {
585 element.dispatchEvent(evt);
586 }
587
588 if (evt.defaultPrevented && jQueryEvent) {
589 jQueryEvent.preventDefault();
590 }
591
592 return evt;
593 }
594
595 };
596
597 function hydrateObj(obj, meta) {
598 for (const [key, value] of Object.entries(meta || {})) {
599 try {
600 obj[key] = value;
601 } catch (_unused) {
602 Object.defineProperty(obj, key, {
603 configurable: true,
604
605 get() {
606 return value;
607 }
608
609 });
610 }
611 }
612
613 return obj;
614 }
615
616 /**
617 * --------------------------------------------------------------------------
618 * Bootstrap (v5.2.3): dom/data.js
619 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
620 * --------------------------------------------------------------------------
621 */
622
623 /**
624 * Constants
625 */
626 const elementMap = new Map();
627 const Data = {
628 set(element, key, instance) {
629 if (!elementMap.has(element)) {
630 elementMap.set(element, new Map());
631 }
632
633 const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
634 // can be removed later when multiple key/instances are fine to be used
635
636 if (!instanceMap.has(key) && instanceMap.size !== 0) {
637 // eslint-disable-next-line no-console
638 console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
639 return;
640 }
641
642 instanceMap.set(key, instance);
643 },
644
645 get(element, key) {
646 if (elementMap.has(element)) {
647 return elementMap.get(element).get(key) || null;
648 }
649
650 return null;
651 },
652
653 remove(element, key) {
654 if (!elementMap.has(element)) {
655 return;
656 }
657
658 const instanceMap = elementMap.get(element);
659 instanceMap.delete(key); // free up element references if there are no instances left for an element
660
661 if (instanceMap.size === 0) {
662 elementMap.delete(element);
663 }
664 }
665
666 };
667
668 /**
669 * --------------------------------------------------------------------------
670 * Bootstrap (v5.2.3): dom/manipulator.js
671 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
672 * --------------------------------------------------------------------------
673 */
674 function normalizeData(value) {
675 if (value === 'true') {
676 return true;
677 }
678
679 if (value === 'false') {
680 return false;
681 }
682
683 if (value === Number(value).toString()) {
684 return Number(value);
685 }
686
687 if (value === '' || value === 'null') {
688 return null;
689 }
690
691 if (typeof value !== 'string') {
692 return value;
693 }
694
695 try {
696 return JSON.parse(decodeURIComponent(value));
697 } catch (_unused) {
698 return value;
699 }
700 }
701
702 function normalizeDataKey(key) {
703 return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
704 }
705
706 const Manipulator = {
707 setDataAttribute(element, key, value) {
708 element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
709 },
710
711 removeDataAttribute(element, key) {
712 element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
713 },
714
715 getDataAttributes(element) {
716 if (!element) {
717 return {};
718 }
719
720 const attributes = {};
721 const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
722
723 for (const key of bsKeys) {
724 let pureKey = key.replace(/^bs/, '');
725 pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
726 attributes[pureKey] = normalizeData(element.dataset[key]);
727 }
728
729 return attributes;
730 },
731
732 getDataAttribute(element, key) {
733 return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
734 }
735
736 };
737
738 /**
739 * --------------------------------------------------------------------------
740 * Bootstrap (v5.2.3): util/config.js
741 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
742 * --------------------------------------------------------------------------
743 */
744 /**
745 * Class definition
746 */
747
748 class Config {
749 // Getters
750 static get Default() {
751 return {};
752 }
753
754 static get DefaultType() {
755 return {};
756 }
757
758 static get NAME() {
759 throw new Error('You have to implement the static method "NAME", for each component!');
760 }
761
762 _getConfig(config) {
763 config = this._mergeConfigObj(config);
764 config = this._configAfterMerge(config);
765
766 this._typeCheckConfig(config);
767
768 return config;
769 }
770
771 _configAfterMerge(config) {
772 return config;
773 }
774
775 _mergeConfigObj(config, element) {
776 const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse
777
778 return { ...this.constructor.Default,
779 ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
780 ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),
781 ...(typeof config === 'object' ? config : {})
782 };
783 }
784
785 _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
786 for (const property of Object.keys(configTypes)) {
787 const expectedTypes = configTypes[property];
788 const value = config[property];
789 const valueType = isElement(value) ? 'element' : toType(value);
790
791 if (!new RegExp(expectedTypes).test(valueType)) {
792 throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
793 }
794 }
795 }
796
797 }
798
799 /**
800 * --------------------------------------------------------------------------
801 * Bootstrap (v5.2.3): base-component.js
802 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
803 * --------------------------------------------------------------------------
804 */
805 /**
806 * Constants
807 */
808
809 const VERSION = '5.2.3';
810 /**
811 * Class definition
812 */
813
814 class BaseComponent extends Config {
815 constructor(element, config) {
816 super();
817 element = getElement(element);
818
819 if (!element) {
820 return;
821 }
822
823 this._element = element;
824 this._config = this._getConfig(config);
825 Data.set(this._element, this.constructor.DATA_KEY, this);
826 } // Public
827
828
829 dispose() {
830 Data.remove(this._element, this.constructor.DATA_KEY);
831 EventHandler.off(this._element, this.constructor.EVENT_KEY);
832
833 for (const propertyName of Object.getOwnPropertyNames(this)) {
834 this[propertyName] = null;
835 }
836 }
837
838 _queueCallback(callback, element, isAnimated = true) {
839 executeAfterTransition(callback, element, isAnimated);
840 }
841
842 _getConfig(config) {
843 config = this._mergeConfigObj(config, this._element);
844 config = this._configAfterMerge(config);
845
846 this._typeCheckConfig(config);
847
848 return config;
849 } // Static
850
851
852 static getInstance(element) {
853 return Data.get(getElement(element), this.DATA_KEY);
854 }
855
856 static getOrCreateInstance(element, config = {}) {
857 return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
858 }
859
860 static get VERSION() {
861 return VERSION;
862 }
863
864 static get DATA_KEY() {
865 return `bs.${this.NAME}`;
866 }
867
868 static get EVENT_KEY() {
869 return `.${this.DATA_KEY}`;
870 }
871
872 static eventName(name) {
873 return `${name}${this.EVENT_KEY}`;
874 }
875
876 }
877
878 /**
879 * --------------------------------------------------------------------------
880 * Bootstrap (v5.2.3): util/component-functions.js
881 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
882 * --------------------------------------------------------------------------
883 */
884
885 const enableDismissTrigger = (component, method = 'hide') => {
886 const clickEvent = `click.dismiss${component.EVENT_KEY}`;
887 const name = component.NAME;
888 EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
889 if (['A', 'AREA'].includes(this.tagName)) {
890 event.preventDefault();
891 }
892
893 if (isDisabled(this)) {
894 return;
895 }
896
897 const target = getElementFromSelector(this) || this.closest(`.${name}`);
898 const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
899
900 instance[method]();
901 });
902 };
903
904 /**
905 * --------------------------------------------------------------------------
906 * Bootstrap (v5.2.3): alert.js
907 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
908 * --------------------------------------------------------------------------
909 */
910 /**
911 * Constants
912 */
913
914 const NAME$f = 'alert';
915 const DATA_KEY$a = 'bs.alert';
916 const EVENT_KEY$b = `.${DATA_KEY$a}`;
917 const EVENT_CLOSE = `close${EVENT_KEY$b}`;
918 const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
919 const CLASS_NAME_FADE$5 = 'fade';
920 const CLASS_NAME_SHOW$8 = 'show';
921 /**
922 * Class definition
923 */
924
925 class Alert extends BaseComponent {
926 // Getters
927 static get NAME() {
928 return NAME$f;
929 } // Public
930
931
932 close() {
933 const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
934
935 if (closeEvent.defaultPrevented) {
936 return;
937 }
938
939 this._element.classList.remove(CLASS_NAME_SHOW$8);
940
941 const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
942
943 this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
944 } // Private
945
946
947 _destroyElement() {
948 this._element.remove();
949
950 EventHandler.trigger(this._element, EVENT_CLOSED);
951 this.dispose();
952 } // Static
953
954
955 static jQueryInterface(config) {
956 return this.each(function () {
957 const data = Alert.getOrCreateInstance(this);
958
959 if (typeof config !== 'string') {
960 return;
961 }
962
963 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
964 throw new TypeError(`No method named "${config}"`);
965 }
966
967 data[config](this);
968 });
969 }
970
971 }
972 /**
973 * Data API implementation
974 */
975
976
977 enableDismissTrigger(Alert, 'close');
978 /**
979 * jQuery
980 */
981
982 defineJQueryPlugin(Alert);
983
984 /**
985 * --------------------------------------------------------------------------
986 * Bootstrap (v5.2.3): button.js
987 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
988 * --------------------------------------------------------------------------
989 */
990 /**
991 * Constants
992 */
993
994 const NAME$e = 'button';
995 const DATA_KEY$9 = 'bs.button';
996 const EVENT_KEY$a = `.${DATA_KEY$9}`;
997 const DATA_API_KEY$6 = '.data-api';
998 const CLASS_NAME_ACTIVE$3 = 'active';
999 const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
1000 const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
1001 /**
1002 * Class definition
1003 */
1004
1005 class Button extends BaseComponent {
1006 // Getters
1007 static get NAME() {
1008 return NAME$e;
1009 } // Public
1010
1011
1012 toggle() {
1013 // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
1014 this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
1015 } // Static
1016
1017
1018 static jQueryInterface(config) {
1019 return this.each(function () {
1020 const data = Button.getOrCreateInstance(this);
1021
1022 if (config === 'toggle') {
1023 data[config]();
1024 }
1025 });
1026 }
1027
1028 }
1029 /**
1030 * Data API implementation
1031 */
1032
1033
1034 EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
1035 event.preventDefault();
1036 const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
1037 const data = Button.getOrCreateInstance(button);
1038 data.toggle();
1039 });
1040 /**
1041 * jQuery
1042 */
1043
1044 defineJQueryPlugin(Button);
1045
1046 /**
1047 * --------------------------------------------------------------------------
1048 * Bootstrap (v5.2.3): dom/selector-engine.js
1049 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1050 * --------------------------------------------------------------------------
1051 */
1052 /**
1053 * Constants
1054 */
1055
1056 const SelectorEngine = {
1057 find(selector, element = document.documentElement) {
1058 return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
1059 },
1060
1061 findOne(selector, element = document.documentElement) {
1062 return Element.prototype.querySelector.call(element, selector);
1063 },
1064
1065 children(element, selector) {
1066 return [].concat(...element.children).filter(child => child.matches(selector));
1067 },
1068
1069 parents(element, selector) {
1070 const parents = [];
1071 let ancestor = element.parentNode.closest(selector);
1072
1073 while (ancestor) {
1074 parents.push(ancestor);
1075 ancestor = ancestor.parentNode.closest(selector);
1076 }
1077
1078 return parents;
1079 },
1080
1081 prev(element, selector) {
1082 let previous = element.previousElementSibling;
1083
1084 while (previous) {
1085 if (previous.matches(selector)) {
1086 return [previous];
1087 }
1088
1089 previous = previous.previousElementSibling;
1090 }
1091
1092 return [];
1093 },
1094
1095 // TODO: this is now unused; remove later along with prev()
1096 next(element, selector) {
1097 let next = element.nextElementSibling;
1098
1099 while (next) {
1100 if (next.matches(selector)) {
1101 return [next];
1102 }
1103
1104 next = next.nextElementSibling;
1105 }
1106
1107 return [];
1108 },
1109
1110 focusableChildren(element) {
1111 const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
1112 return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
1113 }
1114
1115 };
1116
1117 /**
1118 * --------------------------------------------------------------------------
1119 * Bootstrap (v5.2.3): util/swipe.js
1120 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1121 * --------------------------------------------------------------------------
1122 */
1123 /**
1124 * Constants
1125 */
1126
1127 const NAME$d = 'swipe';
1128 const EVENT_KEY$9 = '.bs.swipe';
1129 const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
1130 const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
1131 const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
1132 const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
1133 const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
1134 const POINTER_TYPE_TOUCH = 'touch';
1135 const POINTER_TYPE_PEN = 'pen';
1136 const CLASS_NAME_POINTER_EVENT = 'pointer-event';
1137 const SWIPE_THRESHOLD = 40;
1138 const Default$c = {
1139 endCallback: null,
1140 leftCallback: null,
1141 rightCallback: null
1142 };
1143 const DefaultType$c = {
1144 endCallback: '(function|null)',
1145 leftCallback: '(function|null)',
1146 rightCallback: '(function|null)'
1147 };
1148 /**
1149 * Class definition
1150 */
1151
1152 class Swipe extends Config {
1153 constructor(element, config) {
1154 super();
1155 this._element = element;
1156
1157 if (!element || !Swipe.isSupported()) {
1158 return;
1159 }
1160
1161 this._config = this._getConfig(config);
1162 this._deltaX = 0;
1163 this._supportPointerEvents = Boolean(window.PointerEvent);
1164
1165 this._initEvents();
1166 } // Getters
1167
1168
1169 static get Default() {
1170 return Default$c;
1171 }
1172
1173 static get DefaultType() {
1174 return DefaultType$c;
1175 }
1176
1177 static get NAME() {
1178 return NAME$d;
1179 } // Public
1180
1181
1182 dispose() {
1183 EventHandler.off(this._element, EVENT_KEY$9);
1184 } // Private
1185
1186
1187 _start(event) {
1188 if (!this._supportPointerEvents) {
1189 this._deltaX = event.touches[0].clientX;
1190 return;
1191 }
1192
1193 if (this._eventIsPointerPenTouch(event)) {
1194 this._deltaX = event.clientX;
1195 }
1196 }
1197
1198 _end(event) {
1199 if (this._eventIsPointerPenTouch(event)) {
1200 this._deltaX = event.clientX - this._deltaX;
1201 }
1202
1203 this._handleSwipe();
1204
1205 execute(this._config.endCallback);
1206 }
1207
1208 _move(event) {
1209 this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
1210 }
1211
1212 _handleSwipe() {
1213 const absDeltaX = Math.abs(this._deltaX);
1214
1215 if (absDeltaX <= SWIPE_THRESHOLD) {
1216 return;
1217 }
1218
1219 const direction = absDeltaX / this._deltaX;
1220 this._deltaX = 0;
1221
1222 if (!direction) {
1223 return;
1224 }
1225
1226 execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
1227 }
1228
1229 _initEvents() {
1230 if (this._supportPointerEvents) {
1231 EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));
1232 EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));
1233
1234 this._element.classList.add(CLASS_NAME_POINTER_EVENT);
1235 } else {
1236 EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));
1237 EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));
1238 EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));
1239 }
1240 }
1241
1242 _eventIsPointerPenTouch(event) {
1243 return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
1244 } // Static
1245
1246
1247 static isSupported() {
1248 return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
1249 }
1250
1251 }
1252
1253 /**
1254 * --------------------------------------------------------------------------
1255 * Bootstrap (v5.2.3): carousel.js
1256 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1257 * --------------------------------------------------------------------------
1258 */
1259 /**
1260 * Constants
1261 */
1262
1263 const NAME$c = 'carousel';
1264 const DATA_KEY$8 = 'bs.carousel';
1265 const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1266 const DATA_API_KEY$5 = '.data-api';
1267 const ARROW_LEFT_KEY$1 = 'ArrowLeft';
1268 const ARROW_RIGHT_KEY$1 = 'ArrowRight';
1269 const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1270
1271 const ORDER_NEXT = 'next';
1272 const ORDER_PREV = 'prev';
1273 const DIRECTION_LEFT = 'left';
1274 const DIRECTION_RIGHT = 'right';
1275 const EVENT_SLIDE = `slide${EVENT_KEY$8}`;
1276 const EVENT_SLID = `slid${EVENT_KEY$8}`;
1277 const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
1278 const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
1279 const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
1280 const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
1281 const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
1282 const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
1283 const CLASS_NAME_CAROUSEL = 'carousel';
1284 const CLASS_NAME_ACTIVE$2 = 'active';
1285 const CLASS_NAME_SLIDE = 'slide';
1286 const CLASS_NAME_END = 'carousel-item-end';
1287 const CLASS_NAME_START = 'carousel-item-start';
1288 const CLASS_NAME_NEXT = 'carousel-item-next';
1289 const CLASS_NAME_PREV = 'carousel-item-prev';
1290 const SELECTOR_ACTIVE = '.active';
1291 const SELECTOR_ITEM = '.carousel-item';
1292 const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
1293 const SELECTOR_ITEM_IMG = '.carousel-item img';
1294 const SELECTOR_INDICATORS = '.carousel-indicators';
1295 const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
1296 const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
1297 const KEY_TO_DIRECTION = {
1298 [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
1299 [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
1300 };
1301 const Default$b = {
1302 interval: 5000,
1303 keyboard: true,
1304 pause: 'hover',
1305 ride: false,
1306 touch: true,
1307 wrap: true
1308 };
1309 const DefaultType$b = {
1310 interval: '(number|boolean)',
1311 // TODO:v6 remove boolean support
1312 keyboard: 'boolean',
1313 pause: '(string|boolean)',
1314 ride: '(boolean|string)',
1315 touch: 'boolean',
1316 wrap: 'boolean'
1317 };
1318 /**
1319 * Class definition
1320 */
1321
1322 class Carousel extends BaseComponent {
1323 constructor(element, config) {
1324 super(element, config);
1325 this._interval = null;
1326 this._activeElement = null;
1327 this._isSliding = false;
1328 this.touchTimeout = null;
1329 this._swipeHelper = null;
1330 this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
1331
1332 this._addEventListeners();
1333
1334 if (this._config.ride === CLASS_NAME_CAROUSEL) {
1335 this.cycle();
1336 }
1337 } // Getters
1338
1339
1340 static get Default() {
1341 return Default$b;
1342 }
1343
1344 static get DefaultType() {
1345 return DefaultType$b;
1346 }
1347
1348 static get NAME() {
1349 return NAME$c;
1350 } // Public
1351
1352
1353 next() {
1354 this._slide(ORDER_NEXT);
1355 }
1356
1357 nextWhenVisible() {
1358 // FIXME TODO use `document.visibilityState`
1359 // Don't call next when the page isn't visible
1360 // or the carousel or its parent isn't visible
1361 if (!document.hidden && isVisible(this._element)) {
1362 this.next();
1363 }
1364 }
1365
1366 prev() {
1367 this._slide(ORDER_PREV);
1368 }
1369
1370 pause() {
1371 if (this._isSliding) {
1372 triggerTransitionEnd(this._element);
1373 }
1374
1375 this._clearInterval();
1376 }
1377
1378 cycle() {
1379 this._clearInterval();
1380
1381 this._updateInterval();
1382
1383 this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
1384 }
1385
1386 _maybeEnableCycle() {
1387 if (!this._config.ride) {
1388 return;
1389 }
1390
1391 if (this._isSliding) {
1392 EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
1393 return;
1394 }
1395
1396 this.cycle();
1397 }
1398
1399 to(index) {
1400 const items = this._getItems();
1401
1402 if (index > items.length - 1 || index < 0) {
1403 return;
1404 }
1405
1406 if (this._isSliding) {
1407 EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
1408 return;
1409 }
1410
1411 const activeIndex = this._getItemIndex(this._getActive());
1412
1413 if (activeIndex === index) {
1414 return;
1415 }
1416
1417 const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
1418
1419 this._slide(order, items[index]);
1420 }
1421
1422 dispose() {
1423 if (this._swipeHelper) {
1424 this._swipeHelper.dispose();
1425 }
1426
1427 super.dispose();
1428 } // Private
1429
1430
1431 _configAfterMerge(config) {
1432 config.defaultInterval = config.interval;
1433 return config;
1434 }
1435
1436 _addEventListeners() {
1437 if (this._config.keyboard) {
1438 EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));
1439 }
1440
1441 if (this._config.pause === 'hover') {
1442 EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
1443 EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
1444 }
1445
1446 if (this._config.touch && Swipe.isSupported()) {
1447 this._addTouchEventListeners();
1448 }
1449 }
1450
1451 _addTouchEventListeners() {
1452 for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
1453 EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());
1454 }
1455
1456 const endCallBack = () => {
1457 if (this._config.pause !== 'hover') {
1458 return;
1459 } // If it's a touch-enabled device, mouseenter/leave are fired as
1460 // part of the mouse compatibility events on first tap - the carousel
1461 // would stop cycling until user tapped out of it;
1462 // here, we listen for touchend, explicitly pause the carousel
1463 // (as if it's the second time we tap on it, mouseenter compat event
1464 // is NOT fired) and after a timeout (to allow for mouse compatibility
1465 // events to fire) we explicitly restart cycling
1466
1467
1468 this.pause();
1469
1470 if (this.touchTimeout) {
1471 clearTimeout(this.touchTimeout);
1472 }
1473
1474 this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
1475 };
1476
1477 const swipeConfig = {
1478 leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
1479 rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
1480 endCallback: endCallBack
1481 };
1482 this._swipeHelper = new Swipe(this._element, swipeConfig);
1483 }
1484
1485 _keydown(event) {
1486 if (/input|textarea/i.test(event.target.tagName)) {
1487 return;
1488 }
1489
1490 const direction = KEY_TO_DIRECTION[event.key];
1491
1492 if (direction) {
1493 event.preventDefault();
1494
1495 this._slide(this._directionToOrder(direction));
1496 }
1497 }
1498
1499 _getItemIndex(element) {
1500 return this._getItems().indexOf(element);
1501 }
1502
1503 _setActiveIndicatorElement(index) {
1504 if (!this._indicatorsElement) {
1505 return;
1506 }
1507
1508 const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
1509 activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
1510 activeIndicator.removeAttribute('aria-current');
1511 const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
1512
1513 if (newActiveIndicator) {
1514 newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
1515 newActiveIndicator.setAttribute('aria-current', 'true');
1516 }
1517 }
1518
1519 _updateInterval() {
1520 const element = this._activeElement || this._getActive();
1521
1522 if (!element) {
1523 return;
1524 }
1525
1526 const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
1527 this._config.interval = elementInterval || this._config.defaultInterval;
1528 }
1529
1530 _slide(order, element = null) {
1531 if (this._isSliding) {
1532 return;
1533 }
1534
1535 const activeElement = this._getActive();
1536
1537 const isNext = order === ORDER_NEXT;
1538 const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
1539
1540 if (nextElement === activeElement) {
1541 return;
1542 }
1543
1544 const nextElementIndex = this._getItemIndex(nextElement);
1545
1546 const triggerEvent = eventName => {
1547 return EventHandler.trigger(this._element, eventName, {
1548 relatedTarget: nextElement,
1549 direction: this._orderToDirection(order),
1550 from: this._getItemIndex(activeElement),
1551 to: nextElementIndex
1552 });
1553 };
1554
1555 const slideEvent = triggerEvent(EVENT_SLIDE);
1556
1557 if (slideEvent.defaultPrevented) {
1558 return;
1559 }
1560
1561 if (!activeElement || !nextElement) {
1562 // Some weirdness is happening, so we bail
1563 // todo: change tests that use empty divs to avoid this check
1564 return;
1565 }
1566
1567 const isCycling = Boolean(this._interval);
1568 this.pause();
1569 this._isSliding = true;
1570
1571 this._setActiveIndicatorElement(nextElementIndex);
1572
1573 this._activeElement = nextElement;
1574 const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
1575 const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
1576 nextElement.classList.add(orderClassName);
1577 reflow(nextElement);
1578 activeElement.classList.add(directionalClassName);
1579 nextElement.classList.add(directionalClassName);
1580
1581 const completeCallBack = () => {
1582 nextElement.classList.remove(directionalClassName, orderClassName);
1583 nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1584 activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
1585 this._isSliding = false;
1586 triggerEvent(EVENT_SLID);
1587 };
1588
1589 this._queueCallback(completeCallBack, activeElement, this._isAnimated());
1590
1591 if (isCycling) {
1592 this.cycle();
1593 }
1594 }
1595
1596 _isAnimated() {
1597 return this._element.classList.contains(CLASS_NAME_SLIDE);
1598 }
1599
1600 _getActive() {
1601 return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1602 }
1603
1604 _getItems() {
1605 return SelectorEngine.find(SELECTOR_ITEM, this._element);
1606 }
1607
1608 _clearInterval() {
1609 if (this._interval) {
1610 clearInterval(this._interval);
1611 this._interval = null;
1612 }
1613 }
1614
1615 _directionToOrder(direction) {
1616 if (isRTL()) {
1617 return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
1618 }
1619
1620 return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
1621 }
1622
1623 _orderToDirection(order) {
1624 if (isRTL()) {
1625 return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
1626 }
1627
1628 return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
1629 } // Static
1630
1631
1632 static jQueryInterface(config) {
1633 return this.each(function () {
1634 const data = Carousel.getOrCreateInstance(this, config);
1635
1636 if (typeof config === 'number') {
1637 data.to(config);
1638 return;
1639 }
1640
1641 if (typeof config === 'string') {
1642 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
1643 throw new TypeError(`No method named "${config}"`);
1644 }
1645
1646 data[config]();
1647 }
1648 });
1649 }
1650
1651 }
1652 /**
1653 * Data API implementation
1654 */
1655
1656
1657 EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {
1658 const target = getElementFromSelector(this);
1659
1660 if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
1661 return;
1662 }
1663
1664 event.preventDefault();
1665 const carousel = Carousel.getOrCreateInstance(target);
1666 const slideIndex = this.getAttribute('data-bs-slide-to');
1667
1668 if (slideIndex) {
1669 carousel.to(slideIndex);
1670
1671 carousel._maybeEnableCycle();
1672
1673 return;
1674 }
1675
1676 if (Manipulator.getDataAttribute(this, 'slide') === 'next') {
1677 carousel.next();
1678
1679 carousel._maybeEnableCycle();
1680
1681 return;
1682 }
1683
1684 carousel.prev();
1685
1686 carousel._maybeEnableCycle();
1687 });
1688 EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
1689 const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
1690
1691 for (const carousel of carousels) {
1692 Carousel.getOrCreateInstance(carousel);
1693 }
1694 });
1695 /**
1696 * jQuery
1697 */
1698
1699 defineJQueryPlugin(Carousel);
1700
1701 /**
1702 * --------------------------------------------------------------------------
1703 * Bootstrap (v5.2.3): collapse.js
1704 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1705 * --------------------------------------------------------------------------
1706 */
1707 /**
1708 * Constants
1709 */
1710
1711 const NAME$b = 'collapse';
1712 const DATA_KEY$7 = 'bs.collapse';
1713 const EVENT_KEY$7 = `.${DATA_KEY$7}`;
1714 const DATA_API_KEY$4 = '.data-api';
1715 const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
1716 const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
1717 const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
1718 const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
1719 const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
1720 const CLASS_NAME_SHOW$7 = 'show';
1721 const CLASS_NAME_COLLAPSE = 'collapse';
1722 const CLASS_NAME_COLLAPSING = 'collapsing';
1723 const CLASS_NAME_COLLAPSED = 'collapsed';
1724 const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
1725 const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1726 const WIDTH = 'width';
1727 const HEIGHT = 'height';
1728 const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
1729 const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
1730 const Default$a = {
1731 parent: null,
1732 toggle: true
1733 };
1734 const DefaultType$a = {
1735 parent: '(null|element)',
1736 toggle: 'boolean'
1737 };
1738 /**
1739 * Class definition
1740 */
1741
1742 class Collapse extends BaseComponent {
1743 constructor(element, config) {
1744 super(element, config);
1745 this._isTransitioning = false;
1746 this._triggerArray = [];
1747 const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1748
1749 for (const elem of toggleList) {
1750 const selector = getSelectorFromElement(elem);
1751 const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
1752
1753 if (selector !== null && filterElement.length) {
1754 this._triggerArray.push(elem);
1755 }
1756 }
1757
1758 this._initializeChildren();
1759
1760 if (!this._config.parent) {
1761 this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1762 }
1763
1764 if (this._config.toggle) {
1765 this.toggle();
1766 }
1767 } // Getters
1768
1769
1770 static get Default() {
1771 return Default$a;
1772 }
1773
1774 static get DefaultType() {
1775 return DefaultType$a;
1776 }
1777
1778 static get NAME() {
1779 return NAME$b;
1780 } // Public
1781
1782
1783 toggle() {
1784 if (this._isShown()) {
1785 this.hide();
1786 } else {
1787 this.show();
1788 }
1789 }
1790
1791 show() {
1792 if (this._isTransitioning || this._isShown()) {
1793 return;
1794 }
1795
1796 let activeChildren = []; // find active children
1797
1798 if (this._config.parent) {
1799 activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
1800 toggle: false
1801 }));
1802 }
1803
1804 if (activeChildren.length && activeChildren[0]._isTransitioning) {
1805 return;
1806 }
1807
1808 const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
1809
1810 if (startEvent.defaultPrevented) {
1811 return;
1812 }
1813
1814 for (const activeInstance of activeChildren) {
1815 activeInstance.hide();
1816 }
1817
1818 const dimension = this._getDimension();
1819
1820 this._element.classList.remove(CLASS_NAME_COLLAPSE);
1821
1822 this._element.classList.add(CLASS_NAME_COLLAPSING);
1823
1824 this._element.style[dimension] = 0;
1825
1826 this._addAriaAndCollapsedClass(this._triggerArray, true);
1827
1828 this._isTransitioning = true;
1829
1830 const complete = () => {
1831 this._isTransitioning = false;
1832
1833 this._element.classList.remove(CLASS_NAME_COLLAPSING);
1834
1835 this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1836
1837 this._element.style[dimension] = '';
1838 EventHandler.trigger(this._element, EVENT_SHOWN$6);
1839 };
1840
1841 const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1842 const scrollSize = `scroll${capitalizedDimension}`;
1843
1844 this._queueCallback(complete, this._element, true);
1845
1846 this._element.style[dimension] = `${this._element[scrollSize]}px`;
1847 }
1848
1849 hide() {
1850 if (this._isTransitioning || !this._isShown()) {
1851 return;
1852 }
1853
1854 const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
1855
1856 if (startEvent.defaultPrevented) {
1857 return;
1858 }
1859
1860 const dimension = this._getDimension();
1861
1862 this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
1863 reflow(this._element);
1864
1865 this._element.classList.add(CLASS_NAME_COLLAPSING);
1866
1867 this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1868
1869 for (const trigger of this._triggerArray) {
1870 const element = getElementFromSelector(trigger);
1871
1872 if (element && !this._isShown(element)) {
1873 this._addAriaAndCollapsedClass([trigger], false);
1874 }
1875 }
1876
1877 this._isTransitioning = true;
1878
1879 const complete = () => {
1880 this._isTransitioning = false;
1881
1882 this._element.classList.remove(CLASS_NAME_COLLAPSING);
1883
1884 this._element.classList.add(CLASS_NAME_COLLAPSE);
1885
1886 EventHandler.trigger(this._element, EVENT_HIDDEN$6);
1887 };
1888
1889 this._element.style[dimension] = '';
1890
1891 this._queueCallback(complete, this._element, true);
1892 }
1893
1894 _isShown(element = this._element) {
1895 return element.classList.contains(CLASS_NAME_SHOW$7);
1896 } // Private
1897
1898
1899 _configAfterMerge(config) {
1900 config.toggle = Boolean(config.toggle); // Coerce string values
1901
1902 config.parent = getElement(config.parent);
1903 return config;
1904 }
1905
1906 _getDimension() {
1907 return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1908 }
1909
1910 _initializeChildren() {
1911 if (!this._config.parent) {
1912 return;
1913 }
1914
1915 const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
1916
1917 for (const element of children) {
1918 const selected = getElementFromSelector(element);
1919
1920 if (selected) {
1921 this._addAriaAndCollapsedClass([element], this._isShown(selected));
1922 }
1923 }
1924 }
1925
1926 _getFirstLevelChildren(selector) {
1927 const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth
1928
1929 return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
1930 }
1931
1932 _addAriaAndCollapsedClass(triggerArray, isOpen) {
1933 if (!triggerArray.length) {
1934 return;
1935 }
1936
1937 for (const element of triggerArray) {
1938 element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
1939 element.setAttribute('aria-expanded', isOpen);
1940 }
1941 } // Static
1942
1943
1944 static jQueryInterface(config) {
1945 const _config = {};
1946
1947 if (typeof config === 'string' && /show|hide/.test(config)) {
1948 _config.toggle = false;
1949 }
1950
1951 return this.each(function () {
1952 const data = Collapse.getOrCreateInstance(this, _config);
1953
1954 if (typeof config === 'string') {
1955 if (typeof data[config] === 'undefined') {
1956 throw new TypeError(`No method named "${config}"`);
1957 }
1958
1959 data[config]();
1960 }
1961 });
1962 }
1963
1964 }
1965 /**
1966 * Data API implementation
1967 */
1968
1969
1970 EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
1971 // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
1972 if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
1973 event.preventDefault();
1974 }
1975
1976 const selector = getSelectorFromElement(this);
1977 const selectorElements = SelectorEngine.find(selector);
1978
1979 for (const element of selectorElements) {
1980 Collapse.getOrCreateInstance(element, {
1981 toggle: false
1982 }).toggle();
1983 }
1984 });
1985 /**
1986 * jQuery
1987 */
1988
1989 defineJQueryPlugin(Collapse);
1990
1991 /**
1992 * --------------------------------------------------------------------------
1993 * Bootstrap (v5.2.3): dropdown.js
1994 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1995 * --------------------------------------------------------------------------
1996 */
1997 /**
1998 * Constants
1999 */
2000
2001 const NAME$a = 'dropdown';
2002 const DATA_KEY$6 = 'bs.dropdown';
2003 const EVENT_KEY$6 = `.${DATA_KEY$6}`;
2004 const DATA_API_KEY$3 = '.data-api';
2005 const ESCAPE_KEY$2 = 'Escape';
2006 const TAB_KEY$1 = 'Tab';
2007 const ARROW_UP_KEY$1 = 'ArrowUp';
2008 const ARROW_DOWN_KEY$1 = 'ArrowDown';
2009 const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
2010
2011 const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
2012 const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
2013 const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
2014 const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
2015 const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
2016 const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
2017 const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
2018 const CLASS_NAME_SHOW$6 = 'show';
2019 const CLASS_NAME_DROPUP = 'dropup';
2020 const CLASS_NAME_DROPEND = 'dropend';
2021 const CLASS_NAME_DROPSTART = 'dropstart';
2022 const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
2023 const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
2024 const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
2025 const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
2026 const SELECTOR_MENU = '.dropdown-menu';
2027 const SELECTOR_NAVBAR = '.navbar';
2028 const SELECTOR_NAVBAR_NAV = '.navbar-nav';
2029 const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
2030 const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
2031 const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
2032 const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
2033 const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
2034 const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
2035 const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
2036 const PLACEMENT_TOPCENTER = 'top';
2037 const PLACEMENT_BOTTOMCENTER = 'bottom';
2038 const Default$9 = {
2039 autoClose: true,
2040 boundary: 'clippingParents',
2041 display: 'dynamic',
2042 offset: [0, 2],
2043 popperConfig: null,
2044 reference: 'toggle'
2045 };
2046 const DefaultType$9 = {
2047 autoClose: '(boolean|string)',
2048 boundary: '(string|element)',
2049 display: 'string',
2050 offset: '(array|string|function)',
2051 popperConfig: '(null|object|function)',
2052 reference: '(string|element|object)'
2053 };
2054 /**
2055 * Class definition
2056 */
2057
2058 class Dropdown extends BaseComponent {
2059 constructor(element, config) {
2060 super(element, config);
2061 this._popper = null;
2062 this._parent = this._element.parentNode; // dropdown wrapper
2063 // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
2064
2065 this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
2066 this._inNavbar = this._detectNavbar();
2067 } // Getters
2068
2069
2070 static get Default() {
2071 return Default$9;
2072 }
2073
2074 static get DefaultType() {
2075 return DefaultType$9;
2076 }
2077
2078 static get NAME() {
2079 return NAME$a;
2080 } // Public
2081
2082
2083 toggle() {
2084 return this._isShown() ? this.hide() : this.show();
2085 }
2086
2087 show() {
2088 if (isDisabled(this._element) || this._isShown()) {
2089 return;
2090 }
2091
2092 const relatedTarget = {
2093 relatedTarget: this._element
2094 };
2095 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
2096
2097 if (showEvent.defaultPrevented) {
2098 return;
2099 }
2100
2101 this._createPopper(); // If this is a touch-enabled device we add extra
2102 // empty mouseover listeners to the body's immediate children;
2103 // only needed because of broken event delegation on iOS
2104 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2105
2106
2107 if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
2108 for (const element of [].concat(...document.body.children)) {
2109 EventHandler.on(element, 'mouseover', noop);
2110 }
2111 }
2112
2113 this._element.focus();
2114
2115 this._element.setAttribute('aria-expanded', true);
2116
2117 this._menu.classList.add(CLASS_NAME_SHOW$6);
2118
2119 this._element.classList.add(CLASS_NAME_SHOW$6);
2120
2121 EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
2122 }
2123
2124 hide() {
2125 if (isDisabled(this._element) || !this._isShown()) {
2126 return;
2127 }
2128
2129 const relatedTarget = {
2130 relatedTarget: this._element
2131 };
2132
2133 this._completeHide(relatedTarget);
2134 }
2135
2136 dispose() {
2137 if (this._popper) {
2138 this._popper.destroy();
2139 }
2140
2141 super.dispose();
2142 }
2143
2144 update() {
2145 this._inNavbar = this._detectNavbar();
2146
2147 if (this._popper) {
2148 this._popper.update();
2149 }
2150 } // Private
2151
2152
2153 _completeHide(relatedTarget) {
2154 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
2155
2156 if (hideEvent.defaultPrevented) {
2157 return;
2158 } // If this is a touch-enabled device we remove the extra
2159 // empty mouseover listeners we added for iOS support
2160
2161
2162 if ('ontouchstart' in document.documentElement) {
2163 for (const element of [].concat(...document.body.children)) {
2164 EventHandler.off(element, 'mouseover', noop);
2165 }
2166 }
2167
2168 if (this._popper) {
2169 this._popper.destroy();
2170 }
2171
2172 this._menu.classList.remove(CLASS_NAME_SHOW$6);
2173
2174 this._element.classList.remove(CLASS_NAME_SHOW$6);
2175
2176 this._element.setAttribute('aria-expanded', 'false');
2177
2178 Manipulator.removeDataAttribute(this._menu, 'popper');
2179 EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
2180 }
2181
2182 _getConfig(config) {
2183 config = super._getConfig(config);
2184
2185 if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
2186 // Popper virtual elements require a getBoundingClientRect method
2187 throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2188 }
2189
2190 return config;
2191 }
2192
2193 _createPopper() {
2194 if (typeof Popper__namespace === 'undefined') {
2195 throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
2196 }
2197
2198 let referenceElement = this._element;
2199
2200 if (this._config.reference === 'parent') {
2201 referenceElement = this._parent;
2202 } else if (isElement(this._config.reference)) {
2203 referenceElement = getElement(this._config.reference);
2204 } else if (typeof this._config.reference === 'object') {
2205 referenceElement = this._config.reference;
2206 }
2207
2208 const popperConfig = this._getPopperConfig();
2209
2210 this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
2211 }
2212
2213 _isShown() {
2214 return this._menu.classList.contains(CLASS_NAME_SHOW$6);
2215 }
2216
2217 _getPlacement() {
2218 const parentDropdown = this._parent;
2219
2220 if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
2221 return PLACEMENT_RIGHT;
2222 }
2223
2224 if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
2225 return PLACEMENT_LEFT;
2226 }
2227
2228 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
2229 return PLACEMENT_TOPCENTER;
2230 }
2231
2232 if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
2233 return PLACEMENT_BOTTOMCENTER;
2234 } // We need to trim the value because custom properties can also include spaces
2235
2236
2237 const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
2238
2239 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
2240 return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
2241 }
2242
2243 return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
2244 }
2245
2246 _detectNavbar() {
2247 return this._element.closest(SELECTOR_NAVBAR) !== null;
2248 }
2249
2250 _getOffset() {
2251 const {
2252 offset
2253 } = this._config;
2254
2255 if (typeof offset === 'string') {
2256 return offset.split(',').map(value => Number.parseInt(value, 10));
2257 }
2258
2259 if (typeof offset === 'function') {
2260 return popperData => offset(popperData, this._element);
2261 }
2262
2263 return offset;
2264 }
2265
2266 _getPopperConfig() {
2267 const defaultBsPopperConfig = {
2268 placement: this._getPlacement(),
2269 modifiers: [{
2270 name: 'preventOverflow',
2271 options: {
2272 boundary: this._config.boundary
2273 }
2274 }, {
2275 name: 'offset',
2276 options: {
2277 offset: this._getOffset()
2278 }
2279 }]
2280 }; // Disable Popper if we have a static display or Dropdown is in Navbar
2281
2282 if (this._inNavbar || this._config.display === 'static') {
2283 Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove
2284
2285 defaultBsPopperConfig.modifiers = [{
2286 name: 'applyStyles',
2287 enabled: false
2288 }];
2289 }
2290
2291 return { ...defaultBsPopperConfig,
2292 ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
2293 };
2294 }
2295
2296 _selectMenuItem({
2297 key,
2298 target
2299 }) {
2300 const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));
2301
2302 if (!items.length) {
2303 return;
2304 } // if target isn't included in items (e.g. when expanding the dropdown)
2305 // allow cycling to get the last item in case key equals ARROW_UP_KEY
2306
2307
2308 getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
2309 } // Static
2310
2311
2312 static jQueryInterface(config) {
2313 return this.each(function () {
2314 const data = Dropdown.getOrCreateInstance(this, config);
2315
2316 if (typeof config !== 'string') {
2317 return;
2318 }
2319
2320 if (typeof data[config] === 'undefined') {
2321 throw new TypeError(`No method named "${config}"`);
2322 }
2323
2324 data[config]();
2325 });
2326 }
2327
2328 static clearMenus(event) {
2329 if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {
2330 return;
2331 }
2332
2333 const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
2334
2335 for (const toggle of openToggles) {
2336 const context = Dropdown.getInstance(toggle);
2337
2338 if (!context || context._config.autoClose === false) {
2339 continue;
2340 }
2341
2342 const composedPath = event.composedPath();
2343 const isMenuTarget = composedPath.includes(context._menu);
2344
2345 if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
2346 continue;
2347 } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
2348
2349
2350 if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
2351 continue;
2352 }
2353
2354 const relatedTarget = {
2355 relatedTarget: context._element
2356 };
2357
2358 if (event.type === 'click') {
2359 relatedTarget.clickEvent = event;
2360 }
2361
2362 context._completeHide(relatedTarget);
2363 }
2364 }
2365
2366 static dataApiKeydownHandler(event) {
2367 // If not an UP | DOWN | ESCAPE key => not a dropdown command
2368 // If input/textarea && if key is other than ESCAPE => not a dropdown command
2369 const isInput = /input|textarea/i.test(event.target.tagName);
2370 const isEscapeEvent = event.key === ESCAPE_KEY$2;
2371 const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
2372
2373 if (!isUpOrDownEvent && !isEscapeEvent) {
2374 return;
2375 }
2376
2377 if (isInput && !isEscapeEvent) {
2378 return;
2379 }
2380
2381 event.preventDefault(); // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
2382
2383 const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
2384 const instance = Dropdown.getOrCreateInstance(getToggleButton);
2385
2386 if (isUpOrDownEvent) {
2387 event.stopPropagation();
2388 instance.show();
2389
2390 instance._selectMenuItem(event);
2391
2392 return;
2393 }
2394
2395 if (instance._isShown()) {
2396 // else is escape and we check if it is shown
2397 event.stopPropagation();
2398 instance.hide();
2399 getToggleButton.focus();
2400 }
2401 }
2402
2403 }
2404 /**
2405 * Data API implementation
2406 */
2407
2408
2409 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
2410 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
2411 EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
2412 EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
2413 EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
2414 event.preventDefault();
2415 Dropdown.getOrCreateInstance(this).toggle();
2416 });
2417 /**
2418 * jQuery
2419 */
2420
2421 defineJQueryPlugin(Dropdown);
2422
2423 /**
2424 * --------------------------------------------------------------------------
2425 * Bootstrap (v5.2.3): util/scrollBar.js
2426 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2427 * --------------------------------------------------------------------------
2428 */
2429 /**
2430 * Constants
2431 */
2432
2433 const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2434 const SELECTOR_STICKY_CONTENT = '.sticky-top';
2435 const PROPERTY_PADDING = 'padding-right';
2436 const PROPERTY_MARGIN = 'margin-right';
2437 /**
2438 * Class definition
2439 */
2440
2441 class ScrollBarHelper {
2442 constructor() {
2443 this._element = document.body;
2444 } // Public
2445
2446
2447 getWidth() {
2448 // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
2449 const documentWidth = document.documentElement.clientWidth;
2450 return Math.abs(window.innerWidth - documentWidth);
2451 }
2452
2453 hide() {
2454 const width = this.getWidth();
2455
2456 this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
2457
2458
2459 this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
2460
2461
2462 this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
2463
2464 this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
2465 }
2466
2467 reset() {
2468 this._resetElementAttributes(this._element, 'overflow');
2469
2470 this._resetElementAttributes(this._element, PROPERTY_PADDING);
2471
2472 this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
2473
2474 this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
2475 }
2476
2477 isOverflowing() {
2478 return this.getWidth() > 0;
2479 } // Private
2480
2481
2482 _disableOverFlow() {
2483 this._saveInitialAttribute(this._element, 'overflow');
2484
2485 this._element.style.overflow = 'hidden';
2486 }
2487
2488 _setElementAttributes(selector, styleProperty, callback) {
2489 const scrollbarWidth = this.getWidth();
2490
2491 const manipulationCallBack = element => {
2492 if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
2493 return;
2494 }
2495
2496 this._saveInitialAttribute(element, styleProperty);
2497
2498 const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
2499 element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
2500 };
2501
2502 this._applyManipulationCallback(selector, manipulationCallBack);
2503 }
2504
2505 _saveInitialAttribute(element, styleProperty) {
2506 const actualValue = element.style.getPropertyValue(styleProperty);
2507
2508 if (actualValue) {
2509 Manipulator.setDataAttribute(element, styleProperty, actualValue);
2510 }
2511 }
2512
2513 _resetElementAttributes(selector, styleProperty) {
2514 const manipulationCallBack = element => {
2515 const value = Manipulator.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero
2516
2517 if (value === null) {
2518 element.style.removeProperty(styleProperty);
2519 return;
2520 }
2521
2522 Manipulator.removeDataAttribute(element, styleProperty);
2523 element.style.setProperty(styleProperty, value);
2524 };
2525
2526 this._applyManipulationCallback(selector, manipulationCallBack);
2527 }
2528
2529 _applyManipulationCallback(selector, callBack) {
2530 if (isElement(selector)) {
2531 callBack(selector);
2532 return;
2533 }
2534
2535 for (const sel of SelectorEngine.find(selector, this._element)) {
2536 callBack(sel);
2537 }
2538 }
2539
2540 }
2541
2542 /**
2543 * --------------------------------------------------------------------------
2544 * Bootstrap (v5.2.3): util/backdrop.js
2545 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2546 * --------------------------------------------------------------------------
2547 */
2548 /**
2549 * Constants
2550 */
2551
2552 const NAME$9 = 'backdrop';
2553 const CLASS_NAME_FADE$4 = 'fade';
2554 const CLASS_NAME_SHOW$5 = 'show';
2555 const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
2556 const Default$8 = {
2557 className: 'modal-backdrop',
2558 clickCallback: null,
2559 isAnimated: false,
2560 isVisible: true,
2561 // if false, we use the backdrop helper without adding any element to the dom
2562 rootElement: 'body' // give the choice to place backdrop under different elements
2563
2564 };
2565 const DefaultType$8 = {
2566 className: 'string',
2567 clickCallback: '(function|null)',
2568 isAnimated: 'boolean',
2569 isVisible: 'boolean',
2570 rootElement: '(element|string)'
2571 };
2572 /**
2573 * Class definition
2574 */
2575
2576 class Backdrop extends Config {
2577 constructor(config) {
2578 super();
2579 this._config = this._getConfig(config);
2580 this._isAppended = false;
2581 this._element = null;
2582 } // Getters
2583
2584
2585 static get Default() {
2586 return Default$8;
2587 }
2588
2589 static get DefaultType() {
2590 return DefaultType$8;
2591 }
2592
2593 static get NAME() {
2594 return NAME$9;
2595 } // Public
2596
2597
2598 show(callback) {
2599 if (!this._config.isVisible) {
2600 execute(callback);
2601 return;
2602 }
2603
2604 this._append();
2605
2606 const element = this._getElement();
2607
2608 if (this._config.isAnimated) {
2609 reflow(element);
2610 }
2611
2612 element.classList.add(CLASS_NAME_SHOW$5);
2613
2614 this._emulateAnimation(() => {
2615 execute(callback);
2616 });
2617 }
2618
2619 hide(callback) {
2620 if (!this._config.isVisible) {
2621 execute(callback);
2622 return;
2623 }
2624
2625 this._getElement().classList.remove(CLASS_NAME_SHOW$5);
2626
2627 this._emulateAnimation(() => {
2628 this.dispose();
2629 execute(callback);
2630 });
2631 }
2632
2633 dispose() {
2634 if (!this._isAppended) {
2635 return;
2636 }
2637
2638 EventHandler.off(this._element, EVENT_MOUSEDOWN);
2639
2640 this._element.remove();
2641
2642 this._isAppended = false;
2643 } // Private
2644
2645
2646 _getElement() {
2647 if (!this._element) {
2648 const backdrop = document.createElement('div');
2649 backdrop.className = this._config.className;
2650
2651 if (this._config.isAnimated) {
2652 backdrop.classList.add(CLASS_NAME_FADE$4);
2653 }
2654
2655 this._element = backdrop;
2656 }
2657
2658 return this._element;
2659 }
2660
2661 _configAfterMerge(config) {
2662 // use getElement() with the default "body" to get a fresh Element on each instantiation
2663 config.rootElement = getElement(config.rootElement);
2664 return config;
2665 }
2666
2667 _append() {
2668 if (this._isAppended) {
2669 return;
2670 }
2671
2672 const element = this._getElement();
2673
2674 this._config.rootElement.append(element);
2675
2676 EventHandler.on(element, EVENT_MOUSEDOWN, () => {
2677 execute(this._config.clickCallback);
2678 });
2679 this._isAppended = true;
2680 }
2681
2682 _emulateAnimation(callback) {
2683 executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
2684 }
2685
2686 }
2687
2688 /**
2689 * --------------------------------------------------------------------------
2690 * Bootstrap (v5.2.3): util/focustrap.js
2691 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2692 * --------------------------------------------------------------------------
2693 */
2694 /**
2695 * Constants
2696 */
2697
2698 const NAME$8 = 'focustrap';
2699 const DATA_KEY$5 = 'bs.focustrap';
2700 const EVENT_KEY$5 = `.${DATA_KEY$5}`;
2701 const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
2702 const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
2703 const TAB_KEY = 'Tab';
2704 const TAB_NAV_FORWARD = 'forward';
2705 const TAB_NAV_BACKWARD = 'backward';
2706 const Default$7 = {
2707 autofocus: true,
2708 trapElement: null // The element to trap focus inside of
2709
2710 };
2711 const DefaultType$7 = {
2712 autofocus: 'boolean',
2713 trapElement: 'element'
2714 };
2715 /**
2716 * Class definition
2717 */
2718
2719 class FocusTrap extends Config {
2720 constructor(config) {
2721 super();
2722 this._config = this._getConfig(config);
2723 this._isActive = false;
2724 this._lastTabNavDirection = null;
2725 } // Getters
2726
2727
2728 static get Default() {
2729 return Default$7;
2730 }
2731
2732 static get DefaultType() {
2733 return DefaultType$7;
2734 }
2735
2736 static get NAME() {
2737 return NAME$8;
2738 } // Public
2739
2740
2741 activate() {
2742 if (this._isActive) {
2743 return;
2744 }
2745
2746 if (this._config.autofocus) {
2747 this._config.trapElement.focus();
2748 }
2749
2750 EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop
2751
2752 EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));
2753 EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
2754 this._isActive = true;
2755 }
2756
2757 deactivate() {
2758 if (!this._isActive) {
2759 return;
2760 }
2761
2762 this._isActive = false;
2763 EventHandler.off(document, EVENT_KEY$5);
2764 } // Private
2765
2766
2767 _handleFocusin(event) {
2768 const {
2769 trapElement
2770 } = this._config;
2771
2772 if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
2773 return;
2774 }
2775
2776 const elements = SelectorEngine.focusableChildren(trapElement);
2777
2778 if (elements.length === 0) {
2779 trapElement.focus();
2780 } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
2781 elements[elements.length - 1].focus();
2782 } else {
2783 elements[0].focus();
2784 }
2785 }
2786
2787 _handleKeydown(event) {
2788 if (event.key !== TAB_KEY) {
2789 return;
2790 }
2791
2792 this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
2793 }
2794
2795 }
2796
2797 /**
2798 * --------------------------------------------------------------------------
2799 * Bootstrap (v5.2.3): modal.js
2800 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2801 * --------------------------------------------------------------------------
2802 */
2803 /**
2804 * Constants
2805 */
2806
2807 const NAME$7 = 'modal';
2808 const DATA_KEY$4 = 'bs.modal';
2809 const EVENT_KEY$4 = `.${DATA_KEY$4}`;
2810 const DATA_API_KEY$2 = '.data-api';
2811 const ESCAPE_KEY$1 = 'Escape';
2812 const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
2813 const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
2814 const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
2815 const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
2816 const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
2817 const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
2818 const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
2819 const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
2820 const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
2821 const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
2822 const CLASS_NAME_OPEN = 'modal-open';
2823 const CLASS_NAME_FADE$3 = 'fade';
2824 const CLASS_NAME_SHOW$4 = 'show';
2825 const CLASS_NAME_STATIC = 'modal-static';
2826 const OPEN_SELECTOR$1 = '.modal.show';
2827 const SELECTOR_DIALOG = '.modal-dialog';
2828 const SELECTOR_MODAL_BODY = '.modal-body';
2829 const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
2830 const Default$6 = {
2831 backdrop: true,
2832 focus: true,
2833 keyboard: true
2834 };
2835 const DefaultType$6 = {
2836 backdrop: '(boolean|string)',
2837 focus: 'boolean',
2838 keyboard: 'boolean'
2839 };
2840 /**
2841 * Class definition
2842 */
2843
2844 class Modal extends BaseComponent {
2845 constructor(element, config) {
2846 super(element, config);
2847 this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
2848 this._backdrop = this._initializeBackDrop();
2849 this._focustrap = this._initializeFocusTrap();
2850 this._isShown = false;
2851 this._isTransitioning = false;
2852 this._scrollBar = new ScrollBarHelper();
2853
2854 this._addEventListeners();
2855 } // Getters
2856
2857
2858 static get Default() {
2859 return Default$6;
2860 }
2861
2862 static get DefaultType() {
2863 return DefaultType$6;
2864 }
2865
2866 static get NAME() {
2867 return NAME$7;
2868 } // Public
2869
2870
2871 toggle(relatedTarget) {
2872 return this._isShown ? this.hide() : this.show(relatedTarget);
2873 }
2874
2875 show(relatedTarget) {
2876 if (this._isShown || this._isTransitioning) {
2877 return;
2878 }
2879
2880 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
2881 relatedTarget
2882 });
2883
2884 if (showEvent.defaultPrevented) {
2885 return;
2886 }
2887
2888 this._isShown = true;
2889 this._isTransitioning = true;
2890
2891 this._scrollBar.hide();
2892
2893 document.body.classList.add(CLASS_NAME_OPEN);
2894
2895 this._adjustDialog();
2896
2897 this._backdrop.show(() => this._showElement(relatedTarget));
2898 }
2899
2900 hide() {
2901 if (!this._isShown || this._isTransitioning) {
2902 return;
2903 }
2904
2905 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
2906
2907 if (hideEvent.defaultPrevented) {
2908 return;
2909 }
2910
2911 this._isShown = false;
2912 this._isTransitioning = true;
2913
2914 this._focustrap.deactivate();
2915
2916 this._element.classList.remove(CLASS_NAME_SHOW$4);
2917
2918 this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
2919 }
2920
2921 dispose() {
2922 for (const htmlElement of [window, this._dialog]) {
2923 EventHandler.off(htmlElement, EVENT_KEY$4);
2924 }
2925
2926 this._backdrop.dispose();
2927
2928 this._focustrap.deactivate();
2929
2930 super.dispose();
2931 }
2932
2933 handleUpdate() {
2934 this._adjustDialog();
2935 } // Private
2936
2937
2938 _initializeBackDrop() {
2939 return new Backdrop({
2940 isVisible: Boolean(this._config.backdrop),
2941 // 'static' option will be translated to true, and booleans will keep their value,
2942 isAnimated: this._isAnimated()
2943 });
2944 }
2945
2946 _initializeFocusTrap() {
2947 return new FocusTrap({
2948 trapElement: this._element
2949 });
2950 }
2951
2952 _showElement(relatedTarget) {
2953 // try to append dynamic modal
2954 if (!document.body.contains(this._element)) {
2955 document.body.append(this._element);
2956 }
2957
2958 this._element.style.display = 'block';
2959
2960 this._element.removeAttribute('aria-hidden');
2961
2962 this._element.setAttribute('aria-modal', true);
2963
2964 this._element.setAttribute('role', 'dialog');
2965
2966 this._element.scrollTop = 0;
2967 const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
2968
2969 if (modalBody) {
2970 modalBody.scrollTop = 0;
2971 }
2972
2973 reflow(this._element);
2974
2975 this._element.classList.add(CLASS_NAME_SHOW$4);
2976
2977 const transitionComplete = () => {
2978 if (this._config.focus) {
2979 this._focustrap.activate();
2980 }
2981
2982 this._isTransitioning = false;
2983 EventHandler.trigger(this._element, EVENT_SHOWN$4, {
2984 relatedTarget
2985 });
2986 };
2987
2988 this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
2989 }
2990
2991 _addEventListeners() {
2992 EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
2993 if (event.key !== ESCAPE_KEY$1) {
2994 return;
2995 }
2996
2997 if (this._config.keyboard) {
2998 event.preventDefault();
2999 this.hide();
3000 return;
3001 }
3002
3003 this._triggerBackdropTransition();
3004 });
3005 EventHandler.on(window, EVENT_RESIZE$1, () => {
3006 if (this._isShown && !this._isTransitioning) {
3007 this._adjustDialog();
3008 }
3009 });
3010 EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
3011 // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
3012 EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
3013 if (this._element !== event.target || this._element !== event2.target) {
3014 return;
3015 }
3016
3017 if (this._config.backdrop === 'static') {
3018 this._triggerBackdropTransition();
3019
3020 return;
3021 }
3022
3023 if (this._config.backdrop) {
3024 this.hide();
3025 }
3026 });
3027 });
3028 }
3029
3030 _hideModal() {
3031 this._element.style.display = 'none';
3032
3033 this._element.setAttribute('aria-hidden', true);
3034
3035 this._element.removeAttribute('aria-modal');
3036
3037 this._element.removeAttribute('role');
3038
3039 this._isTransitioning = false;
3040
3041 this._backdrop.hide(() => {
3042 document.body.classList.remove(CLASS_NAME_OPEN);
3043
3044 this._resetAdjustments();
3045
3046 this._scrollBar.reset();
3047
3048 EventHandler.trigger(this._element, EVENT_HIDDEN$4);
3049 });
3050 }
3051
3052 _isAnimated() {
3053 return this._element.classList.contains(CLASS_NAME_FADE$3);
3054 }
3055
3056 _triggerBackdropTransition() {
3057 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
3058
3059 if (hideEvent.defaultPrevented) {
3060 return;
3061 }
3062
3063 const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
3064 const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed
3065
3066 if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
3067 return;
3068 }
3069
3070 if (!isModalOverflowing) {
3071 this._element.style.overflowY = 'hidden';
3072 }
3073
3074 this._element.classList.add(CLASS_NAME_STATIC);
3075
3076 this._queueCallback(() => {
3077 this._element.classList.remove(CLASS_NAME_STATIC);
3078
3079 this._queueCallback(() => {
3080 this._element.style.overflowY = initialOverflowY;
3081 }, this._dialog);
3082 }, this._dialog);
3083
3084 this._element.focus();
3085 }
3086 /**
3087 * The following methods are used to handle overflowing modals
3088 */
3089
3090
3091 _adjustDialog() {
3092 const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
3093
3094 const scrollbarWidth = this._scrollBar.getWidth();
3095
3096 const isBodyOverflowing = scrollbarWidth > 0;
3097
3098 if (isBodyOverflowing && !isModalOverflowing) {
3099 const property = isRTL() ? 'paddingLeft' : 'paddingRight';
3100 this._element.style[property] = `${scrollbarWidth}px`;
3101 }
3102
3103 if (!isBodyOverflowing && isModalOverflowing) {
3104 const property = isRTL() ? 'paddingRight' : 'paddingLeft';
3105 this._element.style[property] = `${scrollbarWidth}px`;
3106 }
3107 }
3108
3109 _resetAdjustments() {
3110 this._element.style.paddingLeft = '';
3111 this._element.style.paddingRight = '';
3112 } // Static
3113
3114
3115 static jQueryInterface(config, relatedTarget) {
3116 return this.each(function () {
3117 const data = Modal.getOrCreateInstance(this, config);
3118
3119 if (typeof config !== 'string') {
3120 return;
3121 }
3122
3123 if (typeof data[config] === 'undefined') {
3124 throw new TypeError(`No method named "${config}"`);
3125 }
3126
3127 data[config](relatedTarget);
3128 });
3129 }
3130
3131 }
3132 /**
3133 * Data API implementation
3134 */
3135
3136
3137 EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
3138 const target = getElementFromSelector(this);
3139
3140 if (['A', 'AREA'].includes(this.tagName)) {
3141 event.preventDefault();
3142 }
3143
3144 EventHandler.one(target, EVENT_SHOW$4, showEvent => {
3145 if (showEvent.defaultPrevented) {
3146 // only register focus restorer if modal will actually get shown
3147 return;
3148 }
3149
3150 EventHandler.one(target, EVENT_HIDDEN$4, () => {
3151 if (isVisible(this)) {
3152 this.focus();
3153 }
3154 });
3155 }); // avoid conflict when clicking modal toggler while another one is open
3156
3157 const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
3158
3159 if (alreadyOpen) {
3160 Modal.getInstance(alreadyOpen).hide();
3161 }
3162
3163 const data = Modal.getOrCreateInstance(target);
3164 data.toggle(this);
3165 });
3166 enableDismissTrigger(Modal);
3167 /**
3168 * jQuery
3169 */
3170
3171 defineJQueryPlugin(Modal);
3172
3173 /**
3174 * --------------------------------------------------------------------------
3175 * Bootstrap (v5.2.3): offcanvas.js
3176 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3177 * --------------------------------------------------------------------------
3178 */
3179 /**
3180 * Constants
3181 */
3182
3183 const NAME$6 = 'offcanvas';
3184 const DATA_KEY$3 = 'bs.offcanvas';
3185 const EVENT_KEY$3 = `.${DATA_KEY$3}`;
3186 const DATA_API_KEY$1 = '.data-api';
3187 const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
3188 const ESCAPE_KEY = 'Escape';
3189 const CLASS_NAME_SHOW$3 = 'show';
3190 const CLASS_NAME_SHOWING$1 = 'showing';
3191 const CLASS_NAME_HIDING = 'hiding';
3192 const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
3193 const OPEN_SELECTOR = '.offcanvas.show';
3194 const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
3195 const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
3196 const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
3197 const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
3198 const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
3199 const EVENT_RESIZE = `resize${EVENT_KEY$3}`;
3200 const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
3201 const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
3202 const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
3203 const Default$5 = {
3204 backdrop: true,
3205 keyboard: true,
3206 scroll: false
3207 };
3208 const DefaultType$5 = {
3209 backdrop: '(boolean|string)',
3210 keyboard: 'boolean',
3211 scroll: 'boolean'
3212 };
3213 /**
3214 * Class definition
3215 */
3216
3217 class Offcanvas extends BaseComponent {
3218 constructor(element, config) {
3219 super(element, config);
3220 this._isShown = false;
3221 this._backdrop = this._initializeBackDrop();
3222 this._focustrap = this._initializeFocusTrap();
3223
3224 this._addEventListeners();
3225 } // Getters
3226
3227
3228 static get Default() {
3229 return Default$5;
3230 }
3231
3232 static get DefaultType() {
3233 return DefaultType$5;
3234 }
3235
3236 static get NAME() {
3237 return NAME$6;
3238 } // Public
3239
3240
3241 toggle(relatedTarget) {
3242 return this._isShown ? this.hide() : this.show(relatedTarget);
3243 }
3244
3245 show(relatedTarget) {
3246 if (this._isShown) {
3247 return;
3248 }
3249
3250 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
3251 relatedTarget
3252 });
3253
3254 if (showEvent.defaultPrevented) {
3255 return;
3256 }
3257
3258 this._isShown = true;
3259
3260 this._backdrop.show();
3261
3262 if (!this._config.scroll) {
3263 new ScrollBarHelper().hide();
3264 }
3265
3266 this._element.setAttribute('aria-modal', true);
3267
3268 this._element.setAttribute('role', 'dialog');
3269
3270 this._element.classList.add(CLASS_NAME_SHOWING$1);
3271
3272 const completeCallBack = () => {
3273 if (!this._config.scroll || this._config.backdrop) {
3274 this._focustrap.activate();
3275 }
3276
3277 this._element.classList.add(CLASS_NAME_SHOW$3);
3278
3279 this._element.classList.remove(CLASS_NAME_SHOWING$1);
3280
3281 EventHandler.trigger(this._element, EVENT_SHOWN$3, {
3282 relatedTarget
3283 });
3284 };
3285
3286 this._queueCallback(completeCallBack, this._element, true);
3287 }
3288
3289 hide() {
3290 if (!this._isShown) {
3291 return;
3292 }
3293
3294 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
3295
3296 if (hideEvent.defaultPrevented) {
3297 return;
3298 }
3299
3300 this._focustrap.deactivate();
3301
3302 this._element.blur();
3303
3304 this._isShown = false;
3305
3306 this._element.classList.add(CLASS_NAME_HIDING);
3307
3308 this._backdrop.hide();
3309
3310 const completeCallback = () => {
3311 this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
3312
3313 this._element.removeAttribute('aria-modal');
3314
3315 this._element.removeAttribute('role');
3316
3317 if (!this._config.scroll) {
3318 new ScrollBarHelper().reset();
3319 }
3320
3321 EventHandler.trigger(this._element, EVENT_HIDDEN$3);
3322 };
3323
3324 this._queueCallback(completeCallback, this._element, true);
3325 }
3326
3327 dispose() {
3328 this._backdrop.dispose();
3329
3330 this._focustrap.deactivate();
3331
3332 super.dispose();
3333 } // Private
3334
3335
3336 _initializeBackDrop() {
3337 const clickCallback = () => {
3338 if (this._config.backdrop === 'static') {
3339 EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
3340 return;
3341 }
3342
3343 this.hide();
3344 }; // 'static' option will be translated to true, and booleans will keep their value
3345
3346
3347 const isVisible = Boolean(this._config.backdrop);
3348 return new Backdrop({
3349 className: CLASS_NAME_BACKDROP,
3350 isVisible,
3351 isAnimated: true,
3352 rootElement: this._element.parentNode,
3353 clickCallback: isVisible ? clickCallback : null
3354 });
3355 }
3356
3357 _initializeFocusTrap() {
3358 return new FocusTrap({
3359 trapElement: this._element
3360 });
3361 }
3362
3363 _addEventListeners() {
3364 EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
3365 if (event.key !== ESCAPE_KEY) {
3366 return;
3367 }
3368
3369 if (!this._config.keyboard) {
3370 EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
3371 return;
3372 }
3373
3374 this.hide();
3375 });
3376 } // Static
3377
3378
3379 static jQueryInterface(config) {
3380 return this.each(function () {
3381 const data = Offcanvas.getOrCreateInstance(this, config);
3382
3383 if (typeof config !== 'string') {
3384 return;
3385 }
3386
3387 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3388 throw new TypeError(`No method named "${config}"`);
3389 }
3390
3391 data[config](this);
3392 });
3393 }
3394
3395 }
3396 /**
3397 * Data API implementation
3398 */
3399
3400
3401 EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
3402 const target = getElementFromSelector(this);
3403
3404 if (['A', 'AREA'].includes(this.tagName)) {
3405 event.preventDefault();
3406 }
3407
3408 if (isDisabled(this)) {
3409 return;
3410 }
3411
3412 EventHandler.one(target, EVENT_HIDDEN$3, () => {
3413 // focus on trigger when it is closed
3414 if (isVisible(this)) {
3415 this.focus();
3416 }
3417 }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
3418
3419 const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
3420
3421 if (alreadyOpen && alreadyOpen !== target) {
3422 Offcanvas.getInstance(alreadyOpen).hide();
3423 }
3424
3425 const data = Offcanvas.getOrCreateInstance(target);
3426 data.toggle(this);
3427 });
3428 EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
3429 for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
3430 Offcanvas.getOrCreateInstance(selector).show();
3431 }
3432 });
3433 EventHandler.on(window, EVENT_RESIZE, () => {
3434 for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
3435 if (getComputedStyle(element).position !== 'fixed') {
3436 Offcanvas.getOrCreateInstance(element).hide();
3437 }
3438 }
3439 });
3440 enableDismissTrigger(Offcanvas);
3441 /**
3442 * jQuery
3443 */
3444
3445 defineJQueryPlugin(Offcanvas);
3446
3447 /**
3448 * --------------------------------------------------------------------------
3449 * Bootstrap (v5.2.3): util/sanitizer.js
3450 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3451 * --------------------------------------------------------------------------
3452 */
3453 const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
3454 const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
3455 /**
3456 * A pattern that recognizes a commonly useful subset of URLs that are safe.
3457 *
3458 * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
3459 */
3460
3461 const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
3462 /**
3463 * A pattern that matches safe data URLs. Only matches image, video and audio types.
3464 *
3465 * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
3466 */
3467
3468 const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
3469
3470 const allowedAttribute = (attribute, allowedAttributeList) => {
3471 const attributeName = attribute.nodeName.toLowerCase();
3472
3473 if (allowedAttributeList.includes(attributeName)) {
3474 if (uriAttributes.has(attributeName)) {
3475 return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
3476 }
3477
3478 return true;
3479 } // Check if a regular expression validates the attribute.
3480
3481
3482 return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
3483 };
3484
3485 const DefaultAllowlist = {
3486 // Global attributes allowed on any supplied element below.
3487 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
3488 a: ['target', 'href', 'title', 'rel'],
3489 area: [],
3490 b: [],
3491 br: [],
3492 col: [],
3493 code: [],
3494 div: [],
3495 em: [],
3496 hr: [],
3497 h1: [],
3498 h2: [],
3499 h3: [],
3500 h4: [],
3501 h5: [],
3502 h6: [],
3503 i: [],
3504 img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
3505 li: [],
3506 ol: [],
3507 p: [],
3508 pre: [],
3509 s: [],
3510 small: [],
3511 span: [],
3512 sub: [],
3513 sup: [],
3514 strong: [],
3515 u: [],
3516 ul: []
3517 };
3518 function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
3519 if (!unsafeHtml.length) {
3520 return unsafeHtml;
3521 }
3522
3523 if (sanitizeFunction && typeof sanitizeFunction === 'function') {
3524 return sanitizeFunction(unsafeHtml);
3525 }
3526
3527 const domParser = new window.DOMParser();
3528 const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
3529 const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
3530
3531 for (const element of elements) {
3532 const elementName = element.nodeName.toLowerCase();
3533
3534 if (!Object.keys(allowList).includes(elementName)) {
3535 element.remove();
3536 continue;
3537 }
3538
3539 const attributeList = [].concat(...element.attributes);
3540 const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
3541
3542 for (const attribute of attributeList) {
3543 if (!allowedAttribute(attribute, allowedAttributes)) {
3544 element.removeAttribute(attribute.nodeName);
3545 }
3546 }
3547 }
3548
3549 return createdDocument.body.innerHTML;
3550 }
3551
3552 /**
3553 * --------------------------------------------------------------------------
3554 * Bootstrap (v5.2.3): util/template-factory.js
3555 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3556 * --------------------------------------------------------------------------
3557 */
3558 /**
3559 * Constants
3560 */
3561
3562 const NAME$5 = 'TemplateFactory';
3563 const Default$4 = {
3564 allowList: DefaultAllowlist,
3565 content: {},
3566 // { selector : text , selector2 : text2 , }
3567 extraClass: '',
3568 html: false,
3569 sanitize: true,
3570 sanitizeFn: null,
3571 template: '<div></div>'
3572 };
3573 const DefaultType$4 = {
3574 allowList: 'object',
3575 content: 'object',
3576 extraClass: '(string|function)',
3577 html: 'boolean',
3578 sanitize: 'boolean',
3579 sanitizeFn: '(null|function)',
3580 template: 'string'
3581 };
3582 const DefaultContentType = {
3583 entry: '(string|element|function|null)',
3584 selector: '(string|element)'
3585 };
3586 /**
3587 * Class definition
3588 */
3589
3590 class TemplateFactory extends Config {
3591 constructor(config) {
3592 super();
3593 this._config = this._getConfig(config);
3594 } // Getters
3595
3596
3597 static get Default() {
3598 return Default$4;
3599 }
3600
3601 static get DefaultType() {
3602 return DefaultType$4;
3603 }
3604
3605 static get NAME() {
3606 return NAME$5;
3607 } // Public
3608
3609
3610 getContent() {
3611 return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
3612 }
3613
3614 hasContent() {
3615 return this.getContent().length > 0;
3616 }
3617
3618 changeContent(content) {
3619 this._checkContent(content);
3620
3621 this._config.content = { ...this._config.content,
3622 ...content
3623 };
3624 return this;
3625 }
3626
3627 toHtml() {
3628 const templateWrapper = document.createElement('div');
3629 templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
3630
3631 for (const [selector, text] of Object.entries(this._config.content)) {
3632 this._setContent(templateWrapper, text, selector);
3633 }
3634
3635 const template = templateWrapper.children[0];
3636
3637 const extraClass = this._resolvePossibleFunction(this._config.extraClass);
3638
3639 if (extraClass) {
3640 template.classList.add(...extraClass.split(' '));
3641 }
3642
3643 return template;
3644 } // Private
3645
3646
3647 _typeCheckConfig(config) {
3648 super._typeCheckConfig(config);
3649
3650 this._checkContent(config.content);
3651 }
3652
3653 _checkContent(arg) {
3654 for (const [selector, content] of Object.entries(arg)) {
3655 super._typeCheckConfig({
3656 selector,
3657 entry: content
3658 }, DefaultContentType);
3659 }
3660 }
3661
3662 _setContent(template, content, selector) {
3663 const templateElement = SelectorEngine.findOne(selector, template);
3664
3665 if (!templateElement) {
3666 return;
3667 }
3668
3669 content = this._resolvePossibleFunction(content);
3670
3671 if (!content) {
3672 templateElement.remove();
3673 return;
3674 }
3675
3676 if (isElement(content)) {
3677 this._putElementInTemplate(getElement(content), templateElement);
3678
3679 return;
3680 }
3681
3682 if (this._config.html) {
3683 templateElement.innerHTML = this._maybeSanitize(content);
3684 return;
3685 }
3686
3687 templateElement.textContent = content;
3688 }
3689
3690 _maybeSanitize(arg) {
3691 return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
3692 }
3693
3694 _resolvePossibleFunction(arg) {
3695 return typeof arg === 'function' ? arg(this) : arg;
3696 }
3697
3698 _putElementInTemplate(element, templateElement) {
3699 if (this._config.html) {
3700 templateElement.innerHTML = '';
3701 templateElement.append(element);
3702 return;
3703 }
3704
3705 templateElement.textContent = element.textContent;
3706 }
3707
3708 }
3709
3710 /**
3711 * --------------------------------------------------------------------------
3712 * Bootstrap (v5.2.3): tooltip.js
3713 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3714 * --------------------------------------------------------------------------
3715 */
3716 /**
3717 * Constants
3718 */
3719
3720 const NAME$4 = 'tooltip';
3721 const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
3722 const CLASS_NAME_FADE$2 = 'fade';
3723 const CLASS_NAME_MODAL = 'modal';
3724 const CLASS_NAME_SHOW$2 = 'show';
3725 const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
3726 const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
3727 const EVENT_MODAL_HIDE = 'hide.bs.modal';
3728 const TRIGGER_HOVER = 'hover';
3729 const TRIGGER_FOCUS = 'focus';
3730 const TRIGGER_CLICK = 'click';
3731 const TRIGGER_MANUAL = 'manual';
3732 const EVENT_HIDE$2 = 'hide';
3733 const EVENT_HIDDEN$2 = 'hidden';
3734 const EVENT_SHOW$2 = 'show';
3735 const EVENT_SHOWN$2 = 'shown';
3736 const EVENT_INSERTED = 'inserted';
3737 const EVENT_CLICK$1 = 'click';
3738 const EVENT_FOCUSIN$1 = 'focusin';
3739 const EVENT_FOCUSOUT$1 = 'focusout';
3740 const EVENT_MOUSEENTER = 'mouseenter';
3741 const EVENT_MOUSELEAVE = 'mouseleave';
3742 const AttachmentMap = {
3743 AUTO: 'auto',
3744 TOP: 'top',
3745 RIGHT: isRTL() ? 'left' : 'right',
3746 BOTTOM: 'bottom',
3747 LEFT: isRTL() ? 'right' : 'left'
3748 };
3749 const Default$3 = {
3750 allowList: DefaultAllowlist,
3751 animation: true,
3752 boundary: 'clippingParents',
3753 container: false,
3754 customClass: '',
3755 delay: 0,
3756 fallbackPlacements: ['top', 'right', 'bottom', 'left'],
3757 html: false,
3758 offset: [0, 0],
3759 placement: 'top',
3760 popperConfig: null,
3761 sanitize: true,
3762 sanitizeFn: null,
3763 selector: false,
3764 template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
3765 title: '',
3766 trigger: 'hover focus'
3767 };
3768 const DefaultType$3 = {
3769 allowList: 'object',
3770 animation: 'boolean',
3771 boundary: '(string|element)',
3772 container: '(string|element|boolean)',
3773 customClass: '(string|function)',
3774 delay: '(number|object)',
3775 fallbackPlacements: 'array',
3776 html: 'boolean',
3777 offset: '(array|string|function)',
3778 placement: '(string|function)',
3779 popperConfig: '(null|object|function)',
3780 sanitize: 'boolean',
3781 sanitizeFn: '(null|function)',
3782 selector: '(string|boolean)',
3783 template: 'string',
3784 title: '(string|element|function)',
3785 trigger: 'string'
3786 };
3787 /**
3788 * Class definition
3789 */
3790
3791 class Tooltip extends BaseComponent {
3792 constructor(element, config) {
3793 if (typeof Popper__namespace === 'undefined') {
3794 throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
3795 }
3796
3797 super(element, config); // Private
3798
3799 this._isEnabled = true;
3800 this._timeout = 0;
3801 this._isHovered = null;
3802 this._activeTrigger = {};
3803 this._popper = null;
3804 this._templateFactory = null;
3805 this._newContent = null; // Protected
3806
3807 this.tip = null;
3808
3809 this._setListeners();
3810
3811 if (!this._config.selector) {
3812 this._fixTitle();
3813 }
3814 } // Getters
3815
3816
3817 static get Default() {
3818 return Default$3;
3819 }
3820
3821 static get DefaultType() {
3822 return DefaultType$3;
3823 }
3824
3825 static get NAME() {
3826 return NAME$4;
3827 } // Public
3828
3829
3830 enable() {
3831 this._isEnabled = true;
3832 }
3833
3834 disable() {
3835 this._isEnabled = false;
3836 }
3837
3838 toggleEnabled() {
3839 this._isEnabled = !this._isEnabled;
3840 }
3841
3842 toggle() {
3843 if (!this._isEnabled) {
3844 return;
3845 }
3846
3847 this._activeTrigger.click = !this._activeTrigger.click;
3848
3849 if (this._isShown()) {
3850 this._leave();
3851
3852 return;
3853 }
3854
3855 this._enter();
3856 }
3857
3858 dispose() {
3859 clearTimeout(this._timeout);
3860 EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3861
3862 if (this._element.getAttribute('data-bs-original-title')) {
3863 this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
3864 }
3865
3866 this._disposePopper();
3867
3868 super.dispose();
3869 }
3870
3871 show() {
3872 if (this._element.style.display === 'none') {
3873 throw new Error('Please use show on visible elements');
3874 }
3875
3876 if (!(this._isWithContent() && this._isEnabled)) {
3877 return;
3878 }
3879
3880 const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
3881 const shadowRoot = findShadowRoot(this._element);
3882
3883 const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
3884
3885 if (showEvent.defaultPrevented || !isInTheDom) {
3886 return;
3887 } // todo v6 remove this OR make it optional
3888
3889
3890 this._disposePopper();
3891
3892 const tip = this._getTipElement();
3893
3894 this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
3895
3896 const {
3897 container
3898 } = this._config;
3899
3900 if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
3901 container.append(tip);
3902 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
3903 }
3904
3905 this._popper = this._createPopper(tip);
3906 tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra
3907 // empty mouseover listeners to the body's immediate children;
3908 // only needed because of broken event delegation on iOS
3909 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
3910
3911 if ('ontouchstart' in document.documentElement) {
3912 for (const element of [].concat(...document.body.children)) {
3913 EventHandler.on(element, 'mouseover', noop);
3914 }
3915 }
3916
3917 const complete = () => {
3918 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
3919
3920 if (this._isHovered === false) {
3921 this._leave();
3922 }
3923
3924 this._isHovered = false;
3925 };
3926
3927 this._queueCallback(complete, this.tip, this._isAnimated());
3928 }
3929
3930 hide() {
3931 if (!this._isShown()) {
3932 return;
3933 }
3934
3935 const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
3936
3937 if (hideEvent.defaultPrevented) {
3938 return;
3939 }
3940
3941 const tip = this._getTipElement();
3942
3943 tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
3944 // empty mouseover listeners we added for iOS support
3945
3946 if ('ontouchstart' in document.documentElement) {
3947 for (const element of [].concat(...document.body.children)) {
3948 EventHandler.off(element, 'mouseover', noop);
3949 }
3950 }
3951
3952 this._activeTrigger[TRIGGER_CLICK] = false;
3953 this._activeTrigger[TRIGGER_FOCUS] = false;
3954 this._activeTrigger[TRIGGER_HOVER] = false;
3955 this._isHovered = null; // it is a trick to support manual triggering
3956
3957 const complete = () => {
3958 if (this._isWithActiveTrigger()) {
3959 return;
3960 }
3961
3962 if (!this._isHovered) {
3963 this._disposePopper();
3964 }
3965
3966 this._element.removeAttribute('aria-describedby');
3967
3968 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
3969 };
3970
3971 this._queueCallback(complete, this.tip, this._isAnimated());
3972 }
3973
3974 update() {
3975 if (this._popper) {
3976 this._popper.update();
3977 }
3978 } // Protected
3979
3980
3981 _isWithContent() {
3982 return Boolean(this._getTitle());
3983 }
3984
3985 _getTipElement() {
3986 if (!this.tip) {
3987 this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
3988 }
3989
3990 return this.tip;
3991 }
3992
3993 _createTipElement(content) {
3994 const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6
3995
3996
3997 if (!tip) {
3998 return null;
3999 }
4000
4001 tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only
4002
4003 tip.classList.add(`bs-${this.constructor.NAME}-auto`);
4004 const tipId = getUID(this.constructor.NAME).toString();
4005 tip.setAttribute('id', tipId);
4006
4007 if (this._isAnimated()) {
4008 tip.classList.add(CLASS_NAME_FADE$2);
4009 }
4010
4011 return tip;
4012 }
4013
4014 setContent(content) {
4015 this._newContent = content;
4016
4017 if (this._isShown()) {
4018 this._disposePopper();
4019
4020 this.show();
4021 }
4022 }
4023
4024 _getTemplateFactory(content) {
4025 if (this._templateFactory) {
4026 this._templateFactory.changeContent(content);
4027 } else {
4028 this._templateFactory = new TemplateFactory({ ...this._config,
4029 // the `content` var has to be after `this._config`
4030 // to override config.content in case of popover
4031 content,
4032 extraClass: this._resolvePossibleFunction(this._config.customClass)
4033 });
4034 }
4035
4036 return this._templateFactory;
4037 }
4038
4039 _getContentForTemplate() {
4040 return {
4041 [SELECTOR_TOOLTIP_INNER]: this._getTitle()
4042 };
4043 }
4044
4045 _getTitle() {
4046 return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');
4047 } // Private
4048
4049
4050 _initializeOnDelegatedTarget(event) {
4051 return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
4052 }
4053
4054 _isAnimated() {
4055 return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
4056 }
4057
4058 _isShown() {
4059 return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
4060 }
4061
4062 _createPopper(tip) {
4063 const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
4064 const attachment = AttachmentMap[placement.toUpperCase()];
4065 return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
4066 }
4067
4068 _getOffset() {
4069 const {
4070 offset
4071 } = this._config;
4072
4073 if (typeof offset === 'string') {
4074 return offset.split(',').map(value => Number.parseInt(value, 10));
4075 }
4076
4077 if (typeof offset === 'function') {
4078 return popperData => offset(popperData, this._element);
4079 }
4080
4081 return offset;
4082 }
4083
4084 _resolvePossibleFunction(arg) {
4085 return typeof arg === 'function' ? arg.call(this._element) : arg;
4086 }
4087
4088 _getPopperConfig(attachment) {
4089 const defaultBsPopperConfig = {
4090 placement: attachment,
4091 modifiers: [{
4092 name: 'flip',
4093 options: {
4094 fallbackPlacements: this._config.fallbackPlacements
4095 }
4096 }, {
4097 name: 'offset',
4098 options: {
4099 offset: this._getOffset()
4100 }
4101 }, {
4102 name: 'preventOverflow',
4103 options: {
4104 boundary: this._config.boundary
4105 }
4106 }, {
4107 name: 'arrow',
4108 options: {
4109 element: `.${this.constructor.NAME}-arrow`
4110 }
4111 }, {
4112 name: 'preSetPlacement',
4113 enabled: true,
4114 phase: 'beforeMain',
4115 fn: data => {
4116 // Pre-set Popper's placement attribute in order to read the arrow sizes properly.
4117 // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement
4118 this._getTipElement().setAttribute('data-popper-placement', data.state.placement);
4119 }
4120 }]
4121 };
4122 return { ...defaultBsPopperConfig,
4123 ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
4124 };
4125 }
4126
4127 _setListeners() {
4128 const triggers = this._config.trigger.split(' ');
4129
4130 for (const trigger of triggers) {
4131 if (trigger === 'click') {
4132 EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {
4133 const context = this._initializeOnDelegatedTarget(event);
4134
4135 context.toggle();
4136 });
4137 } else if (trigger !== TRIGGER_MANUAL) {
4138 const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
4139 const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
4140 EventHandler.on(this._element, eventIn, this._config.selector, event => {
4141 const context = this._initializeOnDelegatedTarget(event);
4142
4143 context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
4144
4145 context._enter();
4146 });
4147 EventHandler.on(this._element, eventOut, this._config.selector, event => {
4148 const context = this._initializeOnDelegatedTarget(event);
4149
4150 context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
4151
4152 context._leave();
4153 });
4154 }
4155 }
4156
4157 this._hideModalHandler = () => {
4158 if (this._element) {
4159 this.hide();
4160 }
4161 };
4162
4163 EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
4164 }
4165
4166 _fixTitle() {
4167 const title = this._element.getAttribute('title');
4168
4169 if (!title) {
4170 return;
4171 }
4172
4173 if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
4174 this._element.setAttribute('aria-label', title);
4175 }
4176
4177 this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
4178
4179
4180 this._element.removeAttribute('title');
4181 }
4182
4183 _enter() {
4184 if (this._isShown() || this._isHovered) {
4185 this._isHovered = true;
4186 return;
4187 }
4188
4189 this._isHovered = true;
4190
4191 this._setTimeout(() => {
4192 if (this._isHovered) {
4193 this.show();
4194 }
4195 }, this._config.delay.show);
4196 }
4197
4198 _leave() {
4199 if (this._isWithActiveTrigger()) {
4200 return;
4201 }
4202
4203 this._isHovered = false;
4204
4205 this._setTimeout(() => {
4206 if (!this._isHovered) {
4207 this.hide();
4208 }
4209 }, this._config.delay.hide);
4210 }
4211
4212 _setTimeout(handler, timeout) {
4213 clearTimeout(this._timeout);
4214 this._timeout = setTimeout(handler, timeout);
4215 }
4216
4217 _isWithActiveTrigger() {
4218 return Object.values(this._activeTrigger).includes(true);
4219 }
4220
4221 _getConfig(config) {
4222 const dataAttributes = Manipulator.getDataAttributes(this._element);
4223
4224 for (const dataAttribute of Object.keys(dataAttributes)) {
4225 if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
4226 delete dataAttributes[dataAttribute];
4227 }
4228 }
4229
4230 config = { ...dataAttributes,
4231 ...(typeof config === 'object' && config ? config : {})
4232 };
4233 config = this._mergeConfigObj(config);
4234 config = this._configAfterMerge(config);
4235
4236 this._typeCheckConfig(config);
4237
4238 return config;
4239 }
4240
4241 _configAfterMerge(config) {
4242 config.container = config.container === false ? document.body : getElement(config.container);
4243
4244 if (typeof config.delay === 'number') {
4245 config.delay = {
4246 show: config.delay,
4247 hide: config.delay
4248 };
4249 }
4250
4251 if (typeof config.title === 'number') {
4252 config.title = config.title.toString();
4253 }
4254
4255 if (typeof config.content === 'number') {
4256 config.content = config.content.toString();
4257 }
4258
4259 return config;
4260 }
4261
4262 _getDelegateConfig() {
4263 const config = {};
4264
4265 for (const key in this._config) {
4266 if (this.constructor.Default[key] !== this._config[key]) {
4267 config[key] = this._config[key];
4268 }
4269 }
4270
4271 config.selector = false;
4272 config.trigger = 'manual'; // In the future can be replaced with:
4273 // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
4274 // `Object.fromEntries(keysWithDifferentValues)`
4275
4276 return config;
4277 }
4278
4279 _disposePopper() {
4280 if (this._popper) {
4281 this._popper.destroy();
4282
4283 this._popper = null;
4284 }
4285
4286 if (this.tip) {
4287 this.tip.remove();
4288 this.tip = null;
4289 }
4290 } // Static
4291
4292
4293 static jQueryInterface(config) {
4294 return this.each(function () {
4295 const data = Tooltip.getOrCreateInstance(this, config);
4296
4297 if (typeof config !== 'string') {
4298 return;
4299 }
4300
4301 if (typeof data[config] === 'undefined') {
4302 throw new TypeError(`No method named "${config}"`);
4303 }
4304
4305 data[config]();
4306 });
4307 }
4308
4309 }
4310 /**
4311 * jQuery
4312 */
4313
4314
4315 defineJQueryPlugin(Tooltip);
4316
4317 /**
4318 * --------------------------------------------------------------------------
4319 * Bootstrap (v5.2.3): popover.js
4320 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4321 * --------------------------------------------------------------------------
4322 */
4323 /**
4324 * Constants
4325 */
4326
4327 const NAME$3 = 'popover';
4328 const SELECTOR_TITLE = '.popover-header';
4329 const SELECTOR_CONTENT = '.popover-body';
4330 const Default$2 = { ...Tooltip.Default,
4331 content: '',
4332 offset: [0, 8],
4333 placement: 'right',
4334 template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>',
4335 trigger: 'click'
4336 };
4337 const DefaultType$2 = { ...Tooltip.DefaultType,
4338 content: '(null|string|element|function)'
4339 };
4340 /**
4341 * Class definition
4342 */
4343
4344 class Popover extends Tooltip {
4345 // Getters
4346 static get Default() {
4347 return Default$2;
4348 }
4349
4350 static get DefaultType() {
4351 return DefaultType$2;
4352 }
4353
4354 static get NAME() {
4355 return NAME$3;
4356 } // Overrides
4357
4358
4359 _isWithContent() {
4360 return this._getTitle() || this._getContent();
4361 } // Private
4362
4363
4364 _getContentForTemplate() {
4365 return {
4366 [SELECTOR_TITLE]: this._getTitle(),
4367 [SELECTOR_CONTENT]: this._getContent()
4368 };
4369 }
4370
4371 _getContent() {
4372 return this._resolvePossibleFunction(this._config.content);
4373 } // Static
4374
4375
4376 static jQueryInterface(config) {
4377 return this.each(function () {
4378 const data = Popover.getOrCreateInstance(this, config);
4379
4380 if (typeof config !== 'string') {
4381 return;
4382 }
4383
4384 if (typeof data[config] === 'undefined') {
4385 throw new TypeError(`No method named "${config}"`);
4386 }
4387
4388 data[config]();
4389 });
4390 }
4391
4392 }
4393 /**
4394 * jQuery
4395 */
4396
4397
4398 defineJQueryPlugin(Popover);
4399
4400 /**
4401 * --------------------------------------------------------------------------
4402 * Bootstrap (v5.2.3): scrollspy.js
4403 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4404 * --------------------------------------------------------------------------
4405 */
4406 /**
4407 * Constants
4408 */
4409
4410 const NAME$2 = 'scrollspy';
4411 const DATA_KEY$2 = 'bs.scrollspy';
4412 const EVENT_KEY$2 = `.${DATA_KEY$2}`;
4413 const DATA_API_KEY = '.data-api';
4414 const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
4415 const EVENT_CLICK = `click${EVENT_KEY$2}`;
4416 const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
4417 const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
4418 const CLASS_NAME_ACTIVE$1 = 'active';
4419 const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
4420 const SELECTOR_TARGET_LINKS = '[href]';
4421 const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
4422 const SELECTOR_NAV_LINKS = '.nav-link';
4423 const SELECTOR_NAV_ITEMS = '.nav-item';
4424 const SELECTOR_LIST_ITEMS = '.list-group-item';
4425 const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
4426 const SELECTOR_DROPDOWN = '.dropdown';
4427 const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
4428 const Default$1 = {
4429 offset: null,
4430 // TODO: v6 @deprecated, keep it for backwards compatibility reasons
4431 rootMargin: '0px 0px -25%',
4432 smoothScroll: false,
4433 target: null,
4434 threshold: [0.1, 0.5, 1]
4435 };
4436 const DefaultType$1 = {
4437 offset: '(number|null)',
4438 // TODO v6 @deprecated, keep it for backwards compatibility reasons
4439 rootMargin: 'string',
4440 smoothScroll: 'boolean',
4441 target: 'element',
4442 threshold: 'array'
4443 };
4444 /**
4445 * Class definition
4446 */
4447
4448 class ScrollSpy extends BaseComponent {
4449 constructor(element, config) {
4450 super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper
4451
4452 this._targetLinks = new Map();
4453 this._observableSections = new Map();
4454 this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
4455 this._activeTarget = null;
4456 this._observer = null;
4457 this._previousScrollData = {
4458 visibleEntryTop: 0,
4459 parentScrollTop: 0
4460 };
4461 this.refresh(); // initialize
4462 } // Getters
4463
4464
4465 static get Default() {
4466 return Default$1;
4467 }
4468
4469 static get DefaultType() {
4470 return DefaultType$1;
4471 }
4472
4473 static get NAME() {
4474 return NAME$2;
4475 } // Public
4476
4477
4478 refresh() {
4479 this._initializeTargetsAndObservables();
4480
4481 this._maybeEnableSmoothScroll();
4482
4483 if (this._observer) {
4484 this._observer.disconnect();
4485 } else {
4486 this._observer = this._getNewObserver();
4487 }
4488
4489 for (const section of this._observableSections.values()) {
4490 this._observer.observe(section);
4491 }
4492 }
4493
4494 dispose() {
4495 this._observer.disconnect();
4496
4497 super.dispose();
4498 } // Private
4499
4500
4501 _configAfterMerge(config) {
4502 // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
4503 config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
4504
4505 config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
4506
4507 if (typeof config.threshold === 'string') {
4508 config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
4509 }
4510
4511 return config;
4512 }
4513
4514 _maybeEnableSmoothScroll() {
4515 if (!this._config.smoothScroll) {
4516 return;
4517 } // unregister any previous listeners
4518
4519
4520 EventHandler.off(this._config.target, EVENT_CLICK);
4521 EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
4522 const observableSection = this._observableSections.get(event.target.hash);
4523
4524 if (observableSection) {
4525 event.preventDefault();
4526 const root = this._rootElement || window;
4527 const height = observableSection.offsetTop - this._element.offsetTop;
4528
4529 if (root.scrollTo) {
4530 root.scrollTo({
4531 top: height,
4532 behavior: 'smooth'
4533 });
4534 return;
4535 } // Chrome 60 doesn't support `scrollTo`
4536
4537
4538 root.scrollTop = height;
4539 }
4540 });
4541 }
4542
4543 _getNewObserver() {
4544 const options = {
4545 root: this._rootElement,
4546 threshold: this._config.threshold,
4547 rootMargin: this._config.rootMargin
4548 };
4549 return new IntersectionObserver(entries => this._observerCallback(entries), options);
4550 } // The logic of selection
4551
4552
4553 _observerCallback(entries) {
4554 const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
4555
4556 const activate = entry => {
4557 this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
4558
4559 this._process(targetElement(entry));
4560 };
4561
4562 const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
4563 const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
4564 this._previousScrollData.parentScrollTop = parentScrollTop;
4565
4566 for (const entry of entries) {
4567 if (!entry.isIntersecting) {
4568 this._activeTarget = null;
4569
4570 this._clearActiveClass(targetElement(entry));
4571
4572 continue;
4573 }
4574
4575 const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop
4576
4577 if (userScrollsDown && entryIsLowerThanPrevious) {
4578 activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
4579
4580 if (!parentScrollTop) {
4581 return;
4582 }
4583
4584 continue;
4585 } // if we are scrolling up, pick the smallest offsetTop
4586
4587
4588 if (!userScrollsDown && !entryIsLowerThanPrevious) {
4589 activate(entry);
4590 }
4591 }
4592 }
4593
4594 _initializeTargetsAndObservables() {
4595 this._targetLinks = new Map();
4596 this._observableSections = new Map();
4597 const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
4598
4599 for (const anchor of targetLinks) {
4600 // ensure that the anchor has an id and is not disabled
4601 if (!anchor.hash || isDisabled(anchor)) {
4602 continue;
4603 }
4604
4605 const observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible
4606
4607 if (isVisible(observableSection)) {
4608 this._targetLinks.set(anchor.hash, anchor);
4609
4610 this._observableSections.set(anchor.hash, observableSection);
4611 }
4612 }
4613 }
4614
4615 _process(target) {
4616 if (this._activeTarget === target) {
4617 return;
4618 }
4619
4620 this._clearActiveClass(this._config.target);
4621
4622 this._activeTarget = target;
4623 target.classList.add(CLASS_NAME_ACTIVE$1);
4624
4625 this._activateParents(target);
4626
4627 EventHandler.trigger(this._element, EVENT_ACTIVATE, {
4628 relatedTarget: target
4629 });
4630 }
4631
4632 _activateParents(target) {
4633 // Activate dropdown parents
4634 if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
4635 SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
4636 return;
4637 }
4638
4639 for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
4640 // Set triggered links parents as active
4641 // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
4642 for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
4643 item.classList.add(CLASS_NAME_ACTIVE$1);
4644 }
4645 }
4646 }
4647
4648 _clearActiveClass(parent) {
4649 parent.classList.remove(CLASS_NAME_ACTIVE$1);
4650 const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
4651
4652 for (const node of activeNodes) {
4653 node.classList.remove(CLASS_NAME_ACTIVE$1);
4654 }
4655 } // Static
4656
4657
4658 static jQueryInterface(config) {
4659 return this.each(function () {
4660 const data = ScrollSpy.getOrCreateInstance(this, config);
4661
4662 if (typeof config !== 'string') {
4663 return;
4664 }
4665
4666 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
4667 throw new TypeError(`No method named "${config}"`);
4668 }
4669
4670 data[config]();
4671 });
4672 }
4673
4674 }
4675 /**
4676 * Data API implementation
4677 */
4678
4679
4680 EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
4681 for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
4682 ScrollSpy.getOrCreateInstance(spy);
4683 }
4684 });
4685 /**
4686 * jQuery
4687 */
4688
4689 defineJQueryPlugin(ScrollSpy);
4690
4691 /**
4692 * --------------------------------------------------------------------------
4693 * Bootstrap (v5.2.3): tab.js
4694 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4695 * --------------------------------------------------------------------------
4696 */
4697 /**
4698 * Constants
4699 */
4700
4701 const NAME$1 = 'tab';
4702 const DATA_KEY$1 = 'bs.tab';
4703 const EVENT_KEY$1 = `.${DATA_KEY$1}`;
4704 const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
4705 const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
4706 const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
4707 const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
4708 const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
4709 const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
4710 const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
4711 const ARROW_LEFT_KEY = 'ArrowLeft';
4712 const ARROW_RIGHT_KEY = 'ArrowRight';
4713 const ARROW_UP_KEY = 'ArrowUp';
4714 const ARROW_DOWN_KEY = 'ArrowDown';
4715 const CLASS_NAME_ACTIVE = 'active';
4716 const CLASS_NAME_FADE$1 = 'fade';
4717 const CLASS_NAME_SHOW$1 = 'show';
4718 const CLASS_DROPDOWN = 'dropdown';
4719 const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
4720 const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
4721 const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)';
4722 const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
4723 const SELECTOR_OUTER = '.nav-item, .list-group-item';
4724 const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
4725 const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // todo:v6: could be only `tab`
4726
4727 const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
4728 const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
4729 /**
4730 * Class definition
4731 */
4732
4733 class Tab extends BaseComponent {
4734 constructor(element) {
4735 super(element);
4736 this._parent = this._element.closest(SELECTOR_TAB_PANEL);
4737
4738 if (!this._parent) {
4739 return; // todo: should Throw exception on v6
4740 // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
4741 } // Set up initial aria attributes
4742
4743
4744 this._setInitialAttributes(this._parent, this._getChildren());
4745
4746 EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
4747 } // Getters
4748
4749
4750 static get NAME() {
4751 return NAME$1;
4752 } // Public
4753
4754
4755 show() {
4756 // Shows this elem and deactivate the active sibling if exists
4757 const innerElem = this._element;
4758
4759 if (this._elemIsActive(innerElem)) {
4760 return;
4761 } // Search for active tab on same parent to deactivate it
4762
4763
4764 const active = this._getActiveElem();
4765
4766 const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
4767 relatedTarget: innerElem
4768 }) : null;
4769 const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
4770 relatedTarget: active
4771 });
4772
4773 if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
4774 return;
4775 }
4776
4777 this._deactivate(active, innerElem);
4778
4779 this._activate(innerElem, active);
4780 } // Private
4781
4782
4783 _activate(element, relatedElem) {
4784 if (!element) {
4785 return;
4786 }
4787
4788 element.classList.add(CLASS_NAME_ACTIVE);
4789
4790 this._activate(getElementFromSelector(element)); // Search and activate/show the proper section
4791
4792
4793 const complete = () => {
4794 if (element.getAttribute('role') !== 'tab') {
4795 element.classList.add(CLASS_NAME_SHOW$1);
4796 return;
4797 }
4798
4799 element.removeAttribute('tabindex');
4800 element.setAttribute('aria-selected', true);
4801
4802 this._toggleDropDown(element, true);
4803
4804 EventHandler.trigger(element, EVENT_SHOWN$1, {
4805 relatedTarget: relatedElem
4806 });
4807 };
4808
4809 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
4810 }
4811
4812 _deactivate(element, relatedElem) {
4813 if (!element) {
4814 return;
4815 }
4816
4817 element.classList.remove(CLASS_NAME_ACTIVE);
4818 element.blur();
4819
4820 this._deactivate(getElementFromSelector(element)); // Search and deactivate the shown section too
4821
4822
4823 const complete = () => {
4824 if (element.getAttribute('role') !== 'tab') {
4825 element.classList.remove(CLASS_NAME_SHOW$1);
4826 return;
4827 }
4828
4829 element.setAttribute('aria-selected', false);
4830 element.setAttribute('tabindex', '-1');
4831
4832 this._toggleDropDown(element, false);
4833
4834 EventHandler.trigger(element, EVENT_HIDDEN$1, {
4835 relatedTarget: relatedElem
4836 });
4837 };
4838
4839 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
4840 }
4841
4842 _keydown(event) {
4843 if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) {
4844 return;
4845 }
4846
4847 event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
4848
4849 event.preventDefault();
4850 const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
4851 const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true);
4852
4853 if (nextActiveElement) {
4854 nextActiveElement.focus({
4855 preventScroll: true
4856 });
4857 Tab.getOrCreateInstance(nextActiveElement).show();
4858 }
4859 }
4860
4861 _getChildren() {
4862 // collection of inner elements
4863 return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
4864 }
4865
4866 _getActiveElem() {
4867 return this._getChildren().find(child => this._elemIsActive(child)) || null;
4868 }
4869
4870 _setInitialAttributes(parent, children) {
4871 this._setAttributeIfNotExists(parent, 'role', 'tablist');
4872
4873 for (const child of children) {
4874 this._setInitialAttributesOnChild(child);
4875 }
4876 }
4877
4878 _setInitialAttributesOnChild(child) {
4879 child = this._getInnerElement(child);
4880
4881 const isActive = this._elemIsActive(child);
4882
4883 const outerElem = this._getOuterElement(child);
4884
4885 child.setAttribute('aria-selected', isActive);
4886
4887 if (outerElem !== child) {
4888 this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
4889 }
4890
4891 if (!isActive) {
4892 child.setAttribute('tabindex', '-1');
4893 }
4894
4895 this._setAttributeIfNotExists(child, 'role', 'tab'); // set attributes to the related panel too
4896
4897
4898 this._setInitialAttributesOnTargetPanel(child);
4899 }
4900
4901 _setInitialAttributesOnTargetPanel(child) {
4902 const target = getElementFromSelector(child);
4903
4904 if (!target) {
4905 return;
4906 }
4907
4908 this._setAttributeIfNotExists(target, 'role', 'tabpanel');
4909
4910 if (child.id) {
4911 this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`);
4912 }
4913 }
4914
4915 _toggleDropDown(element, open) {
4916 const outerElem = this._getOuterElement(element);
4917
4918 if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
4919 return;
4920 }
4921
4922 const toggle = (selector, className) => {
4923 const element = SelectorEngine.findOne(selector, outerElem);
4924
4925 if (element) {
4926 element.classList.toggle(className, open);
4927 }
4928 };
4929
4930 toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
4931 toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
4932 outerElem.setAttribute('aria-expanded', open);
4933 }
4934
4935 _setAttributeIfNotExists(element, attribute, value) {
4936 if (!element.hasAttribute(attribute)) {
4937 element.setAttribute(attribute, value);
4938 }
4939 }
4940
4941 _elemIsActive(elem) {
4942 return elem.classList.contains(CLASS_NAME_ACTIVE);
4943 } // Try to get the inner element (usually the .nav-link)
4944
4945
4946 _getInnerElement(elem) {
4947 return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
4948 } // Try to get the outer element (usually the .nav-item)
4949
4950
4951 _getOuterElement(elem) {
4952 return elem.closest(SELECTOR_OUTER) || elem;
4953 } // Static
4954
4955
4956 static jQueryInterface(config) {
4957 return this.each(function () {
4958 const data = Tab.getOrCreateInstance(this);
4959
4960 if (typeof config !== 'string') {
4961 return;
4962 }
4963
4964 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
4965 throw new TypeError(`No method named "${config}"`);
4966 }
4967
4968 data[config]();
4969 });
4970 }
4971
4972 }
4973 /**
4974 * Data API implementation
4975 */
4976
4977
4978 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
4979 if (['A', 'AREA'].includes(this.tagName)) {
4980 event.preventDefault();
4981 }
4982
4983 if (isDisabled(this)) {
4984 return;
4985 }
4986
4987 Tab.getOrCreateInstance(this).show();
4988 });
4989 /**
4990 * Initialize on focus
4991 */
4992
4993 EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
4994 for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
4995 Tab.getOrCreateInstance(element);
4996 }
4997 });
4998 /**
4999 * jQuery
5000 */
5001
5002 defineJQueryPlugin(Tab);
5003
5004 /**
5005 * --------------------------------------------------------------------------
5006 * Bootstrap (v5.2.3): toast.js
5007 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5008 * --------------------------------------------------------------------------
5009 */
5010 /**
5011 * Constants
5012 */
5013
5014 const NAME = 'toast';
5015 const DATA_KEY = 'bs.toast';
5016 const EVENT_KEY = `.${DATA_KEY}`;
5017 const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
5018 const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
5019 const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
5020 const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
5021 const EVENT_HIDE = `hide${EVENT_KEY}`;
5022 const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
5023 const EVENT_SHOW = `show${EVENT_KEY}`;
5024 const EVENT_SHOWN = `shown${EVENT_KEY}`;
5025 const CLASS_NAME_FADE = 'fade';
5026 const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
5027
5028 const CLASS_NAME_SHOW = 'show';
5029 const CLASS_NAME_SHOWING = 'showing';
5030 const DefaultType = {
5031 animation: 'boolean',
5032 autohide: 'boolean',
5033 delay: 'number'
5034 };
5035 const Default = {
5036 animation: true,
5037 autohide: true,
5038 delay: 5000
5039 };
5040 /**
5041 * Class definition
5042 */
5043
5044 class Toast extends BaseComponent {
5045 constructor(element, config) {
5046 super(element, config);
5047 this._timeout = null;
5048 this._hasMouseInteraction = false;
5049 this._hasKeyboardInteraction = false;
5050
5051 this._setListeners();
5052 } // Getters
5053
5054
5055 static get Default() {
5056 return Default;
5057 }
5058
5059 static get DefaultType() {
5060 return DefaultType;
5061 }
5062
5063 static get NAME() {
5064 return NAME;
5065 } // Public
5066
5067
5068 show() {
5069 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
5070
5071 if (showEvent.defaultPrevented) {
5072 return;
5073 }
5074
5075 this._clearTimeout();
5076
5077 if (this._config.animation) {
5078 this._element.classList.add(CLASS_NAME_FADE);
5079 }
5080
5081 const complete = () => {
5082 this._element.classList.remove(CLASS_NAME_SHOWING);
5083
5084 EventHandler.trigger(this._element, EVENT_SHOWN);
5085
5086 this._maybeScheduleHide();
5087 };
5088
5089 this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
5090
5091
5092 reflow(this._element);
5093
5094 this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
5095
5096 this._queueCallback(complete, this._element, this._config.animation);
5097 }
5098
5099 hide() {
5100 if (!this.isShown()) {
5101 return;
5102 }
5103
5104 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
5105
5106 if (hideEvent.defaultPrevented) {
5107 return;
5108 }
5109
5110 const complete = () => {
5111 this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
5112
5113
5114 this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
5115
5116 EventHandler.trigger(this._element, EVENT_HIDDEN);
5117 };
5118
5119 this._element.classList.add(CLASS_NAME_SHOWING);
5120
5121 this._queueCallback(complete, this._element, this._config.animation);
5122 }
5123
5124 dispose() {
5125 this._clearTimeout();
5126
5127 if (this.isShown()) {
5128 this._element.classList.remove(CLASS_NAME_SHOW);
5129 }
5130
5131 super.dispose();
5132 }
5133
5134 isShown() {
5135 return this._element.classList.contains(CLASS_NAME_SHOW);
5136 } // Private
5137
5138
5139 _maybeScheduleHide() {
5140 if (!this._config.autohide) {
5141 return;
5142 }
5143
5144 if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
5145 return;
5146 }
5147
5148 this._timeout = setTimeout(() => {
5149 this.hide();
5150 }, this._config.delay);
5151 }
5152
5153 _onInteraction(event, isInteracting) {
5154 switch (event.type) {
5155 case 'mouseover':
5156 case 'mouseout':
5157 {
5158 this._hasMouseInteraction = isInteracting;
5159 break;
5160 }
5161
5162 case 'focusin':
5163 case 'focusout':
5164 {
5165 this._hasKeyboardInteraction = isInteracting;
5166 break;
5167 }
5168 }
5169
5170 if (isInteracting) {
5171 this._clearTimeout();
5172
5173 return;
5174 }
5175
5176 const nextElement = event.relatedTarget;
5177
5178 if (this._element === nextElement || this._element.contains(nextElement)) {
5179 return;
5180 }
5181
5182 this._maybeScheduleHide();
5183 }
5184
5185 _setListeners() {
5186 EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
5187 EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
5188 EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
5189 EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
5190 }
5191
5192 _clearTimeout() {
5193 clearTimeout(this._timeout);
5194 this._timeout = null;
5195 } // Static
5196
5197
5198 static jQueryInterface(config) {
5199 return this.each(function () {
5200 const data = Toast.getOrCreateInstance(this, config);
5201
5202 if (typeof config === 'string') {
5203 if (typeof data[config] === 'undefined') {
5204 throw new TypeError(`No method named "${config}"`);
5205 }
5206
5207 data[config](this);
5208 }
5209 });
5210 }
5211
5212 }
5213 /**
5214 * Data API implementation
5215 */
5216
5217
5218 enableDismissTrigger(Toast);
5219 /**
5220 * jQuery
5221 */
5222
5223 defineJQueryPlugin(Toast);
5224
5225 /**
5226 * --------------------------------------------------------------------------
5227 * Bootstrap (v5.2.3): index.umd.js
5228 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5229 * --------------------------------------------------------------------------
5230 */
5231 const index_umd = {
5232 Alert,
5233 Button,
5234 Carousel,
5235 Collapse,
5236 Dropdown,
5237 Modal,
5238 Offcanvas,
5239 Popover,
5240 ScrollSpy,
5241 Tab,
5242 Toast,
5243 Tooltip
5244 };
5245
5246 return index_umd;
5247
5248 }));
5249 //# sourceMappingURL=bootstrap.js.map
5250