PluginProbe
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services / 8.5.4
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services v8.5.4
8.7.6 8.7.5 8.7.4 8.7.3 8.7.2 8.7.1 8.7.0 8.6.9 8.6.8 8.6.7 8.6.6 8.6.5 8.6.4 8.6.2 8.6.1 8.6.0 8.5.9 8.5.8 8.5.7 8.5.6 8.5.5 8.5.4 8.5.3 8.5.2 8.5.0 All 532 releases
chatbot / inc / bootstrap.js

bootstrap.js in WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services 8.5.4, at inc/bootstrap.js

5,264 lines 157.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*!
2 * Bootstrap v5.2.1 (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.1): 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.1): 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.1): 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.1): 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.1): 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.1): 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.1';
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.1): 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.1): 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.1): 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.1): 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.1): 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.1): 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.1): 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.1): 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];
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];
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.1): 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.1): 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.1): 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.1): 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 EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
3012 // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
3013 if (this._dialog.contains(event.target) || this._dialog.contains(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.1): 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.1): 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.1): 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.1): 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 } // Getters
3811
3812
3813 static get Default() {
3814 return Default$3;
3815 }
3816
3817 static get DefaultType() {
3818 return DefaultType$3;
3819 }
3820
3821 static get NAME() {
3822 return NAME$4;
3823 } // Public
3824
3825
3826 enable() {
3827 this._isEnabled = true;
3828 }
3829
3830 disable() {
3831 this._isEnabled = false;
3832 }
3833
3834 toggleEnabled() {
3835 this._isEnabled = !this._isEnabled;
3836 }
3837
3838 toggle(event) {
3839 if (!this._isEnabled) {
3840 return;
3841 }
3842
3843 if (event) {
3844 const context = this._initializeOnDelegatedTarget(event);
3845
3846 context._activeTrigger.click = !context._activeTrigger.click;
3847
3848 if (context._isWithActiveTrigger()) {
3849 context._enter();
3850 } else {
3851 context._leave();
3852 }
3853
3854 return;
3855 }
3856
3857 if (this._isShown()) {
3858 this._leave();
3859
3860 return;
3861 }
3862
3863 this._enter();
3864 }
3865
3866 dispose() {
3867 clearTimeout(this._timeout);
3868 EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3869
3870 if (this.tip) {
3871 this.tip.remove();
3872 }
3873
3874 if (this._config.originalTitle) {
3875 this._element.setAttribute('title', this._config.originalTitle);
3876 }
3877
3878 this._disposePopper();
3879
3880 super.dispose();
3881 }
3882
3883 show() {
3884 if (this._element.style.display === 'none') {
3885 throw new Error('Please use show on visible elements');
3886 }
3887
3888 if (!(this._isWithContent() && this._isEnabled)) {
3889 return;
3890 }
3891
3892 const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
3893 const shadowRoot = findShadowRoot(this._element);
3894
3895 const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
3896
3897 if (showEvent.defaultPrevented || !isInTheDom) {
3898 return;
3899 } // todo v6 remove this OR make it optional
3900
3901
3902 if (this.tip) {
3903 this.tip.remove();
3904 this.tip = null;
3905 }
3906
3907 const tip = this._getTipElement();
3908
3909 this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
3910
3911 const {
3912 container
3913 } = this._config;
3914
3915 if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
3916 container.append(tip);
3917 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
3918 }
3919
3920 if (this._popper) {
3921 this._popper.update();
3922 } else {
3923 this._popper = this._createPopper(tip);
3924 }
3925
3926 tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra
3927 // empty mouseover listeners to the body's immediate children;
3928 // only needed because of broken event delegation on iOS
3929 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
3930
3931 if ('ontouchstart' in document.documentElement) {
3932 for (const element of [].concat(...document.body.children)) {
3933 EventHandler.on(element, 'mouseover', noop);
3934 }
3935 }
3936
3937 const complete = () => {
3938 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
3939
3940 if (this._isHovered === false) {
3941 this._leave();
3942 }
3943
3944 this._isHovered = false;
3945 };
3946
3947 this._queueCallback(complete, this.tip, this._isAnimated());
3948 }
3949
3950 hide() {
3951 if (!this._isShown()) {
3952 return;
3953 }
3954
3955 const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
3956
3957 if (hideEvent.defaultPrevented) {
3958 return;
3959 }
3960
3961 const tip = this._getTipElement();
3962
3963 tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
3964 // empty mouseover listeners we added for iOS support
3965
3966 if ('ontouchstart' in document.documentElement) {
3967 for (const element of [].concat(...document.body.children)) {
3968 EventHandler.off(element, 'mouseover', noop);
3969 }
3970 }
3971
3972 this._activeTrigger[TRIGGER_CLICK] = false;
3973 this._activeTrigger[TRIGGER_FOCUS] = false;
3974 this._activeTrigger[TRIGGER_HOVER] = false;
3975 this._isHovered = null; // it is a trick to support manual triggering
3976
3977 const complete = () => {
3978 if (this._isWithActiveTrigger()) {
3979 return;
3980 }
3981
3982 if (!this._isHovered) {
3983 tip.remove();
3984 }
3985
3986 this._element.removeAttribute('aria-describedby');
3987
3988 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
3989
3990 this._disposePopper();
3991 };
3992
3993 this._queueCallback(complete, this.tip, this._isAnimated());
3994 }
3995
3996 update() {
3997 if (this._popper) {
3998 this._popper.update();
3999 }
4000 } // Protected
4001
4002
4003 _isWithContent() {
4004 return Boolean(this._getTitle());
4005 }
4006
4007 _getTipElement() {
4008 if (!this.tip) {
4009 this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
4010 }
4011
4012 return this.tip;
4013 }
4014
4015 _createTipElement(content) {
4016 const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6
4017
4018
4019 if (!tip) {
4020 return null;
4021 }
4022
4023 tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only
4024
4025 tip.classList.add(`bs-${this.constructor.NAME}-auto`);
4026 const tipId = getUID(this.constructor.NAME).toString();
4027 tip.setAttribute('id', tipId);
4028
4029 if (this._isAnimated()) {
4030 tip.classList.add(CLASS_NAME_FADE$2);
4031 }
4032
4033 return tip;
4034 }
4035
4036 setContent(content) {
4037 this._newContent = content;
4038
4039 if (this._isShown()) {
4040 this._disposePopper();
4041
4042 this.show();
4043 }
4044 }
4045
4046 _getTemplateFactory(content) {
4047 if (this._templateFactory) {
4048 this._templateFactory.changeContent(content);
4049 } else {
4050 this._templateFactory = new TemplateFactory({ ...this._config,
4051 // the `content` var has to be after `this._config`
4052 // to override config.content in case of popover
4053 content,
4054 extraClass: this._resolvePossibleFunction(this._config.customClass)
4055 });
4056 }
4057
4058 return this._templateFactory;
4059 }
4060
4061 _getContentForTemplate() {
4062 return {
4063 [SELECTOR_TOOLTIP_INNER]: this._getTitle()
4064 };
4065 }
4066
4067 _getTitle() {
4068 return this._resolvePossibleFunction(this._config.title) || this._config.originalTitle;
4069 } // Private
4070
4071
4072 _initializeOnDelegatedTarget(event) {
4073 return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
4074 }
4075
4076 _isAnimated() {
4077 return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
4078 }
4079
4080 _isShown() {
4081 return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
4082 }
4083
4084 _createPopper(tip) {
4085 const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
4086 const attachment = AttachmentMap[placement.toUpperCase()];
4087 return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
4088 }
4089
4090 _getOffset() {
4091 const {
4092 offset
4093 } = this._config;
4094
4095 if (typeof offset === 'string') {
4096 return offset.split(',').map(value => Number.parseInt(value, 10));
4097 }
4098
4099 if (typeof offset === 'function') {
4100 return popperData => offset(popperData, this._element);
4101 }
4102
4103 return offset;
4104 }
4105
4106 _resolvePossibleFunction(arg) {
4107 return typeof arg === 'function' ? arg.call(this._element) : arg;
4108 }
4109
4110 _getPopperConfig(attachment) {
4111 const defaultBsPopperConfig = {
4112 placement: attachment,
4113 modifiers: [{
4114 name: 'flip',
4115 options: {
4116 fallbackPlacements: this._config.fallbackPlacements
4117 }
4118 }, {
4119 name: 'offset',
4120 options: {
4121 offset: this._getOffset()
4122 }
4123 }, {
4124 name: 'preventOverflow',
4125 options: {
4126 boundary: this._config.boundary
4127 }
4128 }, {
4129 name: 'arrow',
4130 options: {
4131 element: `.${this.constructor.NAME}-arrow`
4132 }
4133 }, {
4134 name: 'preSetPlacement',
4135 enabled: true,
4136 phase: 'beforeMain',
4137 fn: data => {
4138 // Pre-set Popper's placement attribute in order to read the arrow sizes properly.
4139 // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement
4140 this._getTipElement().setAttribute('data-popper-placement', data.state.placement);
4141 }
4142 }]
4143 };
4144 return { ...defaultBsPopperConfig,
4145 ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
4146 };
4147 }
4148
4149 _setListeners() {
4150 const triggers = this._config.trigger.split(' ');
4151
4152 for (const trigger of triggers) {
4153 if (trigger === 'click') {
4154 EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => this.toggle(event));
4155 } else if (trigger !== TRIGGER_MANUAL) {
4156 const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
4157 const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
4158 EventHandler.on(this._element, eventIn, this._config.selector, event => {
4159 const context = this._initializeOnDelegatedTarget(event);
4160
4161 context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
4162
4163 context._enter();
4164 });
4165 EventHandler.on(this._element, eventOut, this._config.selector, event => {
4166 const context = this._initializeOnDelegatedTarget(event);
4167
4168 context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
4169
4170 context._leave();
4171 });
4172 }
4173 }
4174
4175 this._hideModalHandler = () => {
4176 if (this._element) {
4177 this.hide();
4178 }
4179 };
4180
4181 EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
4182
4183 if (this._config.selector) {
4184 this._config = { ...this._config,
4185 trigger: 'manual',
4186 selector: ''
4187 };
4188 } else {
4189 this._fixTitle();
4190 }
4191 }
4192
4193 _fixTitle() {
4194 const title = this._config.originalTitle;
4195
4196 if (!title) {
4197 return;
4198 }
4199
4200 if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
4201 this._element.setAttribute('aria-label', title);
4202 }
4203
4204 this._element.removeAttribute('title');
4205 }
4206
4207 _enter() {
4208 if (this._isShown() || this._isHovered) {
4209 this._isHovered = true;
4210 return;
4211 }
4212
4213 this._isHovered = true;
4214
4215 this._setTimeout(() => {
4216 if (this._isHovered) {
4217 this.show();
4218 }
4219 }, this._config.delay.show);
4220 }
4221
4222 _leave() {
4223 if (this._isWithActiveTrigger()) {
4224 return;
4225 }
4226
4227 this._isHovered = false;
4228
4229 this._setTimeout(() => {
4230 if (!this._isHovered) {
4231 this.hide();
4232 }
4233 }, this._config.delay.hide);
4234 }
4235
4236 _setTimeout(handler, timeout) {
4237 clearTimeout(this._timeout);
4238 this._timeout = setTimeout(handler, timeout);
4239 }
4240
4241 _isWithActiveTrigger() {
4242 return Object.values(this._activeTrigger).includes(true);
4243 }
4244
4245 _getConfig(config) {
4246 const dataAttributes = Manipulator.getDataAttributes(this._element);
4247
4248 for (const dataAttribute of Object.keys(dataAttributes)) {
4249 if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
4250 delete dataAttributes[dataAttribute];
4251 }
4252 }
4253
4254 config = { ...dataAttributes,
4255 ...(typeof config === 'object' && config ? config : {})
4256 };
4257 config = this._mergeConfigObj(config);
4258 config = this._configAfterMerge(config);
4259
4260 this._typeCheckConfig(config);
4261
4262 return config;
4263 }
4264
4265 _configAfterMerge(config) {
4266 config.container = config.container === false ? document.body : getElement(config.container);
4267
4268 if (typeof config.delay === 'number') {
4269 config.delay = {
4270 show: config.delay,
4271 hide: config.delay
4272 };
4273 }
4274
4275 config.originalTitle = this._element.getAttribute('title') || '';
4276
4277 if (typeof config.title === 'number') {
4278 config.title = config.title.toString();
4279 }
4280
4281 if (typeof config.content === 'number') {
4282 config.content = config.content.toString();
4283 }
4284
4285 return config;
4286 }
4287
4288 _getDelegateConfig() {
4289 const config = {};
4290
4291 for (const key in this._config) {
4292 if (this.constructor.Default[key] !== this._config[key]) {
4293 config[key] = this._config[key];
4294 }
4295 } // In the future can be replaced with:
4296 // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
4297 // `Object.fromEntries(keysWithDifferentValues)`
4298
4299
4300 return config;
4301 }
4302
4303 _disposePopper() {
4304 if (this._popper) {
4305 this._popper.destroy();
4306
4307 this._popper = null;
4308 }
4309 } // Static
4310
4311
4312 static jQueryInterface(config) {
4313 return this.each(function () {
4314 const data = Tooltip.getOrCreateInstance(this, config);
4315
4316 if (typeof config !== 'string') {
4317 return;
4318 }
4319
4320 if (typeof data[config] === 'undefined') {
4321 throw new TypeError(`No method named "${config}"`);
4322 }
4323
4324 data[config]();
4325 });
4326 }
4327
4328 }
4329 /**
4330 * jQuery
4331 */
4332
4333
4334 defineJQueryPlugin(Tooltip);
4335
4336 /**
4337 * --------------------------------------------------------------------------
4338 * Bootstrap (v5.2.1): popover.js
4339 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4340 * --------------------------------------------------------------------------
4341 */
4342 /**
4343 * Constants
4344 */
4345
4346 const NAME$3 = 'popover';
4347 const SELECTOR_TITLE = '.popover-header';
4348 const SELECTOR_CONTENT = '.popover-body';
4349 const Default$2 = { ...Tooltip.Default,
4350 content: '',
4351 offset: [0, 8],
4352 placement: 'right',
4353 template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>',
4354 trigger: 'click'
4355 };
4356 const DefaultType$2 = { ...Tooltip.DefaultType,
4357 content: '(null|string|element|function)'
4358 };
4359 /**
4360 * Class definition
4361 */
4362
4363 class Popover extends Tooltip {
4364 // Getters
4365 static get Default() {
4366 return Default$2;
4367 }
4368
4369 static get DefaultType() {
4370 return DefaultType$2;
4371 }
4372
4373 static get NAME() {
4374 return NAME$3;
4375 } // Overrides
4376
4377
4378 _isWithContent() {
4379 return this._getTitle() || this._getContent();
4380 } // Private
4381
4382
4383 _getContentForTemplate() {
4384 return {
4385 [SELECTOR_TITLE]: this._getTitle(),
4386 [SELECTOR_CONTENT]: this._getContent()
4387 };
4388 }
4389
4390 _getContent() {
4391 return this._resolvePossibleFunction(this._config.content);
4392 } // Static
4393
4394
4395 static jQueryInterface(config) {
4396 return this.each(function () {
4397 const data = Popover.getOrCreateInstance(this, config);
4398
4399 if (typeof config !== 'string') {
4400 return;
4401 }
4402
4403 if (typeof data[config] === 'undefined') {
4404 throw new TypeError(`No method named "${config}"`);
4405 }
4406
4407 data[config]();
4408 });
4409 }
4410
4411 }
4412 /**
4413 * jQuery
4414 */
4415
4416
4417 defineJQueryPlugin(Popover);
4418
4419 /**
4420 * --------------------------------------------------------------------------
4421 * Bootstrap (v5.2.1): scrollspy.js
4422 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4423 * --------------------------------------------------------------------------
4424 */
4425 /**
4426 * Constants
4427 */
4428
4429 const NAME$2 = 'scrollspy';
4430 const DATA_KEY$2 = 'bs.scrollspy';
4431 const EVENT_KEY$2 = `.${DATA_KEY$2}`;
4432 const DATA_API_KEY = '.data-api';
4433 const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
4434 const EVENT_CLICK = `click${EVENT_KEY$2}`;
4435 const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
4436 const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
4437 const CLASS_NAME_ACTIVE$1 = 'active';
4438 const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
4439 const SELECTOR_TARGET_LINKS = '[href]';
4440 const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
4441 const SELECTOR_NAV_LINKS = '.nav-link';
4442 const SELECTOR_NAV_ITEMS = '.nav-item';
4443 const SELECTOR_LIST_ITEMS = '.list-group-item';
4444 const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
4445 const SELECTOR_DROPDOWN = '.dropdown';
4446 const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
4447 const Default$1 = {
4448 offset: null,
4449 // TODO: v6 @deprecated, keep it for backwards compatibility reasons
4450 rootMargin: '0px 0px -25%',
4451 smoothScroll: false,
4452 target: null,
4453 threshold: [0.1, 0.5, 1]
4454 };
4455 const DefaultType$1 = {
4456 offset: '(number|null)',
4457 // TODO v6 @deprecated, keep it for backwards compatibility reasons
4458 rootMargin: 'string',
4459 smoothScroll: 'boolean',
4460 target: 'element',
4461 threshold: 'array'
4462 };
4463 /**
4464 * Class definition
4465 */
4466
4467 class ScrollSpy extends BaseComponent {
4468 constructor(element, config) {
4469 super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper
4470
4471 this._targetLinks = new Map();
4472 this._observableSections = new Map();
4473 this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
4474 this._activeTarget = null;
4475 this._observer = null;
4476 this._previousScrollData = {
4477 visibleEntryTop: 0,
4478 parentScrollTop: 0
4479 };
4480 this.refresh(); // initialize
4481 } // Getters
4482
4483
4484 static get Default() {
4485 return Default$1;
4486 }
4487
4488 static get DefaultType() {
4489 return DefaultType$1;
4490 }
4491
4492 static get NAME() {
4493 return NAME$2;
4494 } // Public
4495
4496
4497 refresh() {
4498 this._initializeTargetsAndObservables();
4499
4500 this._maybeEnableSmoothScroll();
4501
4502 if (this._observer) {
4503 this._observer.disconnect();
4504 } else {
4505 this._observer = this._getNewObserver();
4506 }
4507
4508 for (const section of this._observableSections.values()) {
4509 this._observer.observe(section);
4510 }
4511 }
4512
4513 dispose() {
4514 this._observer.disconnect();
4515
4516 super.dispose();
4517 } // Private
4518
4519
4520 _configAfterMerge(config) {
4521 // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
4522 config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
4523
4524 config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
4525
4526 if (typeof config.threshold === 'string') {
4527 config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
4528 }
4529
4530 return config;
4531 }
4532
4533 _maybeEnableSmoothScroll() {
4534 if (!this._config.smoothScroll) {
4535 return;
4536 } // unregister any previous listeners
4537
4538
4539 EventHandler.off(this._config.target, EVENT_CLICK);
4540 EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
4541 const observableSection = this._observableSections.get(event.target.hash);
4542
4543 if (observableSection) {
4544 event.preventDefault();
4545 const root = this._rootElement || window;
4546 const height = observableSection.offsetTop - this._element.offsetTop;
4547
4548 if (root.scrollTo) {
4549 root.scrollTo({
4550 top: height,
4551 behavior: 'smooth'
4552 });
4553 return;
4554 } // Chrome 60 doesn't support `scrollTo`
4555
4556
4557 root.scrollTop = height;
4558 }
4559 });
4560 }
4561
4562 _getNewObserver() {
4563 const options = {
4564 root: this._rootElement,
4565 threshold: this._config.threshold,
4566 rootMargin: this._config.rootMargin
4567 };
4568 return new IntersectionObserver(entries => this._observerCallback(entries), options);
4569 } // The logic of selection
4570
4571
4572 _observerCallback(entries) {
4573 const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
4574
4575 const activate = entry => {
4576 this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
4577
4578 this._process(targetElement(entry));
4579 };
4580
4581 const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
4582 const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
4583 this._previousScrollData.parentScrollTop = parentScrollTop;
4584
4585 for (const entry of entries) {
4586 if (!entry.isIntersecting) {
4587 this._activeTarget = null;
4588
4589 this._clearActiveClass(targetElement(entry));
4590
4591 continue;
4592 }
4593
4594 const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop
4595
4596 if (userScrollsDown && entryIsLowerThanPrevious) {
4597 activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
4598
4599 if (!parentScrollTop) {
4600 return;
4601 }
4602
4603 continue;
4604 } // if we are scrolling up, pick the smallest offsetTop
4605
4606
4607 if (!userScrollsDown && !entryIsLowerThanPrevious) {
4608 activate(entry);
4609 }
4610 }
4611 }
4612
4613 _initializeTargetsAndObservables() {
4614 this._targetLinks = new Map();
4615 this._observableSections = new Map();
4616 const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
4617
4618 for (const anchor of targetLinks) {
4619 // ensure that the anchor has an id and is not disabled
4620 if (!anchor.hash || isDisabled(anchor)) {
4621 continue;
4622 }
4623
4624 const observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible
4625
4626 if (isVisible(observableSection)) {
4627 this._targetLinks.set(anchor.hash, anchor);
4628
4629 this._observableSections.set(anchor.hash, observableSection);
4630 }
4631 }
4632 }
4633
4634 _process(target) {
4635 if (this._activeTarget === target) {
4636 return;
4637 }
4638
4639 this._clearActiveClass(this._config.target);
4640
4641 this._activeTarget = target;
4642 target.classList.add(CLASS_NAME_ACTIVE$1);
4643
4644 this._activateParents(target);
4645
4646 EventHandler.trigger(this._element, EVENT_ACTIVATE, {
4647 relatedTarget: target
4648 });
4649 }
4650
4651 _activateParents(target) {
4652 // Activate dropdown parents
4653 if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
4654 SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
4655 return;
4656 }
4657
4658 for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
4659 // Set triggered links parents as active
4660 // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
4661 for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
4662 item.classList.add(CLASS_NAME_ACTIVE$1);
4663 }
4664 }
4665 }
4666
4667 _clearActiveClass(parent) {
4668 parent.classList.remove(CLASS_NAME_ACTIVE$1);
4669 const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
4670
4671 for (const node of activeNodes) {
4672 node.classList.remove(CLASS_NAME_ACTIVE$1);
4673 }
4674 } // Static
4675
4676
4677 static jQueryInterface(config) {
4678 return this.each(function () {
4679 const data = ScrollSpy.getOrCreateInstance(this, config);
4680
4681 if (typeof config !== 'string') {
4682 return;
4683 }
4684
4685 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
4686 throw new TypeError(`No method named "${config}"`);
4687 }
4688
4689 data[config]();
4690 });
4691 }
4692
4693 }
4694 /**
4695 * Data API implementation
4696 */
4697
4698
4699 EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
4700 for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
4701 ScrollSpy.getOrCreateInstance(spy);
4702 }
4703 });
4704 /**
4705 * jQuery
4706 */
4707
4708 defineJQueryPlugin(ScrollSpy);
4709
4710 /**
4711 * --------------------------------------------------------------------------
4712 * Bootstrap (v5.2.1): tab.js
4713 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4714 * --------------------------------------------------------------------------
4715 */
4716 /**
4717 * Constants
4718 */
4719
4720 const NAME$1 = 'tab';
4721 const DATA_KEY$1 = 'bs.tab';
4722 const EVENT_KEY$1 = `.${DATA_KEY$1}`;
4723 const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
4724 const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
4725 const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
4726 const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
4727 const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
4728 const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
4729 const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
4730 const ARROW_LEFT_KEY = 'ArrowLeft';
4731 const ARROW_RIGHT_KEY = 'ArrowRight';
4732 const ARROW_UP_KEY = 'ArrowUp';
4733 const ARROW_DOWN_KEY = 'ArrowDown';
4734 const CLASS_NAME_ACTIVE = 'active';
4735 const CLASS_NAME_FADE$1 = 'fade';
4736 const CLASS_NAME_SHOW$1 = 'show';
4737 const CLASS_DROPDOWN = 'dropdown';
4738 const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
4739 const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
4740 const SELECTOR_DROPDOWN_ITEM = '.dropdown-item';
4741 const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)';
4742 const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
4743 const SELECTOR_OUTER = '.nav-item, .list-group-item';
4744 const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
4745 const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // todo:v6: could be only `tab`
4746
4747 const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
4748 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"]`;
4749 /**
4750 * Class definition
4751 */
4752
4753 class Tab extends BaseComponent {
4754 constructor(element) {
4755 super(element);
4756 this._parent = this._element.closest(SELECTOR_TAB_PANEL);
4757
4758 if (!this._parent) {
4759 return; // todo: should Throw exception on v6
4760 // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
4761 } // Set up initial aria attributes
4762
4763
4764 this._setInitialAttributes(this._parent, this._getChildren());
4765
4766 EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
4767 } // Getters
4768
4769
4770 static get NAME() {
4771 return NAME$1;
4772 } // Public
4773
4774
4775 show() {
4776 // Shows this elem and deactivate the active sibling if exists
4777 const innerElem = this._element;
4778
4779 if (this._elemIsActive(innerElem)) {
4780 return;
4781 } // Search for active tab on same parent to deactivate it
4782
4783
4784 const active = this._getActiveElem();
4785
4786 const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
4787 relatedTarget: innerElem
4788 }) : null;
4789 const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
4790 relatedTarget: active
4791 });
4792
4793 if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
4794 return;
4795 }
4796
4797 this._deactivate(active, innerElem);
4798
4799 this._activate(innerElem, active);
4800 } // Private
4801
4802
4803 _activate(element, relatedElem) {
4804 if (!element) {
4805 return;
4806 }
4807
4808 element.classList.add(CLASS_NAME_ACTIVE);
4809
4810 this._activate(getElementFromSelector(element)); // Search and activate/show the proper section
4811
4812
4813 const complete = () => {
4814 if (element.getAttribute('role') !== 'tab') {
4815 element.classList.add(CLASS_NAME_SHOW$1);
4816 return;
4817 }
4818
4819 element.focus();
4820 element.removeAttribute('tabindex');
4821 element.setAttribute('aria-selected', true);
4822
4823 this._toggleDropDown(element, true);
4824
4825 EventHandler.trigger(element, EVENT_SHOWN$1, {
4826 relatedTarget: relatedElem
4827 });
4828 };
4829
4830 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
4831 }
4832
4833 _deactivate(element, relatedElem) {
4834 if (!element) {
4835 return;
4836 }
4837
4838 element.classList.remove(CLASS_NAME_ACTIVE);
4839 element.blur();
4840
4841 this._deactivate(getElementFromSelector(element)); // Search and deactivate the shown section too
4842
4843
4844 const complete = () => {
4845 if (element.getAttribute('role') !== 'tab') {
4846 element.classList.remove(CLASS_NAME_SHOW$1);
4847 return;
4848 }
4849
4850 element.setAttribute('aria-selected', false);
4851 element.setAttribute('tabindex', '-1');
4852
4853 this._toggleDropDown(element, false);
4854
4855 EventHandler.trigger(element, EVENT_HIDDEN$1, {
4856 relatedTarget: relatedElem
4857 });
4858 };
4859
4860 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
4861 }
4862
4863 _keydown(event) {
4864 if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) {
4865 return;
4866 }
4867
4868 event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
4869
4870 event.preventDefault();
4871 const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
4872 const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true);
4873
4874 if (nextActiveElement) {
4875 Tab.getOrCreateInstance(nextActiveElement).show();
4876 }
4877 }
4878
4879 _getChildren() {
4880 // collection of inner elements
4881 return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
4882 }
4883
4884 _getActiveElem() {
4885 return this._getChildren().find(child => this._elemIsActive(child)) || null;
4886 }
4887
4888 _setInitialAttributes(parent, children) {
4889 this._setAttributeIfNotExists(parent, 'role', 'tablist');
4890
4891 for (const child of children) {
4892 this._setInitialAttributesOnChild(child);
4893 }
4894 }
4895
4896 _setInitialAttributesOnChild(child) {
4897 child = this._getInnerElement(child);
4898
4899 const isActive = this._elemIsActive(child);
4900
4901 const outerElem = this._getOuterElement(child);
4902
4903 child.setAttribute('aria-selected', isActive);
4904
4905 if (outerElem !== child) {
4906 this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
4907 }
4908
4909 if (!isActive) {
4910 child.setAttribute('tabindex', '-1');
4911 }
4912
4913 this._setAttributeIfNotExists(child, 'role', 'tab'); // set attributes to the related panel too
4914
4915
4916 this._setInitialAttributesOnTargetPanel(child);
4917 }
4918
4919 _setInitialAttributesOnTargetPanel(child) {
4920 const target = getElementFromSelector(child);
4921
4922 if (!target) {
4923 return;
4924 }
4925
4926 this._setAttributeIfNotExists(target, 'role', 'tabpanel');
4927
4928 if (child.id) {
4929 this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`);
4930 }
4931 }
4932
4933 _toggleDropDown(element, open) {
4934 const outerElem = this._getOuterElement(element);
4935
4936 if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
4937 return;
4938 }
4939
4940 const toggle = (selector, className) => {
4941 const element = SelectorEngine.findOne(selector, outerElem);
4942
4943 if (element) {
4944 element.classList.toggle(className, open);
4945 }
4946 };
4947
4948 toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
4949 toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
4950 toggle(SELECTOR_DROPDOWN_ITEM, CLASS_NAME_ACTIVE);
4951 outerElem.setAttribute('aria-expanded', open);
4952 }
4953
4954 _setAttributeIfNotExists(element, attribute, value) {
4955 if (!element.hasAttribute(attribute)) {
4956 element.setAttribute(attribute, value);
4957 }
4958 }
4959
4960 _elemIsActive(elem) {
4961 return elem.classList.contains(CLASS_NAME_ACTIVE);
4962 } // Try to get the inner element (usually the .nav-link)
4963
4964
4965 _getInnerElement(elem) {
4966 return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
4967 } // Try to get the outer element (usually the .nav-item)
4968
4969
4970 _getOuterElement(elem) {
4971 return elem.closest(SELECTOR_OUTER) || elem;
4972 } // Static
4973
4974
4975 static jQueryInterface(config) {
4976 return this.each(function () {
4977 const data = Tab.getOrCreateInstance(this);
4978
4979 if (typeof config !== 'string') {
4980 return;
4981 }
4982
4983 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
4984 throw new TypeError(`No method named "${config}"`);
4985 }
4986
4987 data[config]();
4988 });
4989 }
4990
4991 }
4992 /**
4993 * Data API implementation
4994 */
4995
4996
4997 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
4998 if (['A', 'AREA'].includes(this.tagName)) {
4999 event.preventDefault();
5000 }
5001
5002 if (isDisabled(this)) {
5003 return;
5004 }
5005
5006 Tab.getOrCreateInstance(this).show();
5007 });
5008 /**
5009 * Initialize on focus
5010 */
5011
5012 EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
5013 for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
5014 Tab.getOrCreateInstance(element);
5015 }
5016 });
5017 /**
5018 * jQuery
5019 */
5020
5021 defineJQueryPlugin(Tab);
5022
5023 /**
5024 * --------------------------------------------------------------------------
5025 * Bootstrap (v5.2.1): toast.js
5026 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5027 * --------------------------------------------------------------------------
5028 */
5029 /**
5030 * Constants
5031 */
5032
5033 const NAME = 'toast';
5034 const DATA_KEY = 'bs.toast';
5035 const EVENT_KEY = `.${DATA_KEY}`;
5036 const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
5037 const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
5038 const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
5039 const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
5040 const EVENT_HIDE = `hide${EVENT_KEY}`;
5041 const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
5042 const EVENT_SHOW = `show${EVENT_KEY}`;
5043 const EVENT_SHOWN = `shown${EVENT_KEY}`;
5044 const CLASS_NAME_FADE = 'fade';
5045 const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
5046
5047 const CLASS_NAME_SHOW = 'show';
5048 const CLASS_NAME_SHOWING = 'showing';
5049 const DefaultType = {
5050 animation: 'boolean',
5051 autohide: 'boolean',
5052 delay: 'number'
5053 };
5054 const Default = {
5055 animation: true,
5056 autohide: true,
5057 delay: 5000
5058 };
5059 /**
5060 * Class definition
5061 */
5062
5063 class Toast extends BaseComponent {
5064 constructor(element, config) {
5065 super(element, config);
5066 this._timeout = null;
5067 this._hasMouseInteraction = false;
5068 this._hasKeyboardInteraction = false;
5069
5070 this._setListeners();
5071 } // Getters
5072
5073
5074 static get Default() {
5075 return Default;
5076 }
5077
5078 static get DefaultType() {
5079 return DefaultType;
5080 }
5081
5082 static get NAME() {
5083 return NAME;
5084 } // Public
5085
5086
5087 show() {
5088 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
5089
5090 if (showEvent.defaultPrevented) {
5091 return;
5092 }
5093
5094 this._clearTimeout();
5095
5096 if (this._config.animation) {
5097 this._element.classList.add(CLASS_NAME_FADE);
5098 }
5099
5100 const complete = () => {
5101 this._element.classList.remove(CLASS_NAME_SHOWING);
5102
5103 EventHandler.trigger(this._element, EVENT_SHOWN);
5104
5105 this._maybeScheduleHide();
5106 };
5107
5108 this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
5109
5110
5111 reflow(this._element);
5112
5113 this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
5114
5115 this._queueCallback(complete, this._element, this._config.animation);
5116 }
5117
5118 hide() {
5119 if (!this.isShown()) {
5120 return;
5121 }
5122
5123 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
5124
5125 if (hideEvent.defaultPrevented) {
5126 return;
5127 }
5128
5129 const complete = () => {
5130 this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
5131
5132
5133 this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
5134
5135 EventHandler.trigger(this._element, EVENT_HIDDEN);
5136 };
5137
5138 this._element.classList.add(CLASS_NAME_SHOWING);
5139
5140 this._queueCallback(complete, this._element, this._config.animation);
5141 }
5142
5143 dispose() {
5144 this._clearTimeout();
5145
5146 if (this.isShown()) {
5147 this._element.classList.remove(CLASS_NAME_SHOW);
5148 }
5149
5150 super.dispose();
5151 }
5152
5153 isShown() {
5154 return this._element.classList.contains(CLASS_NAME_SHOW);
5155 } // Private
5156
5157
5158 _maybeScheduleHide() {
5159 if (!this._config.autohide) {
5160 return;
5161 }
5162
5163 if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
5164 return;
5165 }
5166
5167 this._timeout = setTimeout(() => {
5168 this.hide();
5169 }, this._config.delay);
5170 }
5171
5172 _onInteraction(event, isInteracting) {
5173 switch (event.type) {
5174 case 'mouseover':
5175 case 'mouseout':
5176 this._hasMouseInteraction = isInteracting;
5177 break;
5178
5179 case 'focusin':
5180 case 'focusout':
5181 this._hasKeyboardInteraction = isInteracting;
5182 break;
5183 }
5184
5185 if (isInteracting) {
5186 this._clearTimeout();
5187
5188 return;
5189 }
5190
5191 const nextElement = event.relatedTarget;
5192
5193 if (this._element === nextElement || this._element.contains(nextElement)) {
5194 return;
5195 }
5196
5197 this._maybeScheduleHide();
5198 }
5199
5200 _setListeners() {
5201 EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
5202 EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
5203 EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
5204 EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
5205 }
5206
5207 _clearTimeout() {
5208 clearTimeout(this._timeout);
5209 this._timeout = null;
5210 } // Static
5211
5212
5213 static jQueryInterface(config) {
5214 return this.each(function () {
5215 const data = Toast.getOrCreateInstance(this, config);
5216
5217 if (typeof config === 'string') {
5218 if (typeof data[config] === 'undefined') {
5219 throw new TypeError(`No method named "${config}"`);
5220 }
5221
5222 data[config](this);
5223 }
5224 });
5225 }
5226
5227 }
5228 /**
5229 * Data API implementation
5230 */
5231
5232
5233 enableDismissTrigger(Toast);
5234 /**
5235 * jQuery
5236 */
5237
5238 defineJQueryPlugin(Toast);
5239
5240 /**
5241 * --------------------------------------------------------------------------
5242 * Bootstrap (v5.2.1): index.umd.js
5243 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5244 * --------------------------------------------------------------------------
5245 */
5246 const index_umd = {
5247 Alert,
5248 Button,
5249 Carousel,
5250 Collapse,
5251 Dropdown,
5252 Modal,
5253 Offcanvas,
5254 Popover,
5255 ScrollSpy,
5256 Tab,
5257 Toast,
5258 Tooltip
5259 };
5260
5261 return index_umd;
5262
5263 }));
5264 //# sourceMappingURL=bootstrap.js.map