source: imaps-frontend/node_modules/bootstrap/dist/js/bootstrap.bundle.js

main
Last change on this file was d565449, checked in by stefan toskovski <stefantoska84@…>, 4 weeks ago

Update repo after prototype presentation

  • Property mode set to 100644
File size: 202.9 KB
Line 
1/*!
2 * Bootstrap v5.3.3 (https://getbootstrap.com/)
3 * Copyright 2011-2024 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() :
8 typeof define === 'function' && define.amd ? define(factory) :
9 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory());
10})(this, (function () { 'use strict';
11
12 /**
13 * --------------------------------------------------------------------------
14 * Bootstrap dom/data.js
15 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16 * --------------------------------------------------------------------------
17 */
18
19 /**
20 * Constants
21 */
22
23 const elementMap = new Map();
24 const Data = {
25 set(element, key, instance) {
26 if (!elementMap.has(element)) {
27 elementMap.set(element, new Map());
28 }
29 const instanceMap = elementMap.get(element);
30
31 // make it clear we only want one instance per element
32 // can be removed later when multiple key/instances are fine to be used
33 if (!instanceMap.has(key) && instanceMap.size !== 0) {
34 // eslint-disable-next-line no-console
35 console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
36 return;
37 }
38 instanceMap.set(key, instance);
39 },
40 get(element, key) {
41 if (elementMap.has(element)) {
42 return elementMap.get(element).get(key) || null;
43 }
44 return null;
45 },
46 remove(element, key) {
47 if (!elementMap.has(element)) {
48 return;
49 }
50 const instanceMap = elementMap.get(element);
51 instanceMap.delete(key);
52
53 // free up element references if there are no instances left for an element
54 if (instanceMap.size === 0) {
55 elementMap.delete(element);
56 }
57 }
58 };
59
60 /**
61 * --------------------------------------------------------------------------
62 * Bootstrap util/index.js
63 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
64 * --------------------------------------------------------------------------
65 */
66
67 const MAX_UID = 1000000;
68 const MILLISECONDS_MULTIPLIER = 1000;
69 const TRANSITION_END = 'transitionend';
70
71 /**
72 * Properly escape IDs selectors to handle weird IDs
73 * @param {string} selector
74 * @returns {string}
75 */
76 const parseSelector = selector => {
77 if (selector && window.CSS && window.CSS.escape) {
78 // document.querySelector needs escaping to handle IDs (html5+) containing for instance /
79 selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
80 }
81 return selector;
82 };
83
84 // Shout-out Angus Croll (https://goo.gl/pxwQGp)
85 const toType = object => {
86 if (object === null || object === undefined) {
87 return `${object}`;
88 }
89 return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
90 };
91
92 /**
93 * Public Util API
94 */
95
96 const getUID = prefix => {
97 do {
98 prefix += Math.floor(Math.random() * MAX_UID);
99 } while (document.getElementById(prefix));
100 return prefix;
101 };
102 const getTransitionDurationFromElement = element => {
103 if (!element) {
104 return 0;
105 }
106
107 // Get transition-duration of the element
108 let {
109 transitionDuration,
110 transitionDelay
111 } = window.getComputedStyle(element);
112 const floatTransitionDuration = Number.parseFloat(transitionDuration);
113 const floatTransitionDelay = Number.parseFloat(transitionDelay);
114
115 // Return 0 if element or transition duration is not found
116 if (!floatTransitionDuration && !floatTransitionDelay) {
117 return 0;
118 }
119
120 // If multiple durations are defined, take the first
121 transitionDuration = transitionDuration.split(',')[0];
122 transitionDelay = transitionDelay.split(',')[0];
123 return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
124 };
125 const triggerTransitionEnd = element => {
126 element.dispatchEvent(new Event(TRANSITION_END));
127 };
128 const isElement$1 = object => {
129 if (!object || typeof object !== 'object') {
130 return false;
131 }
132 if (typeof object.jquery !== 'undefined') {
133 object = object[0];
134 }
135 return typeof object.nodeType !== 'undefined';
136 };
137 const getElement = object => {
138 // it's a jQuery object or a node element
139 if (isElement$1(object)) {
140 return object.jquery ? object[0] : object;
141 }
142 if (typeof object === 'string' && object.length > 0) {
143 return document.querySelector(parseSelector(object));
144 }
145 return null;
146 };
147 const isVisible = element => {
148 if (!isElement$1(element) || element.getClientRects().length === 0) {
149 return false;
150 }
151 const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';
152 // Handle `details` element as its content may falsie appear visible when it is closed
153 const closedDetails = element.closest('details:not([open])');
154 if (!closedDetails) {
155 return elementIsVisible;
156 }
157 if (closedDetails !== element) {
158 const summary = element.closest('summary');
159 if (summary && summary.parentNode !== closedDetails) {
160 return false;
161 }
162 if (summary === null) {
163 return false;
164 }
165 }
166 return elementIsVisible;
167 };
168 const isDisabled = element => {
169 if (!element || element.nodeType !== Node.ELEMENT_NODE) {
170 return true;
171 }
172 if (element.classList.contains('disabled')) {
173 return true;
174 }
175 if (typeof element.disabled !== 'undefined') {
176 return element.disabled;
177 }
178 return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
179 };
180 const findShadowRoot = element => {
181 if (!document.documentElement.attachShadow) {
182 return null;
183 }
184
185 // Can find the shadow root otherwise it'll return the document
186 if (typeof element.getRootNode === 'function') {
187 const root = element.getRootNode();
188 return root instanceof ShadowRoot ? root : null;
189 }
190 if (element instanceof ShadowRoot) {
191 return element;
192 }
193
194 // when we don't find a shadow root
195 if (!element.parentNode) {
196 return null;
197 }
198 return findShadowRoot(element.parentNode);
199 };
200 const noop = () => {};
201
202 /**
203 * Trick to restart an element's animation
204 *
205 * @param {HTMLElement} element
206 * @return void
207 *
208 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
209 */
210 const reflow = element => {
211 element.offsetHeight; // eslint-disable-line no-unused-expressions
212 };
213 const getjQuery = () => {
214 if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
215 return window.jQuery;
216 }
217 return null;
218 };
219 const DOMContentLoadedCallbacks = [];
220 const onDOMContentLoaded = callback => {
221 if (document.readyState === 'loading') {
222 // add listener on the first call when the document is in loading state
223 if (!DOMContentLoadedCallbacks.length) {
224 document.addEventListener('DOMContentLoaded', () => {
225 for (const callback of DOMContentLoadedCallbacks) {
226 callback();
227 }
228 });
229 }
230 DOMContentLoadedCallbacks.push(callback);
231 } else {
232 callback();
233 }
234 };
235 const isRTL = () => document.documentElement.dir === 'rtl';
236 const defineJQueryPlugin = plugin => {
237 onDOMContentLoaded(() => {
238 const $ = getjQuery();
239 /* istanbul ignore if */
240 if ($) {
241 const name = plugin.NAME;
242 const JQUERY_NO_CONFLICT = $.fn[name];
243 $.fn[name] = plugin.jQueryInterface;
244 $.fn[name].Constructor = plugin;
245 $.fn[name].noConflict = () => {
246 $.fn[name] = JQUERY_NO_CONFLICT;
247 return plugin.jQueryInterface;
248 };
249 }
250 });
251 };
252 const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
253 return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
254 };
255 const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
256 if (!waitForTransition) {
257 execute(callback);
258 return;
259 }
260 const durationPadding = 5;
261 const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
262 let called = false;
263 const handler = ({
264 target
265 }) => {
266 if (target !== transitionElement) {
267 return;
268 }
269 called = true;
270 transitionElement.removeEventListener(TRANSITION_END, handler);
271 execute(callback);
272 };
273 transitionElement.addEventListener(TRANSITION_END, handler);
274 setTimeout(() => {
275 if (!called) {
276 triggerTransitionEnd(transitionElement);
277 }
278 }, emulatedDuration);
279 };
280
281 /**
282 * Return the previous/next element of a list.
283 *
284 * @param {array} list The list of elements
285 * @param activeElement The active element
286 * @param shouldGetNext Choose to get next or previous element
287 * @param isCycleAllowed
288 * @return {Element|elem} The proper element
289 */
290 const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
291 const listLength = list.length;
292 let index = list.indexOf(activeElement);
293
294 // if the element does not exist in the list return an element
295 // depending on the direction and if cycle is allowed
296 if (index === -1) {
297 return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
298 }
299 index += shouldGetNext ? 1 : -1;
300 if (isCycleAllowed) {
301 index = (index + listLength) % listLength;
302 }
303 return list[Math.max(0, Math.min(index, listLength - 1))];
304 };
305
306 /**
307 * --------------------------------------------------------------------------
308 * Bootstrap dom/event-handler.js
309 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
310 * --------------------------------------------------------------------------
311 */
312
313
314 /**
315 * Constants
316 */
317
318 const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
319 const stripNameRegex = /\..*/;
320 const stripUidRegex = /::\d+$/;
321 const eventRegistry = {}; // Events storage
322 let uidEvent = 1;
323 const customEvents = {
324 mouseenter: 'mouseover',
325 mouseleave: 'mouseout'
326 };
327 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']);
328
329 /**
330 * Private methods
331 */
332
333 function makeEventUid(element, uid) {
334 return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
335 }
336 function getElementEvents(element) {
337 const uid = makeEventUid(element);
338 element.uidEvent = uid;
339 eventRegistry[uid] = eventRegistry[uid] || {};
340 return eventRegistry[uid];
341 }
342 function bootstrapHandler(element, fn) {
343 return function handler(event) {
344 hydrateObj(event, {
345 delegateTarget: element
346 });
347 if (handler.oneOff) {
348 EventHandler.off(element, event.type, fn);
349 }
350 return fn.apply(element, [event]);
351 };
352 }
353 function bootstrapDelegationHandler(element, selector, fn) {
354 return function handler(event) {
355 const domElements = element.querySelectorAll(selector);
356 for (let {
357 target
358 } = event; target && target !== this; target = target.parentNode) {
359 for (const domElement of domElements) {
360 if (domElement !== target) {
361 continue;
362 }
363 hydrateObj(event, {
364 delegateTarget: target
365 });
366 if (handler.oneOff) {
367 EventHandler.off(element, event.type, selector, fn);
368 }
369 return fn.apply(target, [event]);
370 }
371 }
372 };
373 }
374 function findHandler(events, callable, delegationSelector = null) {
375 return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
376 }
377 function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
378 const isDelegated = typeof handler === 'string';
379 // TODO: tooltip passes `false` instead of selector, so we need to check
380 const callable = isDelegated ? delegationFunction : handler || delegationFunction;
381 let typeEvent = getTypeEvent(originalTypeEvent);
382 if (!nativeEvents.has(typeEvent)) {
383 typeEvent = originalTypeEvent;
384 }
385 return [isDelegated, callable, typeEvent];
386 }
387 function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
388 if (typeof originalTypeEvent !== 'string' || !element) {
389 return;
390 }
391 let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
392
393 // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
394 // this prevents the handler from being dispatched the same way as mouseover or mouseout does
395 if (originalTypeEvent in customEvents) {
396 const wrapFunction = fn => {
397 return function (event) {
398 if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
399 return fn.call(this, event);
400 }
401 };
402 };
403 callable = wrapFunction(callable);
404 }
405 const events = getElementEvents(element);
406 const handlers = events[typeEvent] || (events[typeEvent] = {});
407 const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
408 if (previousFunction) {
409 previousFunction.oneOff = previousFunction.oneOff && oneOff;
410 return;
411 }
412 const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
413 const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
414 fn.delegationSelector = isDelegated ? handler : null;
415 fn.callable = callable;
416 fn.oneOff = oneOff;
417 fn.uidEvent = uid;
418 handlers[uid] = fn;
419 element.addEventListener(typeEvent, fn, isDelegated);
420 }
421 function removeHandler(element, events, typeEvent, handler, delegationSelector) {
422 const fn = findHandler(events[typeEvent], handler, delegationSelector);
423 if (!fn) {
424 return;
425 }
426 element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
427 delete events[typeEvent][fn.uidEvent];
428 }
429 function removeNamespacedHandlers(element, events, typeEvent, namespace) {
430 const storeElementEvent = events[typeEvent] || {};
431 for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
432 if (handlerKey.includes(namespace)) {
433 removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
434 }
435 }
436 }
437 function getTypeEvent(event) {
438 // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
439 event = event.replace(stripNameRegex, '');
440 return customEvents[event] || event;
441 }
442 const EventHandler = {
443 on(element, event, handler, delegationFunction) {
444 addHandler(element, event, handler, delegationFunction, false);
445 },
446 one(element, event, handler, delegationFunction) {
447 addHandler(element, event, handler, delegationFunction, true);
448 },
449 off(element, originalTypeEvent, handler, delegationFunction) {
450 if (typeof originalTypeEvent !== 'string' || !element) {
451 return;
452 }
453 const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
454 const inNamespace = typeEvent !== originalTypeEvent;
455 const events = getElementEvents(element);
456 const storeElementEvent = events[typeEvent] || {};
457 const isNamespace = originalTypeEvent.startsWith('.');
458 if (typeof callable !== 'undefined') {
459 // Simplest case: handler is passed, remove that listener ONLY.
460 if (!Object.keys(storeElementEvent).length) {
461 return;
462 }
463 removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
464 return;
465 }
466 if (isNamespace) {
467 for (const elementEvent of Object.keys(events)) {
468 removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
469 }
470 }
471 for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
472 const handlerKey = keyHandlers.replace(stripUidRegex, '');
473 if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
474 removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
475 }
476 }
477 },
478 trigger(element, event, args) {
479 if (typeof event !== 'string' || !element) {
480 return null;
481 }
482 const $ = getjQuery();
483 const typeEvent = getTypeEvent(event);
484 const inNamespace = event !== typeEvent;
485 let jQueryEvent = null;
486 let bubbles = true;
487 let nativeDispatch = true;
488 let defaultPrevented = false;
489 if (inNamespace && $) {
490 jQueryEvent = $.Event(event, args);
491 $(element).trigger(jQueryEvent);
492 bubbles = !jQueryEvent.isPropagationStopped();
493 nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
494 defaultPrevented = jQueryEvent.isDefaultPrevented();
495 }
496 const evt = hydrateObj(new Event(event, {
497 bubbles,
498 cancelable: true
499 }), args);
500 if (defaultPrevented) {
501 evt.preventDefault();
502 }
503 if (nativeDispatch) {
504 element.dispatchEvent(evt);
505 }
506 if (evt.defaultPrevented && jQueryEvent) {
507 jQueryEvent.preventDefault();
508 }
509 return evt;
510 }
511 };
512 function hydrateObj(obj, meta = {}) {
513 for (const [key, value] of Object.entries(meta)) {
514 try {
515 obj[key] = value;
516 } catch (_unused) {
517 Object.defineProperty(obj, key, {
518 configurable: true,
519 get() {
520 return value;
521 }
522 });
523 }
524 }
525 return obj;
526 }
527
528 /**
529 * --------------------------------------------------------------------------
530 * Bootstrap dom/manipulator.js
531 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
532 * --------------------------------------------------------------------------
533 */
534
535 function normalizeData(value) {
536 if (value === 'true') {
537 return true;
538 }
539 if (value === 'false') {
540 return false;
541 }
542 if (value === Number(value).toString()) {
543 return Number(value);
544 }
545 if (value === '' || value === 'null') {
546 return null;
547 }
548 if (typeof value !== 'string') {
549 return value;
550 }
551 try {
552 return JSON.parse(decodeURIComponent(value));
553 } catch (_unused) {
554 return value;
555 }
556 }
557 function normalizeDataKey(key) {
558 return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
559 }
560 const Manipulator = {
561 setDataAttribute(element, key, value) {
562 element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
563 },
564 removeDataAttribute(element, key) {
565 element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
566 },
567 getDataAttributes(element) {
568 if (!element) {
569 return {};
570 }
571 const attributes = {};
572 const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
573 for (const key of bsKeys) {
574 let pureKey = key.replace(/^bs/, '');
575 pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
576 attributes[pureKey] = normalizeData(element.dataset[key]);
577 }
578 return attributes;
579 },
580 getDataAttribute(element, key) {
581 return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
582 }
583 };
584
585 /**
586 * --------------------------------------------------------------------------
587 * Bootstrap util/config.js
588 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
589 * --------------------------------------------------------------------------
590 */
591
592
593 /**
594 * Class definition
595 */
596
597 class Config {
598 // Getters
599 static get Default() {
600 return {};
601 }
602 static get DefaultType() {
603 return {};
604 }
605 static get NAME() {
606 throw new Error('You have to implement the static method "NAME", for each component!');
607 }
608 _getConfig(config) {
609 config = this._mergeConfigObj(config);
610 config = this._configAfterMerge(config);
611 this._typeCheckConfig(config);
612 return config;
613 }
614 _configAfterMerge(config) {
615 return config;
616 }
617 _mergeConfigObj(config, element) {
618 const jsonConfig = isElement$1(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse
619
620 return {
621 ...this.constructor.Default,
622 ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
623 ...(isElement$1(element) ? Manipulator.getDataAttributes(element) : {}),
624 ...(typeof config === 'object' ? config : {})
625 };
626 }
627 _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
628 for (const [property, expectedTypes] of Object.entries(configTypes)) {
629 const value = config[property];
630 const valueType = isElement$1(value) ? 'element' : toType(value);
631 if (!new RegExp(expectedTypes).test(valueType)) {
632 throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
633 }
634 }
635 }
636 }
637
638 /**
639 * --------------------------------------------------------------------------
640 * Bootstrap base-component.js
641 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
642 * --------------------------------------------------------------------------
643 */
644
645
646 /**
647 * Constants
648 */
649
650 const VERSION = '5.3.3';
651
652 /**
653 * Class definition
654 */
655
656 class BaseComponent extends Config {
657 constructor(element, config) {
658 super();
659 element = getElement(element);
660 if (!element) {
661 return;
662 }
663 this._element = element;
664 this._config = this._getConfig(config);
665 Data.set(this._element, this.constructor.DATA_KEY, this);
666 }
667
668 // Public
669 dispose() {
670 Data.remove(this._element, this.constructor.DATA_KEY);
671 EventHandler.off(this._element, this.constructor.EVENT_KEY);
672 for (const propertyName of Object.getOwnPropertyNames(this)) {
673 this[propertyName] = null;
674 }
675 }
676 _queueCallback(callback, element, isAnimated = true) {
677 executeAfterTransition(callback, element, isAnimated);
678 }
679 _getConfig(config) {
680 config = this._mergeConfigObj(config, this._element);
681 config = this._configAfterMerge(config);
682 this._typeCheckConfig(config);
683 return config;
684 }
685
686 // Static
687 static getInstance(element) {
688 return Data.get(getElement(element), this.DATA_KEY);
689 }
690 static getOrCreateInstance(element, config = {}) {
691 return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
692 }
693 static get VERSION() {
694 return VERSION;
695 }
696 static get DATA_KEY() {
697 return `bs.${this.NAME}`;
698 }
699 static get EVENT_KEY() {
700 return `.${this.DATA_KEY}`;
701 }
702 static eventName(name) {
703 return `${name}${this.EVENT_KEY}`;
704 }
705 }
706
707 /**
708 * --------------------------------------------------------------------------
709 * Bootstrap dom/selector-engine.js
710 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
711 * --------------------------------------------------------------------------
712 */
713
714 const getSelector = element => {
715 let selector = element.getAttribute('data-bs-target');
716 if (!selector || selector === '#') {
717 let hrefAttribute = element.getAttribute('href');
718
719 // The only valid content that could double as a selector are IDs or classes,
720 // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
721 // `document.querySelector` will rightfully complain it is invalid.
722 // See https://github.com/twbs/bootstrap/issues/32273
723 if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
724 return null;
725 }
726
727 // Just in case some CMS puts out a full URL with the anchor appended
728 if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
729 hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
730 }
731 selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
732 }
733 return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;
734 };
735 const SelectorEngine = {
736 find(selector, element = document.documentElement) {
737 return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
738 },
739 findOne(selector, element = document.documentElement) {
740 return Element.prototype.querySelector.call(element, selector);
741 },
742 children(element, selector) {
743 return [].concat(...element.children).filter(child => child.matches(selector));
744 },
745 parents(element, selector) {
746 const parents = [];
747 let ancestor = element.parentNode.closest(selector);
748 while (ancestor) {
749 parents.push(ancestor);
750 ancestor = ancestor.parentNode.closest(selector);
751 }
752 return parents;
753 },
754 prev(element, selector) {
755 let previous = element.previousElementSibling;
756 while (previous) {
757 if (previous.matches(selector)) {
758 return [previous];
759 }
760 previous = previous.previousElementSibling;
761 }
762 return [];
763 },
764 // TODO: this is now unused; remove later along with prev()
765 next(element, selector) {
766 let next = element.nextElementSibling;
767 while (next) {
768 if (next.matches(selector)) {
769 return [next];
770 }
771 next = next.nextElementSibling;
772 }
773 return [];
774 },
775 focusableChildren(element) {
776 const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
777 return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
778 },
779 getSelectorFromElement(element) {
780 const selector = getSelector(element);
781 if (selector) {
782 return SelectorEngine.findOne(selector) ? selector : null;
783 }
784 return null;
785 },
786 getElementFromSelector(element) {
787 const selector = getSelector(element);
788 return selector ? SelectorEngine.findOne(selector) : null;
789 },
790 getMultipleElementsFromSelector(element) {
791 const selector = getSelector(element);
792 return selector ? SelectorEngine.find(selector) : [];
793 }
794 };
795
796 /**
797 * --------------------------------------------------------------------------
798 * Bootstrap util/component-functions.js
799 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
800 * --------------------------------------------------------------------------
801 */
802
803 const enableDismissTrigger = (component, method = 'hide') => {
804 const clickEvent = `click.dismiss${component.EVENT_KEY}`;
805 const name = component.NAME;
806 EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
807 if (['A', 'AREA'].includes(this.tagName)) {
808 event.preventDefault();
809 }
810 if (isDisabled(this)) {
811 return;
812 }
813 const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
814 const instance = component.getOrCreateInstance(target);
815
816 // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
817 instance[method]();
818 });
819 };
820
821 /**
822 * --------------------------------------------------------------------------
823 * Bootstrap alert.js
824 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
825 * --------------------------------------------------------------------------
826 */
827
828
829 /**
830 * Constants
831 */
832
833 const NAME$f = 'alert';
834 const DATA_KEY$a = 'bs.alert';
835 const EVENT_KEY$b = `.${DATA_KEY$a}`;
836 const EVENT_CLOSE = `close${EVENT_KEY$b}`;
837 const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
838 const CLASS_NAME_FADE$5 = 'fade';
839 const CLASS_NAME_SHOW$8 = 'show';
840
841 /**
842 * Class definition
843 */
844
845 class Alert extends BaseComponent {
846 // Getters
847 static get NAME() {
848 return NAME$f;
849 }
850
851 // Public
852 close() {
853 const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
854 if (closeEvent.defaultPrevented) {
855 return;
856 }
857 this._element.classList.remove(CLASS_NAME_SHOW$8);
858 const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
859 this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
860 }
861
862 // Private
863 _destroyElement() {
864 this._element.remove();
865 EventHandler.trigger(this._element, EVENT_CLOSED);
866 this.dispose();
867 }
868
869 // Static
870 static jQueryInterface(config) {
871 return this.each(function () {
872 const data = Alert.getOrCreateInstance(this);
873 if (typeof config !== 'string') {
874 return;
875 }
876 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
877 throw new TypeError(`No method named "${config}"`);
878 }
879 data[config](this);
880 });
881 }
882 }
883
884 /**
885 * Data API implementation
886 */
887
888 enableDismissTrigger(Alert, 'close');
889
890 /**
891 * jQuery
892 */
893
894 defineJQueryPlugin(Alert);
895
896 /**
897 * --------------------------------------------------------------------------
898 * Bootstrap button.js
899 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
900 * --------------------------------------------------------------------------
901 */
902
903
904 /**
905 * Constants
906 */
907
908 const NAME$e = 'button';
909 const DATA_KEY$9 = 'bs.button';
910 const EVENT_KEY$a = `.${DATA_KEY$9}`;
911 const DATA_API_KEY$6 = '.data-api';
912 const CLASS_NAME_ACTIVE$3 = 'active';
913 const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
914 const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
915
916 /**
917 * Class definition
918 */
919
920 class Button extends BaseComponent {
921 // Getters
922 static get NAME() {
923 return NAME$e;
924 }
925
926 // Public
927 toggle() {
928 // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
929 this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
930 }
931
932 // Static
933 static jQueryInterface(config) {
934 return this.each(function () {
935 const data = Button.getOrCreateInstance(this);
936 if (config === 'toggle') {
937 data[config]();
938 }
939 });
940 }
941 }
942
943 /**
944 * Data API implementation
945 */
946
947 EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
948 event.preventDefault();
949 const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
950 const data = Button.getOrCreateInstance(button);
951 data.toggle();
952 });
953
954 /**
955 * jQuery
956 */
957
958 defineJQueryPlugin(Button);
959
960 /**
961 * --------------------------------------------------------------------------
962 * Bootstrap util/swipe.js
963 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
964 * --------------------------------------------------------------------------
965 */
966
967
968 /**
969 * Constants
970 */
971
972 const NAME$d = 'swipe';
973 const EVENT_KEY$9 = '.bs.swipe';
974 const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
975 const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
976 const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
977 const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
978 const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
979 const POINTER_TYPE_TOUCH = 'touch';
980 const POINTER_TYPE_PEN = 'pen';
981 const CLASS_NAME_POINTER_EVENT = 'pointer-event';
982 const SWIPE_THRESHOLD = 40;
983 const Default$c = {
984 endCallback: null,
985 leftCallback: null,
986 rightCallback: null
987 };
988 const DefaultType$c = {
989 endCallback: '(function|null)',
990 leftCallback: '(function|null)',
991 rightCallback: '(function|null)'
992 };
993
994 /**
995 * Class definition
996 */
997
998 class Swipe extends Config {
999 constructor(element, config) {
1000 super();
1001 this._element = element;
1002 if (!element || !Swipe.isSupported()) {
1003 return;
1004 }
1005 this._config = this._getConfig(config);
1006 this._deltaX = 0;
1007 this._supportPointerEvents = Boolean(window.PointerEvent);
1008 this._initEvents();
1009 }
1010
1011 // Getters
1012 static get Default() {
1013 return Default$c;
1014 }
1015 static get DefaultType() {
1016 return DefaultType$c;
1017 }
1018 static get NAME() {
1019 return NAME$d;
1020 }
1021
1022 // Public
1023 dispose() {
1024 EventHandler.off(this._element, EVENT_KEY$9);
1025 }
1026
1027 // Private
1028 _start(event) {
1029 if (!this._supportPointerEvents) {
1030 this._deltaX = event.touches[0].clientX;
1031 return;
1032 }
1033 if (this._eventIsPointerPenTouch(event)) {
1034 this._deltaX = event.clientX;
1035 }
1036 }
1037 _end(event) {
1038 if (this._eventIsPointerPenTouch(event)) {
1039 this._deltaX = event.clientX - this._deltaX;
1040 }
1041 this._handleSwipe();
1042 execute(this._config.endCallback);
1043 }
1044 _move(event) {
1045 this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
1046 }
1047 _handleSwipe() {
1048 const absDeltaX = Math.abs(this._deltaX);
1049 if (absDeltaX <= SWIPE_THRESHOLD) {
1050 return;
1051 }
1052 const direction = absDeltaX / this._deltaX;
1053 this._deltaX = 0;
1054 if (!direction) {
1055 return;
1056 }
1057 execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
1058 }
1059 _initEvents() {
1060 if (this._supportPointerEvents) {
1061 EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));
1062 EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));
1063 this._element.classList.add(CLASS_NAME_POINTER_EVENT);
1064 } else {
1065 EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));
1066 EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));
1067 EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));
1068 }
1069 }
1070 _eventIsPointerPenTouch(event) {
1071 return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
1072 }
1073
1074 // Static
1075 static isSupported() {
1076 return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
1077 }
1078 }
1079
1080 /**
1081 * --------------------------------------------------------------------------
1082 * Bootstrap carousel.js
1083 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1084 * --------------------------------------------------------------------------
1085 */
1086
1087
1088 /**
1089 * Constants
1090 */
1091
1092 const NAME$c = 'carousel';
1093 const DATA_KEY$8 = 'bs.carousel';
1094 const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1095 const DATA_API_KEY$5 = '.data-api';
1096 const ARROW_LEFT_KEY$1 = 'ArrowLeft';
1097 const ARROW_RIGHT_KEY$1 = 'ArrowRight';
1098 const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1099
1100 const ORDER_NEXT = 'next';
1101 const ORDER_PREV = 'prev';
1102 const DIRECTION_LEFT = 'left';
1103 const DIRECTION_RIGHT = 'right';
1104 const EVENT_SLIDE = `slide${EVENT_KEY$8}`;
1105 const EVENT_SLID = `slid${EVENT_KEY$8}`;
1106 const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
1107 const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
1108 const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
1109 const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
1110 const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
1111 const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
1112 const CLASS_NAME_CAROUSEL = 'carousel';
1113 const CLASS_NAME_ACTIVE$2 = 'active';
1114 const CLASS_NAME_SLIDE = 'slide';
1115 const CLASS_NAME_END = 'carousel-item-end';
1116 const CLASS_NAME_START = 'carousel-item-start';
1117 const CLASS_NAME_NEXT = 'carousel-item-next';
1118 const CLASS_NAME_PREV = 'carousel-item-prev';
1119 const SELECTOR_ACTIVE = '.active';
1120 const SELECTOR_ITEM = '.carousel-item';
1121 const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
1122 const SELECTOR_ITEM_IMG = '.carousel-item img';
1123 const SELECTOR_INDICATORS = '.carousel-indicators';
1124 const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
1125 const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
1126 const KEY_TO_DIRECTION = {
1127 [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
1128 [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
1129 };
1130 const Default$b = {
1131 interval: 5000,
1132 keyboard: true,
1133 pause: 'hover',
1134 ride: false,
1135 touch: true,
1136 wrap: true
1137 };
1138 const DefaultType$b = {
1139 interval: '(number|boolean)',
1140 // TODO:v6 remove boolean support
1141 keyboard: 'boolean',
1142 pause: '(string|boolean)',
1143 ride: '(boolean|string)',
1144 touch: 'boolean',
1145 wrap: 'boolean'
1146 };
1147
1148 /**
1149 * Class definition
1150 */
1151
1152 class Carousel extends BaseComponent {
1153 constructor(element, config) {
1154 super(element, config);
1155 this._interval = null;
1156 this._activeElement = null;
1157 this._isSliding = false;
1158 this.touchTimeout = null;
1159 this._swipeHelper = null;
1160 this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
1161 this._addEventListeners();
1162 if (this._config.ride === CLASS_NAME_CAROUSEL) {
1163 this.cycle();
1164 }
1165 }
1166
1167 // Getters
1168 static get Default() {
1169 return Default$b;
1170 }
1171 static get DefaultType() {
1172 return DefaultType$b;
1173 }
1174 static get NAME() {
1175 return NAME$c;
1176 }
1177
1178 // Public
1179 next() {
1180 this._slide(ORDER_NEXT);
1181 }
1182 nextWhenVisible() {
1183 // FIXME TODO use `document.visibilityState`
1184 // Don't call next when the page isn't visible
1185 // or the carousel or its parent isn't visible
1186 if (!document.hidden && isVisible(this._element)) {
1187 this.next();
1188 }
1189 }
1190 prev() {
1191 this._slide(ORDER_PREV);
1192 }
1193 pause() {
1194 if (this._isSliding) {
1195 triggerTransitionEnd(this._element);
1196 }
1197 this._clearInterval();
1198 }
1199 cycle() {
1200 this._clearInterval();
1201 this._updateInterval();
1202 this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
1203 }
1204 _maybeEnableCycle() {
1205 if (!this._config.ride) {
1206 return;
1207 }
1208 if (this._isSliding) {
1209 EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
1210 return;
1211 }
1212 this.cycle();
1213 }
1214 to(index) {
1215 const items = this._getItems();
1216 if (index > items.length - 1 || index < 0) {
1217 return;
1218 }
1219 if (this._isSliding) {
1220 EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
1221 return;
1222 }
1223 const activeIndex = this._getItemIndex(this._getActive());
1224 if (activeIndex === index) {
1225 return;
1226 }
1227 const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
1228 this._slide(order, items[index]);
1229 }
1230 dispose() {
1231 if (this._swipeHelper) {
1232 this._swipeHelper.dispose();
1233 }
1234 super.dispose();
1235 }
1236
1237 // Private
1238 _configAfterMerge(config) {
1239 config.defaultInterval = config.interval;
1240 return config;
1241 }
1242 _addEventListeners() {
1243 if (this._config.keyboard) {
1244 EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));
1245 }
1246 if (this._config.pause === 'hover') {
1247 EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
1248 EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
1249 }
1250 if (this._config.touch && Swipe.isSupported()) {
1251 this._addTouchEventListeners();
1252 }
1253 }
1254 _addTouchEventListeners() {
1255 for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
1256 EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());
1257 }
1258 const endCallBack = () => {
1259 if (this._config.pause !== 'hover') {
1260 return;
1261 }
1262
1263 // If it's a touch-enabled device, mouseenter/leave are fired as
1264 // part of the mouse compatibility events on first tap - the carousel
1265 // would stop cycling until user tapped out of it;
1266 // here, we listen for touchend, explicitly pause the carousel
1267 // (as if it's the second time we tap on it, mouseenter compat event
1268 // is NOT fired) and after a timeout (to allow for mouse compatibility
1269 // events to fire) we explicitly restart cycling
1270
1271 this.pause();
1272 if (this.touchTimeout) {
1273 clearTimeout(this.touchTimeout);
1274 }
1275 this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
1276 };
1277 const swipeConfig = {
1278 leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
1279 rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
1280 endCallback: endCallBack
1281 };
1282 this._swipeHelper = new Swipe(this._element, swipeConfig);
1283 }
1284 _keydown(event) {
1285 if (/input|textarea/i.test(event.target.tagName)) {
1286 return;
1287 }
1288 const direction = KEY_TO_DIRECTION[event.key];
1289 if (direction) {
1290 event.preventDefault();
1291 this._slide(this._directionToOrder(direction));
1292 }
1293 }
1294 _getItemIndex(element) {
1295 return this._getItems().indexOf(element);
1296 }
1297 _setActiveIndicatorElement(index) {
1298 if (!this._indicatorsElement) {
1299 return;
1300 }
1301 const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
1302 activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
1303 activeIndicator.removeAttribute('aria-current');
1304 const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
1305 if (newActiveIndicator) {
1306 newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
1307 newActiveIndicator.setAttribute('aria-current', 'true');
1308 }
1309 }
1310 _updateInterval() {
1311 const element = this._activeElement || this._getActive();
1312 if (!element) {
1313 return;
1314 }
1315 const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
1316 this._config.interval = elementInterval || this._config.defaultInterval;
1317 }
1318 _slide(order, element = null) {
1319 if (this._isSliding) {
1320 return;
1321 }
1322 const activeElement = this._getActive();
1323 const isNext = order === ORDER_NEXT;
1324 const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
1325 if (nextElement === activeElement) {
1326 return;
1327 }
1328 const nextElementIndex = this._getItemIndex(nextElement);
1329 const triggerEvent = eventName => {
1330 return EventHandler.trigger(this._element, eventName, {
1331 relatedTarget: nextElement,
1332 direction: this._orderToDirection(order),
1333 from: this._getItemIndex(activeElement),
1334 to: nextElementIndex
1335 });
1336 };
1337 const slideEvent = triggerEvent(EVENT_SLIDE);
1338 if (slideEvent.defaultPrevented) {
1339 return;
1340 }
1341 if (!activeElement || !nextElement) {
1342 // Some weirdness is happening, so we bail
1343 // TODO: change tests that use empty divs to avoid this check
1344 return;
1345 }
1346 const isCycling = Boolean(this._interval);
1347 this.pause();
1348 this._isSliding = true;
1349 this._setActiveIndicatorElement(nextElementIndex);
1350 this._activeElement = nextElement;
1351 const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
1352 const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
1353 nextElement.classList.add(orderClassName);
1354 reflow(nextElement);
1355 activeElement.classList.add(directionalClassName);
1356 nextElement.classList.add(directionalClassName);
1357 const completeCallBack = () => {
1358 nextElement.classList.remove(directionalClassName, orderClassName);
1359 nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1360 activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
1361 this._isSliding = false;
1362 triggerEvent(EVENT_SLID);
1363 };
1364 this._queueCallback(completeCallBack, activeElement, this._isAnimated());
1365 if (isCycling) {
1366 this.cycle();
1367 }
1368 }
1369 _isAnimated() {
1370 return this._element.classList.contains(CLASS_NAME_SLIDE);
1371 }
1372 _getActive() {
1373 return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1374 }
1375 _getItems() {
1376 return SelectorEngine.find(SELECTOR_ITEM, this._element);
1377 }
1378 _clearInterval() {
1379 if (this._interval) {
1380 clearInterval(this._interval);
1381 this._interval = null;
1382 }
1383 }
1384 _directionToOrder(direction) {
1385 if (isRTL()) {
1386 return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
1387 }
1388 return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
1389 }
1390 _orderToDirection(order) {
1391 if (isRTL()) {
1392 return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
1393 }
1394 return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
1395 }
1396
1397 // Static
1398 static jQueryInterface(config) {
1399 return this.each(function () {
1400 const data = Carousel.getOrCreateInstance(this, config);
1401 if (typeof config === 'number') {
1402 data.to(config);
1403 return;
1404 }
1405 if (typeof config === 'string') {
1406 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
1407 throw new TypeError(`No method named "${config}"`);
1408 }
1409 data[config]();
1410 }
1411 });
1412 }
1413 }
1414
1415 /**
1416 * Data API implementation
1417 */
1418
1419 EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {
1420 const target = SelectorEngine.getElementFromSelector(this);
1421 if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
1422 return;
1423 }
1424 event.preventDefault();
1425 const carousel = Carousel.getOrCreateInstance(target);
1426 const slideIndex = this.getAttribute('data-bs-slide-to');
1427 if (slideIndex) {
1428 carousel.to(slideIndex);
1429 carousel._maybeEnableCycle();
1430 return;
1431 }
1432 if (Manipulator.getDataAttribute(this, 'slide') === 'next') {
1433 carousel.next();
1434 carousel._maybeEnableCycle();
1435 return;
1436 }
1437 carousel.prev();
1438 carousel._maybeEnableCycle();
1439 });
1440 EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
1441 const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
1442 for (const carousel of carousels) {
1443 Carousel.getOrCreateInstance(carousel);
1444 }
1445 });
1446
1447 /**
1448 * jQuery
1449 */
1450
1451 defineJQueryPlugin(Carousel);
1452
1453 /**
1454 * --------------------------------------------------------------------------
1455 * Bootstrap collapse.js
1456 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1457 * --------------------------------------------------------------------------
1458 */
1459
1460
1461 /**
1462 * Constants
1463 */
1464
1465 const NAME$b = 'collapse';
1466 const DATA_KEY$7 = 'bs.collapse';
1467 const EVENT_KEY$7 = `.${DATA_KEY$7}`;
1468 const DATA_API_KEY$4 = '.data-api';
1469 const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
1470 const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
1471 const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
1472 const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
1473 const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
1474 const CLASS_NAME_SHOW$7 = 'show';
1475 const CLASS_NAME_COLLAPSE = 'collapse';
1476 const CLASS_NAME_COLLAPSING = 'collapsing';
1477 const CLASS_NAME_COLLAPSED = 'collapsed';
1478 const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
1479 const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1480 const WIDTH = 'width';
1481 const HEIGHT = 'height';
1482 const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
1483 const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
1484 const Default$a = {
1485 parent: null,
1486 toggle: true
1487 };
1488 const DefaultType$a = {
1489 parent: '(null|element)',
1490 toggle: 'boolean'
1491 };
1492
1493 /**
1494 * Class definition
1495 */
1496
1497 class Collapse extends BaseComponent {
1498 constructor(element, config) {
1499 super(element, config);
1500 this._isTransitioning = false;
1501 this._triggerArray = [];
1502 const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1503 for (const elem of toggleList) {
1504 const selector = SelectorEngine.getSelectorFromElement(elem);
1505 const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
1506 if (selector !== null && filterElement.length) {
1507 this._triggerArray.push(elem);
1508 }
1509 }
1510 this._initializeChildren();
1511 if (!this._config.parent) {
1512 this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1513 }
1514 if (this._config.toggle) {
1515 this.toggle();
1516 }
1517 }
1518
1519 // Getters
1520 static get Default() {
1521 return Default$a;
1522 }
1523 static get DefaultType() {
1524 return DefaultType$a;
1525 }
1526 static get NAME() {
1527 return NAME$b;
1528 }
1529
1530 // Public
1531 toggle() {
1532 if (this._isShown()) {
1533 this.hide();
1534 } else {
1535 this.show();
1536 }
1537 }
1538 show() {
1539 if (this._isTransitioning || this._isShown()) {
1540 return;
1541 }
1542 let activeChildren = [];
1543
1544 // find active children
1545 if (this._config.parent) {
1546 activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
1547 toggle: false
1548 }));
1549 }
1550 if (activeChildren.length && activeChildren[0]._isTransitioning) {
1551 return;
1552 }
1553 const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
1554 if (startEvent.defaultPrevented) {
1555 return;
1556 }
1557 for (const activeInstance of activeChildren) {
1558 activeInstance.hide();
1559 }
1560 const dimension = this._getDimension();
1561 this._element.classList.remove(CLASS_NAME_COLLAPSE);
1562 this._element.classList.add(CLASS_NAME_COLLAPSING);
1563 this._element.style[dimension] = 0;
1564 this._addAriaAndCollapsedClass(this._triggerArray, true);
1565 this._isTransitioning = true;
1566 const complete = () => {
1567 this._isTransitioning = false;
1568 this._element.classList.remove(CLASS_NAME_COLLAPSING);
1569 this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1570 this._element.style[dimension] = '';
1571 EventHandler.trigger(this._element, EVENT_SHOWN$6);
1572 };
1573 const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1574 const scrollSize = `scroll${capitalizedDimension}`;
1575 this._queueCallback(complete, this._element, true);
1576 this._element.style[dimension] = `${this._element[scrollSize]}px`;
1577 }
1578 hide() {
1579 if (this._isTransitioning || !this._isShown()) {
1580 return;
1581 }
1582 const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
1583 if (startEvent.defaultPrevented) {
1584 return;
1585 }
1586 const dimension = this._getDimension();
1587 this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
1588 reflow(this._element);
1589 this._element.classList.add(CLASS_NAME_COLLAPSING);
1590 this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1591 for (const trigger of this._triggerArray) {
1592 const element = SelectorEngine.getElementFromSelector(trigger);
1593 if (element && !this._isShown(element)) {
1594 this._addAriaAndCollapsedClass([trigger], false);
1595 }
1596 }
1597 this._isTransitioning = true;
1598 const complete = () => {
1599 this._isTransitioning = false;
1600 this._element.classList.remove(CLASS_NAME_COLLAPSING);
1601 this._element.classList.add(CLASS_NAME_COLLAPSE);
1602 EventHandler.trigger(this._element, EVENT_HIDDEN$6);
1603 };
1604 this._element.style[dimension] = '';
1605 this._queueCallback(complete, this._element, true);
1606 }
1607 _isShown(element = this._element) {
1608 return element.classList.contains(CLASS_NAME_SHOW$7);
1609 }
1610
1611 // Private
1612 _configAfterMerge(config) {
1613 config.toggle = Boolean(config.toggle); // Coerce string values
1614 config.parent = getElement(config.parent);
1615 return config;
1616 }
1617 _getDimension() {
1618 return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1619 }
1620 _initializeChildren() {
1621 if (!this._config.parent) {
1622 return;
1623 }
1624 const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
1625 for (const element of children) {
1626 const selected = SelectorEngine.getElementFromSelector(element);
1627 if (selected) {
1628 this._addAriaAndCollapsedClass([element], this._isShown(selected));
1629 }
1630 }
1631 }
1632 _getFirstLevelChildren(selector) {
1633 const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
1634 // remove children if greater depth
1635 return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));
1636 }
1637 _addAriaAndCollapsedClass(triggerArray, isOpen) {
1638 if (!triggerArray.length) {
1639 return;
1640 }
1641 for (const element of triggerArray) {
1642 element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
1643 element.setAttribute('aria-expanded', isOpen);
1644 }
1645 }
1646
1647 // Static
1648 static jQueryInterface(config) {
1649 const _config = {};
1650 if (typeof config === 'string' && /show|hide/.test(config)) {
1651 _config.toggle = false;
1652 }
1653 return this.each(function () {
1654 const data = Collapse.getOrCreateInstance(this, _config);
1655 if (typeof config === 'string') {
1656 if (typeof data[config] === 'undefined') {
1657 throw new TypeError(`No method named "${config}"`);
1658 }
1659 data[config]();
1660 }
1661 });
1662 }
1663 }
1664
1665 /**
1666 * Data API implementation
1667 */
1668
1669 EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
1670 // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
1671 if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
1672 event.preventDefault();
1673 }
1674 for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
1675 Collapse.getOrCreateInstance(element, {
1676 toggle: false
1677 }).toggle();
1678 }
1679 });
1680
1681 /**
1682 * jQuery
1683 */
1684
1685 defineJQueryPlugin(Collapse);
1686
1687 var top = 'top';
1688 var bottom = 'bottom';
1689 var right = 'right';
1690 var left = 'left';
1691 var auto = 'auto';
1692 var basePlacements = [top, bottom, right, left];
1693 var start = 'start';
1694 var end = 'end';
1695 var clippingParents = 'clippingParents';
1696 var viewport = 'viewport';
1697 var popper = 'popper';
1698 var reference = 'reference';
1699 var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {
1700 return acc.concat([placement + "-" + start, placement + "-" + end]);
1701 }, []);
1702 var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {
1703 return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
1704 }, []); // modifiers that need to read the DOM
1705
1706 var beforeRead = 'beforeRead';
1707 var read = 'read';
1708 var afterRead = 'afterRead'; // pure-logic modifiers
1709
1710 var beforeMain = 'beforeMain';
1711 var main = 'main';
1712 var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)
1713
1714 var beforeWrite = 'beforeWrite';
1715 var write = 'write';
1716 var afterWrite = 'afterWrite';
1717 var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
1718
1719 function getNodeName(element) {
1720 return element ? (element.nodeName || '').toLowerCase() : null;
1721 }
1722
1723 function getWindow(node) {
1724 if (node == null) {
1725 return window;
1726 }
1727
1728 if (node.toString() !== '[object Window]') {
1729 var ownerDocument = node.ownerDocument;
1730 return ownerDocument ? ownerDocument.defaultView || window : window;
1731 }
1732
1733 return node;
1734 }
1735
1736 function isElement(node) {
1737 var OwnElement = getWindow(node).Element;
1738 return node instanceof OwnElement || node instanceof Element;
1739 }
1740
1741 function isHTMLElement(node) {
1742 var OwnElement = getWindow(node).HTMLElement;
1743 return node instanceof OwnElement || node instanceof HTMLElement;
1744 }
1745
1746 function isShadowRoot(node) {
1747 // IE 11 has no ShadowRoot
1748 if (typeof ShadowRoot === 'undefined') {
1749 return false;
1750 }
1751
1752 var OwnElement = getWindow(node).ShadowRoot;
1753 return node instanceof OwnElement || node instanceof ShadowRoot;
1754 }
1755
1756 // and applies them to the HTMLElements such as popper and arrow
1757
1758 function applyStyles(_ref) {
1759 var state = _ref.state;
1760 Object.keys(state.elements).forEach(function (name) {
1761 var style = state.styles[name] || {};
1762 var attributes = state.attributes[name] || {};
1763 var element = state.elements[name]; // arrow is optional + virtual elements
1764
1765 if (!isHTMLElement(element) || !getNodeName(element)) {
1766 return;
1767 } // Flow doesn't support to extend this property, but it's the most
1768 // effective way to apply styles to an HTMLElement
1769 // $FlowFixMe[cannot-write]
1770
1771
1772 Object.assign(element.style, style);
1773 Object.keys(attributes).forEach(function (name) {
1774 var value = attributes[name];
1775
1776 if (value === false) {
1777 element.removeAttribute(name);
1778 } else {
1779 element.setAttribute(name, value === true ? '' : value);
1780 }
1781 });
1782 });
1783 }
1784
1785 function effect$2(_ref2) {
1786 var state = _ref2.state;
1787 var initialStyles = {
1788 popper: {
1789 position: state.options.strategy,
1790 left: '0',
1791 top: '0',
1792 margin: '0'
1793 },
1794 arrow: {
1795 position: 'absolute'
1796 },
1797 reference: {}
1798 };
1799 Object.assign(state.elements.popper.style, initialStyles.popper);
1800 state.styles = initialStyles;
1801
1802 if (state.elements.arrow) {
1803 Object.assign(state.elements.arrow.style, initialStyles.arrow);
1804 }
1805
1806 return function () {
1807 Object.keys(state.elements).forEach(function (name) {
1808 var element = state.elements[name];
1809 var attributes = state.attributes[name] || {};
1810 var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them
1811
1812 var style = styleProperties.reduce(function (style, property) {
1813 style[property] = '';
1814 return style;
1815 }, {}); // arrow is optional + virtual elements
1816
1817 if (!isHTMLElement(element) || !getNodeName(element)) {
1818 return;
1819 }
1820
1821 Object.assign(element.style, style);
1822 Object.keys(attributes).forEach(function (attribute) {
1823 element.removeAttribute(attribute);
1824 });
1825 });
1826 };
1827 } // eslint-disable-next-line import/no-unused-modules
1828
1829
1830 const applyStyles$1 = {
1831 name: 'applyStyles',
1832 enabled: true,
1833 phase: 'write',
1834 fn: applyStyles,
1835 effect: effect$2,
1836 requires: ['computeStyles']
1837 };
1838
1839 function getBasePlacement(placement) {
1840 return placement.split('-')[0];
1841 }
1842
1843 var max = Math.max;
1844 var min = Math.min;
1845 var round = Math.round;
1846
1847 function getUAString() {
1848 var uaData = navigator.userAgentData;
1849
1850 if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {
1851 return uaData.brands.map(function (item) {
1852 return item.brand + "/" + item.version;
1853 }).join(' ');
1854 }
1855
1856 return navigator.userAgent;
1857 }
1858
1859 function isLayoutViewport() {
1860 return !/^((?!chrome|android).)*safari/i.test(getUAString());
1861 }
1862
1863 function getBoundingClientRect(element, includeScale, isFixedStrategy) {
1864 if (includeScale === void 0) {
1865 includeScale = false;
1866 }
1867
1868 if (isFixedStrategy === void 0) {
1869 isFixedStrategy = false;
1870 }
1871
1872 var clientRect = element.getBoundingClientRect();
1873 var scaleX = 1;
1874 var scaleY = 1;
1875
1876 if (includeScale && isHTMLElement(element)) {
1877 scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
1878 scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
1879 }
1880
1881 var _ref = isElement(element) ? getWindow(element) : window,
1882 visualViewport = _ref.visualViewport;
1883
1884 var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
1885 var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
1886 var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
1887 var width = clientRect.width / scaleX;
1888 var height = clientRect.height / scaleY;
1889 return {
1890 width: width,
1891 height: height,
1892 top: y,
1893 right: x + width,
1894 bottom: y + height,
1895 left: x,
1896 x: x,
1897 y: y
1898 };
1899 }
1900
1901 // means it doesn't take into account transforms.
1902
1903 function getLayoutRect(element) {
1904 var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.
1905 // Fixes https://github.com/popperjs/popper-core/issues/1223
1906
1907 var width = element.offsetWidth;
1908 var height = element.offsetHeight;
1909
1910 if (Math.abs(clientRect.width - width) <= 1) {
1911 width = clientRect.width;
1912 }
1913
1914 if (Math.abs(clientRect.height - height) <= 1) {
1915 height = clientRect.height;
1916 }
1917
1918 return {
1919 x: element.offsetLeft,
1920 y: element.offsetTop,
1921 width: width,
1922 height: height
1923 };
1924 }
1925
1926 function contains(parent, child) {
1927 var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method
1928
1929 if (parent.contains(child)) {
1930 return true;
1931 } // then fallback to custom implementation with Shadow DOM support
1932 else if (rootNode && isShadowRoot(rootNode)) {
1933 var next = child;
1934
1935 do {
1936 if (next && parent.isSameNode(next)) {
1937 return true;
1938 } // $FlowFixMe[prop-missing]: need a better way to handle this...
1939
1940
1941 next = next.parentNode || next.host;
1942 } while (next);
1943 } // Give up, the result is false
1944
1945
1946 return false;
1947 }
1948
1949 function getComputedStyle$1(element) {
1950 return getWindow(element).getComputedStyle(element);
1951 }
1952
1953 function isTableElement(element) {
1954 return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;
1955 }
1956
1957 function getDocumentElement(element) {
1958 // $FlowFixMe[incompatible-return]: assume body is always available
1959 return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]
1960 element.document) || window.document).documentElement;
1961 }
1962
1963 function getParentNode(element) {
1964 if (getNodeName(element) === 'html') {
1965 return element;
1966 }
1967
1968 return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle
1969 // $FlowFixMe[incompatible-return]
1970 // $FlowFixMe[prop-missing]
1971 element.assignedSlot || // step into the shadow DOM of the parent of a slotted node
1972 element.parentNode || ( // DOM Element detected
1973 isShadowRoot(element) ? element.host : null) || // ShadowRoot detected
1974 // $FlowFixMe[incompatible-call]: HTMLElement is a Node
1975 getDocumentElement(element) // fallback
1976
1977 );
1978 }
1979
1980 function getTrueOffsetParent(element) {
1981 if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837
1982 getComputedStyle$1(element).position === 'fixed') {
1983 return null;
1984 }
1985
1986 return element.offsetParent;
1987 } // `.offsetParent` reports `null` for fixed elements, while absolute elements
1988 // return the containing block
1989
1990
1991 function getContainingBlock(element) {
1992 var isFirefox = /firefox/i.test(getUAString());
1993 var isIE = /Trident/i.test(getUAString());
1994
1995 if (isIE && isHTMLElement(element)) {
1996 // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport
1997 var elementCss = getComputedStyle$1(element);
1998
1999 if (elementCss.position === 'fixed') {
2000 return null;
2001 }
2002 }
2003
2004 var currentNode = getParentNode(element);
2005
2006 if (isShadowRoot(currentNode)) {
2007 currentNode = currentNode.host;
2008 }
2009
2010 while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {
2011 var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that
2012 // create a containing block.
2013 // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
2014
2015 if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {
2016 return currentNode;
2017 } else {
2018 currentNode = currentNode.parentNode;
2019 }
2020 }
2021
2022 return null;
2023 } // Gets the closest ancestor positioned element. Handles some edge cases,
2024 // such as table ancestors and cross browser bugs.
2025
2026
2027 function getOffsetParent(element) {
2028 var window = getWindow(element);
2029 var offsetParent = getTrueOffsetParent(element);
2030
2031 while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') {
2032 offsetParent = getTrueOffsetParent(offsetParent);
2033 }
2034
2035 if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) {
2036 return window;
2037 }
2038
2039 return offsetParent || getContainingBlock(element) || window;
2040 }
2041
2042 function getMainAxisFromPlacement(placement) {
2043 return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';
2044 }
2045
2046 function within(min$1, value, max$1) {
2047 return max(min$1, min(value, max$1));
2048 }
2049 function withinMaxClamp(min, value, max) {
2050 var v = within(min, value, max);
2051 return v > max ? max : v;
2052 }
2053
2054 function getFreshSideObject() {
2055 return {
2056 top: 0,
2057 right: 0,
2058 bottom: 0,
2059 left: 0
2060 };
2061 }
2062
2063 function mergePaddingObject(paddingObject) {
2064 return Object.assign({}, getFreshSideObject(), paddingObject);
2065 }
2066
2067 function expandToHashMap(value, keys) {
2068 return keys.reduce(function (hashMap, key) {
2069 hashMap[key] = value;
2070 return hashMap;
2071 }, {});
2072 }
2073
2074 var toPaddingObject = function toPaddingObject(padding, state) {
2075 padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {
2076 placement: state.placement
2077 })) : padding;
2078 return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
2079 };
2080
2081 function arrow(_ref) {
2082 var _state$modifiersData$;
2083
2084 var state = _ref.state,
2085 name = _ref.name,
2086 options = _ref.options;
2087 var arrowElement = state.elements.arrow;
2088 var popperOffsets = state.modifiersData.popperOffsets;
2089 var basePlacement = getBasePlacement(state.placement);
2090 var axis = getMainAxisFromPlacement(basePlacement);
2091 var isVertical = [left, right].indexOf(basePlacement) >= 0;
2092 var len = isVertical ? 'height' : 'width';
2093
2094 if (!arrowElement || !popperOffsets) {
2095 return;
2096 }
2097
2098 var paddingObject = toPaddingObject(options.padding, state);
2099 var arrowRect = getLayoutRect(arrowElement);
2100 var minProp = axis === 'y' ? top : left;
2101 var maxProp = axis === 'y' ? bottom : right;
2102 var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];
2103 var startDiff = popperOffsets[axis] - state.rects.reference[axis];
2104 var arrowOffsetParent = getOffsetParent(arrowElement);
2105 var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
2106 var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is
2107 // outside of the popper bounds
2108
2109 var min = paddingObject[minProp];
2110 var max = clientSize - arrowRect[len] - paddingObject[maxProp];
2111 var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
2112 var offset = within(min, center, max); // Prevents breaking syntax highlighting...
2113
2114 var axisProp = axis;
2115 state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);
2116 }
2117
2118 function effect$1(_ref2) {
2119 var state = _ref2.state,
2120 options = _ref2.options;
2121 var _options$element = options.element,
2122 arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;
2123
2124 if (arrowElement == null) {
2125 return;
2126 } // CSS selector
2127
2128
2129 if (typeof arrowElement === 'string') {
2130 arrowElement = state.elements.popper.querySelector(arrowElement);
2131
2132 if (!arrowElement) {
2133 return;
2134 }
2135 }
2136
2137 if (!contains(state.elements.popper, arrowElement)) {
2138 return;
2139 }
2140
2141 state.elements.arrow = arrowElement;
2142 } // eslint-disable-next-line import/no-unused-modules
2143
2144
2145 const arrow$1 = {
2146 name: 'arrow',
2147 enabled: true,
2148 phase: 'main',
2149 fn: arrow,
2150 effect: effect$1,
2151 requires: ['popperOffsets'],
2152 requiresIfExists: ['preventOverflow']
2153 };
2154
2155 function getVariation(placement) {
2156 return placement.split('-')[1];
2157 }
2158
2159 var unsetSides = {
2160 top: 'auto',
2161 right: 'auto',
2162 bottom: 'auto',
2163 left: 'auto'
2164 }; // Round the offsets to the nearest suitable subpixel based on the DPR.
2165 // Zooming can change the DPR, but it seems to report a value that will
2166 // cleanly divide the values into the appropriate subpixels.
2167
2168 function roundOffsetsByDPR(_ref, win) {
2169 var x = _ref.x,
2170 y = _ref.y;
2171 var dpr = win.devicePixelRatio || 1;
2172 return {
2173 x: round(x * dpr) / dpr || 0,
2174 y: round(y * dpr) / dpr || 0
2175 };
2176 }
2177
2178 function mapToStyles(_ref2) {
2179 var _Object$assign2;
2180
2181 var popper = _ref2.popper,
2182 popperRect = _ref2.popperRect,
2183 placement = _ref2.placement,
2184 variation = _ref2.variation,
2185 offsets = _ref2.offsets,
2186 position = _ref2.position,
2187 gpuAcceleration = _ref2.gpuAcceleration,
2188 adaptive = _ref2.adaptive,
2189 roundOffsets = _ref2.roundOffsets,
2190 isFixed = _ref2.isFixed;
2191 var _offsets$x = offsets.x,
2192 x = _offsets$x === void 0 ? 0 : _offsets$x,
2193 _offsets$y = offsets.y,
2194 y = _offsets$y === void 0 ? 0 : _offsets$y;
2195
2196 var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({
2197 x: x,
2198 y: y
2199 }) : {
2200 x: x,
2201 y: y
2202 };
2203
2204 x = _ref3.x;
2205 y = _ref3.y;
2206 var hasX = offsets.hasOwnProperty('x');
2207 var hasY = offsets.hasOwnProperty('y');
2208 var sideX = left;
2209 var sideY = top;
2210 var win = window;
2211
2212 if (adaptive) {
2213 var offsetParent = getOffsetParent(popper);
2214 var heightProp = 'clientHeight';
2215 var widthProp = 'clientWidth';
2216
2217 if (offsetParent === getWindow(popper)) {
2218 offsetParent = getDocumentElement(popper);
2219
2220 if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') {
2221 heightProp = 'scrollHeight';
2222 widthProp = 'scrollWidth';
2223 }
2224 } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it
2225
2226
2227 offsetParent = offsetParent;
2228
2229 if (placement === top || (placement === left || placement === right) && variation === end) {
2230 sideY = bottom;
2231 var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]
2232 offsetParent[heightProp];
2233 y -= offsetY - popperRect.height;
2234 y *= gpuAcceleration ? 1 : -1;
2235 }
2236
2237 if (placement === left || (placement === top || placement === bottom) && variation === end) {
2238 sideX = right;
2239 var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]
2240 offsetParent[widthProp];
2241 x -= offsetX - popperRect.width;
2242 x *= gpuAcceleration ? 1 : -1;
2243 }
2244 }
2245
2246 var commonStyles = Object.assign({
2247 position: position
2248 }, adaptive && unsetSides);
2249
2250 var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
2251 x: x,
2252 y: y
2253 }, getWindow(popper)) : {
2254 x: x,
2255 y: y
2256 };
2257
2258 x = _ref4.x;
2259 y = _ref4.y;
2260
2261 if (gpuAcceleration) {
2262 var _Object$assign;
2263
2264 return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
2265 }
2266
2267 return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
2268 }
2269
2270 function computeStyles(_ref5) {
2271 var state = _ref5.state,
2272 options = _ref5.options;
2273 var _options$gpuAccelerat = options.gpuAcceleration,
2274 gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,
2275 _options$adaptive = options.adaptive,
2276 adaptive = _options$adaptive === void 0 ? true : _options$adaptive,
2277 _options$roundOffsets = options.roundOffsets,
2278 roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
2279 var commonStyles = {
2280 placement: getBasePlacement(state.placement),
2281 variation: getVariation(state.placement),
2282 popper: state.elements.popper,
2283 popperRect: state.rects.popper,
2284 gpuAcceleration: gpuAcceleration,
2285 isFixed: state.options.strategy === 'fixed'
2286 };
2287
2288 if (state.modifiersData.popperOffsets != null) {
2289 state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
2290 offsets: state.modifiersData.popperOffsets,
2291 position: state.options.strategy,
2292 adaptive: adaptive,
2293 roundOffsets: roundOffsets
2294 })));
2295 }
2296
2297 if (state.modifiersData.arrow != null) {
2298 state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
2299 offsets: state.modifiersData.arrow,
2300 position: 'absolute',
2301 adaptive: false,
2302 roundOffsets: roundOffsets
2303 })));
2304 }
2305
2306 state.attributes.popper = Object.assign({}, state.attributes.popper, {
2307 'data-popper-placement': state.placement
2308 });
2309 } // eslint-disable-next-line import/no-unused-modules
2310
2311
2312 const computeStyles$1 = {
2313 name: 'computeStyles',
2314 enabled: true,
2315 phase: 'beforeWrite',
2316 fn: computeStyles,
2317 data: {}
2318 };
2319
2320 var passive = {
2321 passive: true
2322 };
2323
2324 function effect(_ref) {
2325 var state = _ref.state,
2326 instance = _ref.instance,
2327 options = _ref.options;
2328 var _options$scroll = options.scroll,
2329 scroll = _options$scroll === void 0 ? true : _options$scroll,
2330 _options$resize = options.resize,
2331 resize = _options$resize === void 0 ? true : _options$resize;
2332 var window = getWindow(state.elements.popper);
2333 var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
2334
2335 if (scroll) {
2336 scrollParents.forEach(function (scrollParent) {
2337 scrollParent.addEventListener('scroll', instance.update, passive);
2338 });
2339 }
2340
2341 if (resize) {
2342 window.addEventListener('resize', instance.update, passive);
2343 }
2344
2345 return function () {
2346 if (scroll) {
2347 scrollParents.forEach(function (scrollParent) {
2348 scrollParent.removeEventListener('scroll', instance.update, passive);
2349 });
2350 }
2351
2352 if (resize) {
2353 window.removeEventListener('resize', instance.update, passive);
2354 }
2355 };
2356 } // eslint-disable-next-line import/no-unused-modules
2357
2358
2359 const eventListeners = {
2360 name: 'eventListeners',
2361 enabled: true,
2362 phase: 'write',
2363 fn: function fn() {},
2364 effect: effect,
2365 data: {}
2366 };
2367
2368 var hash$1 = {
2369 left: 'right',
2370 right: 'left',
2371 bottom: 'top',
2372 top: 'bottom'
2373 };
2374 function getOppositePlacement(placement) {
2375 return placement.replace(/left|right|bottom|top/g, function (matched) {
2376 return hash$1[matched];
2377 });
2378 }
2379
2380 var hash = {
2381 start: 'end',
2382 end: 'start'
2383 };
2384 function getOppositeVariationPlacement(placement) {
2385 return placement.replace(/start|end/g, function (matched) {
2386 return hash[matched];
2387 });
2388 }
2389
2390 function getWindowScroll(node) {
2391 var win = getWindow(node);
2392 var scrollLeft = win.pageXOffset;
2393 var scrollTop = win.pageYOffset;
2394 return {
2395 scrollLeft: scrollLeft,
2396 scrollTop: scrollTop
2397 };
2398 }
2399
2400 function getWindowScrollBarX(element) {
2401 // If <html> has a CSS width greater than the viewport, then this will be
2402 // incorrect for RTL.
2403 // Popper 1 is broken in this case and never had a bug report so let's assume
2404 // it's not an issue. I don't think anyone ever specifies width on <html>
2405 // anyway.
2406 // Browsers where the left scrollbar doesn't cause an issue report `0` for
2407 // this (e.g. Edge 2019, IE11, Safari)
2408 return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
2409 }
2410
2411 function getViewportRect(element, strategy) {
2412 var win = getWindow(element);
2413 var html = getDocumentElement(element);
2414 var visualViewport = win.visualViewport;
2415 var width = html.clientWidth;
2416 var height = html.clientHeight;
2417 var x = 0;
2418 var y = 0;
2419
2420 if (visualViewport) {
2421 width = visualViewport.width;
2422 height = visualViewport.height;
2423 var layoutViewport = isLayoutViewport();
2424
2425 if (layoutViewport || !layoutViewport && strategy === 'fixed') {
2426 x = visualViewport.offsetLeft;
2427 y = visualViewport.offsetTop;
2428 }
2429 }
2430
2431 return {
2432 width: width,
2433 height: height,
2434 x: x + getWindowScrollBarX(element),
2435 y: y
2436 };
2437 }
2438
2439 // of the `<html>` and `<body>` rect bounds if horizontally scrollable
2440
2441 function getDocumentRect(element) {
2442 var _element$ownerDocumen;
2443
2444 var html = getDocumentElement(element);
2445 var winScroll = getWindowScroll(element);
2446 var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
2447 var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
2448 var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
2449 var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
2450 var y = -winScroll.scrollTop;
2451
2452 if (getComputedStyle$1(body || html).direction === 'rtl') {
2453 x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
2454 }
2455
2456 return {
2457 width: width,
2458 height: height,
2459 x: x,
2460 y: y
2461 };
2462 }
2463
2464 function isScrollParent(element) {
2465 // Firefox wants us to check `-x` and `-y` variations as well
2466 var _getComputedStyle = getComputedStyle$1(element),
2467 overflow = _getComputedStyle.overflow,
2468 overflowX = _getComputedStyle.overflowX,
2469 overflowY = _getComputedStyle.overflowY;
2470
2471 return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
2472 }
2473
2474 function getScrollParent(node) {
2475 if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {
2476 // $FlowFixMe[incompatible-return]: assume body is always available
2477 return node.ownerDocument.body;
2478 }
2479
2480 if (isHTMLElement(node) && isScrollParent(node)) {
2481 return node;
2482 }
2483
2484 return getScrollParent(getParentNode(node));
2485 }
2486
2487 /*
2488 given a DOM element, return the list of all scroll parents, up the list of ancesors
2489 until we get to the top window object. This list is what we attach scroll listeners
2490 to, because if any of these parent elements scroll, we'll need to re-calculate the
2491 reference element's position.
2492 */
2493
2494 function listScrollParents(element, list) {
2495 var _element$ownerDocumen;
2496
2497 if (list === void 0) {
2498 list = [];
2499 }
2500
2501 var scrollParent = getScrollParent(element);
2502 var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
2503 var win = getWindow(scrollParent);
2504 var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
2505 var updatedList = list.concat(target);
2506 return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here
2507 updatedList.concat(listScrollParents(getParentNode(target)));
2508 }
2509
2510 function rectToClientRect(rect) {
2511 return Object.assign({}, rect, {
2512 left: rect.x,
2513 top: rect.y,
2514 right: rect.x + rect.width,
2515 bottom: rect.y + rect.height
2516 });
2517 }
2518
2519 function getInnerBoundingClientRect(element, strategy) {
2520 var rect = getBoundingClientRect(element, false, strategy === 'fixed');
2521 rect.top = rect.top + element.clientTop;
2522 rect.left = rect.left + element.clientLeft;
2523 rect.bottom = rect.top + element.clientHeight;
2524 rect.right = rect.left + element.clientWidth;
2525 rect.width = element.clientWidth;
2526 rect.height = element.clientHeight;
2527 rect.x = rect.left;
2528 rect.y = rect.top;
2529 return rect;
2530 }
2531
2532 function getClientRectFromMixedType(element, clippingParent, strategy) {
2533 return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
2534 } // A "clipping parent" is an overflowable container with the characteristic of
2535 // clipping (or hiding) overflowing elements with a position different from
2536 // `initial`
2537
2538
2539 function getClippingParents(element) {
2540 var clippingParents = listScrollParents(getParentNode(element));
2541 var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0;
2542 var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
2543
2544 if (!isElement(clipperElement)) {
2545 return [];
2546 } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
2547
2548
2549 return clippingParents.filter(function (clippingParent) {
2550 return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
2551 });
2552 } // Gets the maximum area that the element is visible in due to any number of
2553 // clipping parents
2554
2555
2556 function getClippingRect(element, boundary, rootBoundary, strategy) {
2557 var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);
2558 var clippingParents = [].concat(mainClippingParents, [rootBoundary]);
2559 var firstClippingParent = clippingParents[0];
2560 var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {
2561 var rect = getClientRectFromMixedType(element, clippingParent, strategy);
2562 accRect.top = max(rect.top, accRect.top);
2563 accRect.right = min(rect.right, accRect.right);
2564 accRect.bottom = min(rect.bottom, accRect.bottom);
2565 accRect.left = max(rect.left, accRect.left);
2566 return accRect;
2567 }, getClientRectFromMixedType(element, firstClippingParent, strategy));
2568 clippingRect.width = clippingRect.right - clippingRect.left;
2569 clippingRect.height = clippingRect.bottom - clippingRect.top;
2570 clippingRect.x = clippingRect.left;
2571 clippingRect.y = clippingRect.top;
2572 return clippingRect;
2573 }
2574
2575 function computeOffsets(_ref) {
2576 var reference = _ref.reference,
2577 element = _ref.element,
2578 placement = _ref.placement;
2579 var basePlacement = placement ? getBasePlacement(placement) : null;
2580 var variation = placement ? getVariation(placement) : null;
2581 var commonX = reference.x + reference.width / 2 - element.width / 2;
2582 var commonY = reference.y + reference.height / 2 - element.height / 2;
2583 var offsets;
2584
2585 switch (basePlacement) {
2586 case top:
2587 offsets = {
2588 x: commonX,
2589 y: reference.y - element.height
2590 };
2591 break;
2592
2593 case bottom:
2594 offsets = {
2595 x: commonX,
2596 y: reference.y + reference.height
2597 };
2598 break;
2599
2600 case right:
2601 offsets = {
2602 x: reference.x + reference.width,
2603 y: commonY
2604 };
2605 break;
2606
2607 case left:
2608 offsets = {
2609 x: reference.x - element.width,
2610 y: commonY
2611 };
2612 break;
2613
2614 default:
2615 offsets = {
2616 x: reference.x,
2617 y: reference.y
2618 };
2619 }
2620
2621 var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
2622
2623 if (mainAxis != null) {
2624 var len = mainAxis === 'y' ? 'height' : 'width';
2625
2626 switch (variation) {
2627 case start:
2628 offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
2629 break;
2630
2631 case end:
2632 offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
2633 break;
2634 }
2635 }
2636
2637 return offsets;
2638 }
2639
2640 function detectOverflow(state, options) {
2641 if (options === void 0) {
2642 options = {};
2643 }
2644
2645 var _options = options,
2646 _options$placement = _options.placement,
2647 placement = _options$placement === void 0 ? state.placement : _options$placement,
2648 _options$strategy = _options.strategy,
2649 strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,
2650 _options$boundary = _options.boundary,
2651 boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,
2652 _options$rootBoundary = _options.rootBoundary,
2653 rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,
2654 _options$elementConte = _options.elementContext,
2655 elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,
2656 _options$altBoundary = _options.altBoundary,
2657 altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
2658 _options$padding = _options.padding,
2659 padding = _options$padding === void 0 ? 0 : _options$padding;
2660 var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
2661 var altContext = elementContext === popper ? reference : popper;
2662 var popperRect = state.rects.popper;
2663 var element = state.elements[altBoundary ? altContext : elementContext];
2664 var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
2665 var referenceClientRect = getBoundingClientRect(state.elements.reference);
2666 var popperOffsets = computeOffsets({
2667 reference: referenceClientRect,
2668 element: popperRect,
2669 strategy: 'absolute',
2670 placement: placement
2671 });
2672 var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));
2673 var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
2674 // 0 or negative = within the clipping rect
2675
2676 var overflowOffsets = {
2677 top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
2678 bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
2679 left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
2680 right: elementClientRect.right - clippingClientRect.right + paddingObject.right
2681 };
2682 var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
2683
2684 if (elementContext === popper && offsetData) {
2685 var offset = offsetData[placement];
2686 Object.keys(overflowOffsets).forEach(function (key) {
2687 var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
2688 var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';
2689 overflowOffsets[key] += offset[axis] * multiply;
2690 });
2691 }
2692
2693 return overflowOffsets;
2694 }
2695
2696 function computeAutoPlacement(state, options) {
2697 if (options === void 0) {
2698 options = {};
2699 }
2700
2701 var _options = options,
2702 placement = _options.placement,
2703 boundary = _options.boundary,
2704 rootBoundary = _options.rootBoundary,
2705 padding = _options.padding,
2706 flipVariations = _options.flipVariations,
2707 _options$allowedAutoP = _options.allowedAutoPlacements,
2708 allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
2709 var variation = getVariation(placement);
2710 var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {
2711 return getVariation(placement) === variation;
2712 }) : basePlacements;
2713 var allowedPlacements = placements$1.filter(function (placement) {
2714 return allowedAutoPlacements.indexOf(placement) >= 0;
2715 });
2716
2717 if (allowedPlacements.length === 0) {
2718 allowedPlacements = placements$1;
2719 } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...
2720
2721
2722 var overflows = allowedPlacements.reduce(function (acc, placement) {
2723 acc[placement] = detectOverflow(state, {
2724 placement: placement,
2725 boundary: boundary,
2726 rootBoundary: rootBoundary,
2727 padding: padding
2728 })[getBasePlacement(placement)];
2729 return acc;
2730 }, {});
2731 return Object.keys(overflows).sort(function (a, b) {
2732 return overflows[a] - overflows[b];
2733 });
2734 }
2735
2736 function getExpandedFallbackPlacements(placement) {
2737 if (getBasePlacement(placement) === auto) {
2738 return [];
2739 }
2740
2741 var oppositePlacement = getOppositePlacement(placement);
2742 return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
2743 }
2744
2745 function flip(_ref) {
2746 var state = _ref.state,
2747 options = _ref.options,
2748 name = _ref.name;
2749
2750 if (state.modifiersData[name]._skip) {
2751 return;
2752 }
2753
2754 var _options$mainAxis = options.mainAxis,
2755 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
2756 _options$altAxis = options.altAxis,
2757 checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,
2758 specifiedFallbackPlacements = options.fallbackPlacements,
2759 padding = options.padding,
2760 boundary = options.boundary,
2761 rootBoundary = options.rootBoundary,
2762 altBoundary = options.altBoundary,
2763 _options$flipVariatio = options.flipVariations,
2764 flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,
2765 allowedAutoPlacements = options.allowedAutoPlacements;
2766 var preferredPlacement = state.options.placement;
2767 var basePlacement = getBasePlacement(preferredPlacement);
2768 var isBasePlacement = basePlacement === preferredPlacement;
2769 var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
2770 var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {
2771 return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {
2772 placement: placement,
2773 boundary: boundary,
2774 rootBoundary: rootBoundary,
2775 padding: padding,
2776 flipVariations: flipVariations,
2777 allowedAutoPlacements: allowedAutoPlacements
2778 }) : placement);
2779 }, []);
2780 var referenceRect = state.rects.reference;
2781 var popperRect = state.rects.popper;
2782 var checksMap = new Map();
2783 var makeFallbackChecks = true;
2784 var firstFittingPlacement = placements[0];
2785
2786 for (var i = 0; i < placements.length; i++) {
2787 var placement = placements[i];
2788
2789 var _basePlacement = getBasePlacement(placement);
2790
2791 var isStartVariation = getVariation(placement) === start;
2792 var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
2793 var len = isVertical ? 'width' : 'height';
2794 var overflow = detectOverflow(state, {
2795 placement: placement,
2796 boundary: boundary,
2797 rootBoundary: rootBoundary,
2798 altBoundary: altBoundary,
2799 padding: padding
2800 });
2801 var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
2802
2803 if (referenceRect[len] > popperRect[len]) {
2804 mainVariationSide = getOppositePlacement(mainVariationSide);
2805 }
2806
2807 var altVariationSide = getOppositePlacement(mainVariationSide);
2808 var checks = [];
2809
2810 if (checkMainAxis) {
2811 checks.push(overflow[_basePlacement] <= 0);
2812 }
2813
2814 if (checkAltAxis) {
2815 checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
2816 }
2817
2818 if (checks.every(function (check) {
2819 return check;
2820 })) {
2821 firstFittingPlacement = placement;
2822 makeFallbackChecks = false;
2823 break;
2824 }
2825
2826 checksMap.set(placement, checks);
2827 }
2828
2829 if (makeFallbackChecks) {
2830 // `2` may be desired in some cases – research later
2831 var numberOfChecks = flipVariations ? 3 : 1;
2832
2833 var _loop = function _loop(_i) {
2834 var fittingPlacement = placements.find(function (placement) {
2835 var checks = checksMap.get(placement);
2836
2837 if (checks) {
2838 return checks.slice(0, _i).every(function (check) {
2839 return check;
2840 });
2841 }
2842 });
2843
2844 if (fittingPlacement) {
2845 firstFittingPlacement = fittingPlacement;
2846 return "break";
2847 }
2848 };
2849
2850 for (var _i = numberOfChecks; _i > 0; _i--) {
2851 var _ret = _loop(_i);
2852
2853 if (_ret === "break") break;
2854 }
2855 }
2856
2857 if (state.placement !== firstFittingPlacement) {
2858 state.modifiersData[name]._skip = true;
2859 state.placement = firstFittingPlacement;
2860 state.reset = true;
2861 }
2862 } // eslint-disable-next-line import/no-unused-modules
2863
2864
2865 const flip$1 = {
2866 name: 'flip',
2867 enabled: true,
2868 phase: 'main',
2869 fn: flip,
2870 requiresIfExists: ['offset'],
2871 data: {
2872 _skip: false
2873 }
2874 };
2875
2876 function getSideOffsets(overflow, rect, preventedOffsets) {
2877 if (preventedOffsets === void 0) {
2878 preventedOffsets = {
2879 x: 0,
2880 y: 0
2881 };
2882 }
2883
2884 return {
2885 top: overflow.top - rect.height - preventedOffsets.y,
2886 right: overflow.right - rect.width + preventedOffsets.x,
2887 bottom: overflow.bottom - rect.height + preventedOffsets.y,
2888 left: overflow.left - rect.width - preventedOffsets.x
2889 };
2890 }
2891
2892 function isAnySideFullyClipped(overflow) {
2893 return [top, right, bottom, left].some(function (side) {
2894 return overflow[side] >= 0;
2895 });
2896 }
2897
2898 function hide(_ref) {
2899 var state = _ref.state,
2900 name = _ref.name;
2901 var referenceRect = state.rects.reference;
2902 var popperRect = state.rects.popper;
2903 var preventedOffsets = state.modifiersData.preventOverflow;
2904 var referenceOverflow = detectOverflow(state, {
2905 elementContext: 'reference'
2906 });
2907 var popperAltOverflow = detectOverflow(state, {
2908 altBoundary: true
2909 });
2910 var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
2911 var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
2912 var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
2913 var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
2914 state.modifiersData[name] = {
2915 referenceClippingOffsets: referenceClippingOffsets,
2916 popperEscapeOffsets: popperEscapeOffsets,
2917 isReferenceHidden: isReferenceHidden,
2918 hasPopperEscaped: hasPopperEscaped
2919 };
2920 state.attributes.popper = Object.assign({}, state.attributes.popper, {
2921 'data-popper-reference-hidden': isReferenceHidden,
2922 'data-popper-escaped': hasPopperEscaped
2923 });
2924 } // eslint-disable-next-line import/no-unused-modules
2925
2926
2927 const hide$1 = {
2928 name: 'hide',
2929 enabled: true,
2930 phase: 'main',
2931 requiresIfExists: ['preventOverflow'],
2932 fn: hide
2933 };
2934
2935 function distanceAndSkiddingToXY(placement, rects, offset) {
2936 var basePlacement = getBasePlacement(placement);
2937 var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
2938
2939 var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {
2940 placement: placement
2941 })) : offset,
2942 skidding = _ref[0],
2943 distance = _ref[1];
2944
2945 skidding = skidding || 0;
2946 distance = (distance || 0) * invertDistance;
2947 return [left, right].indexOf(basePlacement) >= 0 ? {
2948 x: distance,
2949 y: skidding
2950 } : {
2951 x: skidding,
2952 y: distance
2953 };
2954 }
2955
2956 function offset(_ref2) {
2957 var state = _ref2.state,
2958 options = _ref2.options,
2959 name = _ref2.name;
2960 var _options$offset = options.offset,
2961 offset = _options$offset === void 0 ? [0, 0] : _options$offset;
2962 var data = placements.reduce(function (acc, placement) {
2963 acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);
2964 return acc;
2965 }, {});
2966 var _data$state$placement = data[state.placement],
2967 x = _data$state$placement.x,
2968 y = _data$state$placement.y;
2969
2970 if (state.modifiersData.popperOffsets != null) {
2971 state.modifiersData.popperOffsets.x += x;
2972 state.modifiersData.popperOffsets.y += y;
2973 }
2974
2975 state.modifiersData[name] = data;
2976 } // eslint-disable-next-line import/no-unused-modules
2977
2978
2979 const offset$1 = {
2980 name: 'offset',
2981 enabled: true,
2982 phase: 'main',
2983 requires: ['popperOffsets'],
2984 fn: offset
2985 };
2986
2987 function popperOffsets(_ref) {
2988 var state = _ref.state,
2989 name = _ref.name;
2990 // Offsets are the actual position the popper needs to have to be
2991 // properly positioned near its reference element
2992 // This is the most basic placement, and will be adjusted by
2993 // the modifiers in the next step
2994 state.modifiersData[name] = computeOffsets({
2995 reference: state.rects.reference,
2996 element: state.rects.popper,
2997 strategy: 'absolute',
2998 placement: state.placement
2999 });
3000 } // eslint-disable-next-line import/no-unused-modules
3001
3002
3003 const popperOffsets$1 = {
3004 name: 'popperOffsets',
3005 enabled: true,
3006 phase: 'read',
3007 fn: popperOffsets,
3008 data: {}
3009 };
3010
3011 function getAltAxis(axis) {
3012 return axis === 'x' ? 'y' : 'x';
3013 }
3014
3015 function preventOverflow(_ref) {
3016 var state = _ref.state,
3017 options = _ref.options,
3018 name = _ref.name;
3019 var _options$mainAxis = options.mainAxis,
3020 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,
3021 _options$altAxis = options.altAxis,
3022 checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,
3023 boundary = options.boundary,
3024 rootBoundary = options.rootBoundary,
3025 altBoundary = options.altBoundary,
3026 padding = options.padding,
3027 _options$tether = options.tether,
3028 tether = _options$tether === void 0 ? true : _options$tether,
3029 _options$tetherOffset = options.tetherOffset,
3030 tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
3031 var overflow = detectOverflow(state, {
3032 boundary: boundary,
3033 rootBoundary: rootBoundary,
3034 padding: padding,
3035 altBoundary: altBoundary
3036 });
3037 var basePlacement = getBasePlacement(state.placement);
3038 var variation = getVariation(state.placement);
3039 var isBasePlacement = !variation;
3040 var mainAxis = getMainAxisFromPlacement(basePlacement);
3041 var altAxis = getAltAxis(mainAxis);
3042 var popperOffsets = state.modifiersData.popperOffsets;
3043 var referenceRect = state.rects.reference;
3044 var popperRect = state.rects.popper;
3045 var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {
3046 placement: state.placement
3047 })) : tetherOffset;
3048 var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {
3049 mainAxis: tetherOffsetValue,
3050 altAxis: tetherOffsetValue
3051 } : Object.assign({
3052 mainAxis: 0,
3053 altAxis: 0
3054 }, tetherOffsetValue);
3055 var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
3056 var data = {
3057 x: 0,
3058 y: 0
3059 };
3060
3061 if (!popperOffsets) {
3062 return;
3063 }
3064
3065 if (checkMainAxis) {
3066 var _offsetModifierState$;
3067
3068 var mainSide = mainAxis === 'y' ? top : left;
3069 var altSide = mainAxis === 'y' ? bottom : right;
3070 var len = mainAxis === 'y' ? 'height' : 'width';
3071 var offset = popperOffsets[mainAxis];
3072 var min$1 = offset + overflow[mainSide];
3073 var max$1 = offset - overflow[altSide];
3074 var additive = tether ? -popperRect[len] / 2 : 0;
3075 var minLen = variation === start ? referenceRect[len] : popperRect[len];
3076 var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go
3077 // outside the reference bounds
3078
3079 var arrowElement = state.elements.arrow;
3080 var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
3081 width: 0,
3082 height: 0
3083 };
3084 var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();
3085 var arrowPaddingMin = arrowPaddingObject[mainSide];
3086 var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want
3087 // to include its full size in the calculation. If the reference is small
3088 // and near the edge of a boundary, the popper can overflow even if the
3089 // reference is not overflowing as well (e.g. virtual elements with no
3090 // width or height)
3091
3092 var arrowLen = within(0, referenceRect[len], arrowRect[len]);
3093 var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
3094 var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
3095 var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
3096 var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
3097 var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
3098 var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;
3099 var tetherMax = offset + maxOffset - offsetModifierValue;
3100 var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);
3101 popperOffsets[mainAxis] = preventedOffset;
3102 data[mainAxis] = preventedOffset - offset;
3103 }
3104
3105 if (checkAltAxis) {
3106 var _offsetModifierState$2;
3107
3108 var _mainSide = mainAxis === 'x' ? top : left;
3109
3110 var _altSide = mainAxis === 'x' ? bottom : right;
3111
3112 var _offset = popperOffsets[altAxis];
3113
3114 var _len = altAxis === 'y' ? 'height' : 'width';
3115
3116 var _min = _offset + overflow[_mainSide];
3117
3118 var _max = _offset - overflow[_altSide];
3119
3120 var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
3121
3122 var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
3123
3124 var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
3125
3126 var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
3127
3128 var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
3129
3130 popperOffsets[altAxis] = _preventedOffset;
3131 data[altAxis] = _preventedOffset - _offset;
3132 }
3133
3134 state.modifiersData[name] = data;
3135 } // eslint-disable-next-line import/no-unused-modules
3136
3137
3138 const preventOverflow$1 = {
3139 name: 'preventOverflow',
3140 enabled: true,
3141 phase: 'main',
3142 fn: preventOverflow,
3143 requiresIfExists: ['offset']
3144 };
3145
3146 function getHTMLElementScroll(element) {
3147 return {
3148 scrollLeft: element.scrollLeft,
3149 scrollTop: element.scrollTop
3150 };
3151 }
3152
3153 function getNodeScroll(node) {
3154 if (node === getWindow(node) || !isHTMLElement(node)) {
3155 return getWindowScroll(node);
3156 } else {
3157 return getHTMLElementScroll(node);
3158 }
3159 }
3160
3161 function isElementScaled(element) {
3162 var rect = element.getBoundingClientRect();
3163 var scaleX = round(rect.width) / element.offsetWidth || 1;
3164 var scaleY = round(rect.height) / element.offsetHeight || 1;
3165 return scaleX !== 1 || scaleY !== 1;
3166 } // Returns the composite rect of an element relative to its offsetParent.
3167 // Composite means it takes into account transforms as well as layout.
3168
3169
3170 function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
3171 if (isFixed === void 0) {
3172 isFixed = false;
3173 }
3174
3175 var isOffsetParentAnElement = isHTMLElement(offsetParent);
3176 var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
3177 var documentElement = getDocumentElement(offsetParent);
3178 var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
3179 var scroll = {
3180 scrollLeft: 0,
3181 scrollTop: 0
3182 };
3183 var offsets = {
3184 x: 0,
3185 y: 0
3186 };
3187
3188 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
3189 if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078
3190 isScrollParent(documentElement)) {
3191 scroll = getNodeScroll(offsetParent);
3192 }
3193
3194 if (isHTMLElement(offsetParent)) {
3195 offsets = getBoundingClientRect(offsetParent, true);
3196 offsets.x += offsetParent.clientLeft;
3197 offsets.y += offsetParent.clientTop;
3198 } else if (documentElement) {
3199 offsets.x = getWindowScrollBarX(documentElement);
3200 }
3201 }
3202
3203 return {
3204 x: rect.left + scroll.scrollLeft - offsets.x,
3205 y: rect.top + scroll.scrollTop - offsets.y,
3206 width: rect.width,
3207 height: rect.height
3208 };
3209 }
3210
3211 function order(modifiers) {
3212 var map = new Map();
3213 var visited = new Set();
3214 var result = [];
3215 modifiers.forEach(function (modifier) {
3216 map.set(modifier.name, modifier);
3217 }); // On visiting object, check for its dependencies and visit them recursively
3218
3219 function sort(modifier) {
3220 visited.add(modifier.name);
3221 var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
3222 requires.forEach(function (dep) {
3223 if (!visited.has(dep)) {
3224 var depModifier = map.get(dep);
3225
3226 if (depModifier) {
3227 sort(depModifier);
3228 }
3229 }
3230 });
3231 result.push(modifier);
3232 }
3233
3234 modifiers.forEach(function (modifier) {
3235 if (!visited.has(modifier.name)) {
3236 // check for visited object
3237 sort(modifier);
3238 }
3239 });
3240 return result;
3241 }
3242
3243 function orderModifiers(modifiers) {
3244 // order based on dependencies
3245 var orderedModifiers = order(modifiers); // order based on phase
3246
3247 return modifierPhases.reduce(function (acc, phase) {
3248 return acc.concat(orderedModifiers.filter(function (modifier) {
3249 return modifier.phase === phase;
3250 }));
3251 }, []);
3252 }
3253
3254 function debounce(fn) {
3255 var pending;
3256 return function () {
3257 if (!pending) {
3258 pending = new Promise(function (resolve) {
3259 Promise.resolve().then(function () {
3260 pending = undefined;
3261 resolve(fn());
3262 });
3263 });
3264 }
3265
3266 return pending;
3267 };
3268 }
3269
3270 function mergeByName(modifiers) {
3271 var merged = modifiers.reduce(function (merged, current) {
3272 var existing = merged[current.name];
3273 merged[current.name] = existing ? Object.assign({}, existing, current, {
3274 options: Object.assign({}, existing.options, current.options),
3275 data: Object.assign({}, existing.data, current.data)
3276 }) : current;
3277 return merged;
3278 }, {}); // IE11 does not support Object.values
3279
3280 return Object.keys(merged).map(function (key) {
3281 return merged[key];
3282 });
3283 }
3284
3285 var DEFAULT_OPTIONS = {
3286 placement: 'bottom',
3287 modifiers: [],
3288 strategy: 'absolute'
3289 };
3290
3291 function areValidElements() {
3292 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3293 args[_key] = arguments[_key];
3294 }
3295
3296 return !args.some(function (element) {
3297 return !(element && typeof element.getBoundingClientRect === 'function');
3298 });
3299 }
3300
3301 function popperGenerator(generatorOptions) {
3302 if (generatorOptions === void 0) {
3303 generatorOptions = {};
3304 }
3305
3306 var _generatorOptions = generatorOptions,
3307 _generatorOptions$def = _generatorOptions.defaultModifiers,
3308 defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,
3309 _generatorOptions$def2 = _generatorOptions.defaultOptions,
3310 defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
3311 return function createPopper(reference, popper, options) {
3312 if (options === void 0) {
3313 options = defaultOptions;
3314 }
3315
3316 var state = {
3317 placement: 'bottom',
3318 orderedModifiers: [],
3319 options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
3320 modifiersData: {},
3321 elements: {
3322 reference: reference,
3323 popper: popper
3324 },
3325 attributes: {},
3326 styles: {}
3327 };
3328 var effectCleanupFns = [];
3329 var isDestroyed = false;
3330 var instance = {
3331 state: state,
3332 setOptions: function setOptions(setOptionsAction) {
3333 var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
3334 cleanupModifierEffects();
3335 state.options = Object.assign({}, defaultOptions, state.options, options);
3336 state.scrollParents = {
3337 reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],
3338 popper: listScrollParents(popper)
3339 }; // Orders the modifiers based on their dependencies and `phase`
3340 // properties
3341
3342 var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers
3343
3344 state.orderedModifiers = orderedModifiers.filter(function (m) {
3345 return m.enabled;
3346 });
3347 runModifierEffects();
3348 return instance.update();
3349 },
3350 // Sync update – it will always be executed, even if not necessary. This
3351 // is useful for low frequency updates where sync behavior simplifies the
3352 // logic.
3353 // For high frequency updates (e.g. `resize` and `scroll` events), always
3354 // prefer the async Popper#update method
3355 forceUpdate: function forceUpdate() {
3356 if (isDestroyed) {
3357 return;
3358 }
3359
3360 var _state$elements = state.elements,
3361 reference = _state$elements.reference,
3362 popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements
3363 // anymore
3364
3365 if (!areValidElements(reference, popper)) {
3366 return;
3367 } // Store the reference and popper rects to be read by modifiers
3368
3369
3370 state.rects = {
3371 reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),
3372 popper: getLayoutRect(popper)
3373 }; // Modifiers have the ability to reset the current update cycle. The
3374 // most common use case for this is the `flip` modifier changing the
3375 // placement, which then needs to re-run all the modifiers, because the
3376 // logic was previously ran for the previous placement and is therefore
3377 // stale/incorrect
3378
3379 state.reset = false;
3380 state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier
3381 // is filled with the initial data specified by the modifier. This means
3382 // it doesn't persist and is fresh on each update.
3383 // To ensure persistent data, use `${name}#persistent`
3384
3385 state.orderedModifiers.forEach(function (modifier) {
3386 return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
3387 });
3388
3389 for (var index = 0; index < state.orderedModifiers.length; index++) {
3390 if (state.reset === true) {
3391 state.reset = false;
3392 index = -1;
3393 continue;
3394 }
3395
3396 var _state$orderedModifie = state.orderedModifiers[index],
3397 fn = _state$orderedModifie.fn,
3398 _state$orderedModifie2 = _state$orderedModifie.options,
3399 _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,
3400 name = _state$orderedModifie.name;
3401
3402 if (typeof fn === 'function') {
3403 state = fn({
3404 state: state,
3405 options: _options,
3406 name: name,
3407 instance: instance
3408 }) || state;
3409 }
3410 }
3411 },
3412 // Async and optimistically optimized update – it will not be executed if
3413 // not necessary (debounced to run at most once-per-tick)
3414 update: debounce(function () {
3415 return new Promise(function (resolve) {
3416 instance.forceUpdate();
3417 resolve(state);
3418 });
3419 }),
3420 destroy: function destroy() {
3421 cleanupModifierEffects();
3422 isDestroyed = true;
3423 }
3424 };
3425
3426 if (!areValidElements(reference, popper)) {
3427 return instance;
3428 }
3429
3430 instance.setOptions(options).then(function (state) {
3431 if (!isDestroyed && options.onFirstUpdate) {
3432 options.onFirstUpdate(state);
3433 }
3434 }); // Modifiers have the ability to execute arbitrary code before the first
3435 // update cycle runs. They will be executed in the same order as the update
3436 // cycle. This is useful when a modifier adds some persistent data that
3437 // other modifiers need to use, but the modifier is run after the dependent
3438 // one.
3439
3440 function runModifierEffects() {
3441 state.orderedModifiers.forEach(function (_ref) {
3442 var name = _ref.name,
3443 _ref$options = _ref.options,
3444 options = _ref$options === void 0 ? {} : _ref$options,
3445 effect = _ref.effect;
3446
3447 if (typeof effect === 'function') {
3448 var cleanupFn = effect({
3449 state: state,
3450 name: name,
3451 instance: instance,
3452 options: options
3453 });
3454
3455 var noopFn = function noopFn() {};
3456
3457 effectCleanupFns.push(cleanupFn || noopFn);
3458 }
3459 });
3460 }
3461
3462 function cleanupModifierEffects() {
3463 effectCleanupFns.forEach(function (fn) {
3464 return fn();
3465 });
3466 effectCleanupFns = [];
3467 }
3468
3469 return instance;
3470 };
3471 }
3472 var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules
3473
3474 var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];
3475 var createPopper$1 = /*#__PURE__*/popperGenerator({
3476 defaultModifiers: defaultModifiers$1
3477 }); // eslint-disable-next-line import/no-unused-modules
3478
3479 var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];
3480 var createPopper = /*#__PURE__*/popperGenerator({
3481 defaultModifiers: defaultModifiers
3482 }); // eslint-disable-next-line import/no-unused-modules
3483
3484 const Popper = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
3485 __proto__: null,
3486 afterMain,
3487 afterRead,
3488 afterWrite,
3489 applyStyles: applyStyles$1,
3490 arrow: arrow$1,
3491 auto,
3492 basePlacements,
3493 beforeMain,
3494 beforeRead,
3495 beforeWrite,
3496 bottom,
3497 clippingParents,
3498 computeStyles: computeStyles$1,
3499 createPopper,
3500 createPopperBase: createPopper$2,
3501 createPopperLite: createPopper$1,
3502 detectOverflow,
3503 end,
3504 eventListeners,
3505 flip: flip$1,
3506 hide: hide$1,
3507 left,
3508 main,
3509 modifierPhases,
3510 offset: offset$1,
3511 placements,
3512 popper,
3513 popperGenerator,
3514 popperOffsets: popperOffsets$1,
3515 preventOverflow: preventOverflow$1,
3516 read,
3517 reference,
3518 right,
3519 start,
3520 top,
3521 variationPlacements,
3522 viewport,
3523 write
3524 }, Symbol.toStringTag, { value: 'Module' }));
3525
3526 /**
3527 * --------------------------------------------------------------------------
3528 * Bootstrap dropdown.js
3529 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3530 * --------------------------------------------------------------------------
3531 */
3532
3533
3534 /**
3535 * Constants
3536 */
3537
3538 const NAME$a = 'dropdown';
3539 const DATA_KEY$6 = 'bs.dropdown';
3540 const EVENT_KEY$6 = `.${DATA_KEY$6}`;
3541 const DATA_API_KEY$3 = '.data-api';
3542 const ESCAPE_KEY$2 = 'Escape';
3543 const TAB_KEY$1 = 'Tab';
3544 const ARROW_UP_KEY$1 = 'ArrowUp';
3545 const ARROW_DOWN_KEY$1 = 'ArrowDown';
3546 const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
3547
3548 const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
3549 const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
3550 const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
3551 const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
3552 const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
3553 const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
3554 const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
3555 const CLASS_NAME_SHOW$6 = 'show';
3556 const CLASS_NAME_DROPUP = 'dropup';
3557 const CLASS_NAME_DROPEND = 'dropend';
3558 const CLASS_NAME_DROPSTART = 'dropstart';
3559 const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
3560 const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
3561 const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
3562 const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
3563 const SELECTOR_MENU = '.dropdown-menu';
3564 const SELECTOR_NAVBAR = '.navbar';
3565 const SELECTOR_NAVBAR_NAV = '.navbar-nav';
3566 const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
3567 const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
3568 const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
3569 const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
3570 const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
3571 const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
3572 const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
3573 const PLACEMENT_TOPCENTER = 'top';
3574 const PLACEMENT_BOTTOMCENTER = 'bottom';
3575 const Default$9 = {
3576 autoClose: true,
3577 boundary: 'clippingParents',
3578 display: 'dynamic',
3579 offset: [0, 2],
3580 popperConfig: null,
3581 reference: 'toggle'
3582 };
3583 const DefaultType$9 = {
3584 autoClose: '(boolean|string)',
3585 boundary: '(string|element)',
3586 display: 'string',
3587 offset: '(array|string|function)',
3588 popperConfig: '(null|object|function)',
3589 reference: '(string|element|object)'
3590 };
3591
3592 /**
3593 * Class definition
3594 */
3595
3596 class Dropdown extends BaseComponent {
3597 constructor(element, config) {
3598 super(element, config);
3599 this._popper = null;
3600 this._parent = this._element.parentNode; // dropdown wrapper
3601 // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
3602 this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
3603 this._inNavbar = this._detectNavbar();
3604 }
3605
3606 // Getters
3607 static get Default() {
3608 return Default$9;
3609 }
3610 static get DefaultType() {
3611 return DefaultType$9;
3612 }
3613 static get NAME() {
3614 return NAME$a;
3615 }
3616
3617 // Public
3618 toggle() {
3619 return this._isShown() ? this.hide() : this.show();
3620 }
3621 show() {
3622 if (isDisabled(this._element) || this._isShown()) {
3623 return;
3624 }
3625 const relatedTarget = {
3626 relatedTarget: this._element
3627 };
3628 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
3629 if (showEvent.defaultPrevented) {
3630 return;
3631 }
3632 this._createPopper();
3633
3634 // If this is a touch-enabled device we add extra
3635 // empty mouseover listeners to the body's immediate children;
3636 // only needed because of broken event delegation on iOS
3637 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
3638 if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
3639 for (const element of [].concat(...document.body.children)) {
3640 EventHandler.on(element, 'mouseover', noop);
3641 }
3642 }
3643 this._element.focus();
3644 this._element.setAttribute('aria-expanded', true);
3645 this._menu.classList.add(CLASS_NAME_SHOW$6);
3646 this._element.classList.add(CLASS_NAME_SHOW$6);
3647 EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
3648 }
3649 hide() {
3650 if (isDisabled(this._element) || !this._isShown()) {
3651 return;
3652 }
3653 const relatedTarget = {
3654 relatedTarget: this._element
3655 };
3656 this._completeHide(relatedTarget);
3657 }
3658 dispose() {
3659 if (this._popper) {
3660 this._popper.destroy();
3661 }
3662 super.dispose();
3663 }
3664 update() {
3665 this._inNavbar = this._detectNavbar();
3666 if (this._popper) {
3667 this._popper.update();
3668 }
3669 }
3670
3671 // Private
3672 _completeHide(relatedTarget) {
3673 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
3674 if (hideEvent.defaultPrevented) {
3675 return;
3676 }
3677
3678 // If this is a touch-enabled device we remove the extra
3679 // empty mouseover listeners we added for iOS support
3680 if ('ontouchstart' in document.documentElement) {
3681 for (const element of [].concat(...document.body.children)) {
3682 EventHandler.off(element, 'mouseover', noop);
3683 }
3684 }
3685 if (this._popper) {
3686 this._popper.destroy();
3687 }
3688 this._menu.classList.remove(CLASS_NAME_SHOW$6);
3689 this._element.classList.remove(CLASS_NAME_SHOW$6);
3690 this._element.setAttribute('aria-expanded', 'false');
3691 Manipulator.removeDataAttribute(this._menu, 'popper');
3692 EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
3693 }
3694 _getConfig(config) {
3695 config = super._getConfig(config);
3696 if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
3697 // Popper virtual elements require a getBoundingClientRect method
3698 throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
3699 }
3700 return config;
3701 }
3702 _createPopper() {
3703 if (typeof Popper === 'undefined') {
3704 throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
3705 }
3706 let referenceElement = this._element;
3707 if (this._config.reference === 'parent') {
3708 referenceElement = this._parent;
3709 } else if (isElement$1(this._config.reference)) {
3710 referenceElement = getElement(this._config.reference);
3711 } else if (typeof this._config.reference === 'object') {
3712 referenceElement = this._config.reference;
3713 }
3714 const popperConfig = this._getPopperConfig();
3715 this._popper = createPopper(referenceElement, this._menu, popperConfig);
3716 }
3717 _isShown() {
3718 return this._menu.classList.contains(CLASS_NAME_SHOW$6);
3719 }
3720 _getPlacement() {
3721 const parentDropdown = this._parent;
3722 if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
3723 return PLACEMENT_RIGHT;
3724 }
3725 if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
3726 return PLACEMENT_LEFT;
3727 }
3728 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
3729 return PLACEMENT_TOPCENTER;
3730 }
3731 if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
3732 return PLACEMENT_BOTTOMCENTER;
3733 }
3734
3735 // We need to trim the value because custom properties can also include spaces
3736 const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
3737 if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
3738 return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
3739 }
3740 return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
3741 }
3742 _detectNavbar() {
3743 return this._element.closest(SELECTOR_NAVBAR) !== null;
3744 }
3745 _getOffset() {
3746 const {
3747 offset
3748 } = this._config;
3749 if (typeof offset === 'string') {
3750 return offset.split(',').map(value => Number.parseInt(value, 10));
3751 }
3752 if (typeof offset === 'function') {
3753 return popperData => offset(popperData, this._element);
3754 }
3755 return offset;
3756 }
3757 _getPopperConfig() {
3758 const defaultBsPopperConfig = {
3759 placement: this._getPlacement(),
3760 modifiers: [{
3761 name: 'preventOverflow',
3762 options: {
3763 boundary: this._config.boundary
3764 }
3765 }, {
3766 name: 'offset',
3767 options: {
3768 offset: this._getOffset()
3769 }
3770 }]
3771 };
3772
3773 // Disable Popper if we have a static display or Dropdown is in Navbar
3774 if (this._inNavbar || this._config.display === 'static') {
3775 Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
3776 defaultBsPopperConfig.modifiers = [{
3777 name: 'applyStyles',
3778 enabled: false
3779 }];
3780 }
3781 return {
3782 ...defaultBsPopperConfig,
3783 ...execute(this._config.popperConfig, [defaultBsPopperConfig])
3784 };
3785 }
3786 _selectMenuItem({
3787 key,
3788 target
3789 }) {
3790 const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));
3791 if (!items.length) {
3792 return;
3793 }
3794
3795 // if target isn't included in items (e.g. when expanding the dropdown)
3796 // allow cycling to get the last item in case key equals ARROW_UP_KEY
3797 getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
3798 }
3799
3800 // Static
3801 static jQueryInterface(config) {
3802 return this.each(function () {
3803 const data = Dropdown.getOrCreateInstance(this, config);
3804 if (typeof config !== 'string') {
3805 return;
3806 }
3807 if (typeof data[config] === 'undefined') {
3808 throw new TypeError(`No method named "${config}"`);
3809 }
3810 data[config]();
3811 });
3812 }
3813 static clearMenus(event) {
3814 if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {
3815 return;
3816 }
3817 const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
3818 for (const toggle of openToggles) {
3819 const context = Dropdown.getInstance(toggle);
3820 if (!context || context._config.autoClose === false) {
3821 continue;
3822 }
3823 const composedPath = event.composedPath();
3824 const isMenuTarget = composedPath.includes(context._menu);
3825 if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
3826 continue;
3827 }
3828
3829 // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
3830 if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
3831 continue;
3832 }
3833 const relatedTarget = {
3834 relatedTarget: context._element
3835 };
3836 if (event.type === 'click') {
3837 relatedTarget.clickEvent = event;
3838 }
3839 context._completeHide(relatedTarget);
3840 }
3841 }
3842 static dataApiKeydownHandler(event) {
3843 // If not an UP | DOWN | ESCAPE key => not a dropdown command
3844 // If input/textarea && if key is other than ESCAPE => not a dropdown command
3845
3846 const isInput = /input|textarea/i.test(event.target.tagName);
3847 const isEscapeEvent = event.key === ESCAPE_KEY$2;
3848 const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
3849 if (!isUpOrDownEvent && !isEscapeEvent) {
3850 return;
3851 }
3852 if (isInput && !isEscapeEvent) {
3853 return;
3854 }
3855 event.preventDefault();
3856
3857 // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
3858 const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
3859 const instance = Dropdown.getOrCreateInstance(getToggleButton);
3860 if (isUpOrDownEvent) {
3861 event.stopPropagation();
3862 instance.show();
3863 instance._selectMenuItem(event);
3864 return;
3865 }
3866 if (instance._isShown()) {
3867 // else is escape and we check if it is shown
3868 event.stopPropagation();
3869 instance.hide();
3870 getToggleButton.focus();
3871 }
3872 }
3873 }
3874
3875 /**
3876 * Data API implementation
3877 */
3878
3879 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
3880 EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
3881 EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
3882 EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
3883 EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
3884 event.preventDefault();
3885 Dropdown.getOrCreateInstance(this).toggle();
3886 });
3887
3888 /**
3889 * jQuery
3890 */
3891
3892 defineJQueryPlugin(Dropdown);
3893
3894 /**
3895 * --------------------------------------------------------------------------
3896 * Bootstrap util/backdrop.js
3897 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3898 * --------------------------------------------------------------------------
3899 */
3900
3901
3902 /**
3903 * Constants
3904 */
3905
3906 const NAME$9 = 'backdrop';
3907 const CLASS_NAME_FADE$4 = 'fade';
3908 const CLASS_NAME_SHOW$5 = 'show';
3909 const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
3910 const Default$8 = {
3911 className: 'modal-backdrop',
3912 clickCallback: null,
3913 isAnimated: false,
3914 isVisible: true,
3915 // if false, we use the backdrop helper without adding any element to the dom
3916 rootElement: 'body' // give the choice to place backdrop under different elements
3917 };
3918 const DefaultType$8 = {
3919 className: 'string',
3920 clickCallback: '(function|null)',
3921 isAnimated: 'boolean',
3922 isVisible: 'boolean',
3923 rootElement: '(element|string)'
3924 };
3925
3926 /**
3927 * Class definition
3928 */
3929
3930 class Backdrop extends Config {
3931 constructor(config) {
3932 super();
3933 this._config = this._getConfig(config);
3934 this._isAppended = false;
3935 this._element = null;
3936 }
3937
3938 // Getters
3939 static get Default() {
3940 return Default$8;
3941 }
3942 static get DefaultType() {
3943 return DefaultType$8;
3944 }
3945 static get NAME() {
3946 return NAME$9;
3947 }
3948
3949 // Public
3950 show(callback) {
3951 if (!this._config.isVisible) {
3952 execute(callback);
3953 return;
3954 }
3955 this._append();
3956 const element = this._getElement();
3957 if (this._config.isAnimated) {
3958 reflow(element);
3959 }
3960 element.classList.add(CLASS_NAME_SHOW$5);
3961 this._emulateAnimation(() => {
3962 execute(callback);
3963 });
3964 }
3965 hide(callback) {
3966 if (!this._config.isVisible) {
3967 execute(callback);
3968 return;
3969 }
3970 this._getElement().classList.remove(CLASS_NAME_SHOW$5);
3971 this._emulateAnimation(() => {
3972 this.dispose();
3973 execute(callback);
3974 });
3975 }
3976 dispose() {
3977 if (!this._isAppended) {
3978 return;
3979 }
3980 EventHandler.off(this._element, EVENT_MOUSEDOWN);
3981 this._element.remove();
3982 this._isAppended = false;
3983 }
3984
3985 // Private
3986 _getElement() {
3987 if (!this._element) {
3988 const backdrop = document.createElement('div');
3989 backdrop.className = this._config.className;
3990 if (this._config.isAnimated) {
3991 backdrop.classList.add(CLASS_NAME_FADE$4);
3992 }
3993 this._element = backdrop;
3994 }
3995 return this._element;
3996 }
3997 _configAfterMerge(config) {
3998 // use getElement() with the default "body" to get a fresh Element on each instantiation
3999 config.rootElement = getElement(config.rootElement);
4000 return config;
4001 }
4002 _append() {
4003 if (this._isAppended) {
4004 return;
4005 }
4006 const element = this._getElement();
4007 this._config.rootElement.append(element);
4008 EventHandler.on(element, EVENT_MOUSEDOWN, () => {
4009 execute(this._config.clickCallback);
4010 });
4011 this._isAppended = true;
4012 }
4013 _emulateAnimation(callback) {
4014 executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
4015 }
4016 }
4017
4018 /**
4019 * --------------------------------------------------------------------------
4020 * Bootstrap util/focustrap.js
4021 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4022 * --------------------------------------------------------------------------
4023 */
4024
4025
4026 /**
4027 * Constants
4028 */
4029
4030 const NAME$8 = 'focustrap';
4031 const DATA_KEY$5 = 'bs.focustrap';
4032 const EVENT_KEY$5 = `.${DATA_KEY$5}`;
4033 const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
4034 const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
4035 const TAB_KEY = 'Tab';
4036 const TAB_NAV_FORWARD = 'forward';
4037 const TAB_NAV_BACKWARD = 'backward';
4038 const Default$7 = {
4039 autofocus: true,
4040 trapElement: null // The element to trap focus inside of
4041 };
4042 const DefaultType$7 = {
4043 autofocus: 'boolean',
4044 trapElement: 'element'
4045 };
4046
4047 /**
4048 * Class definition
4049 */
4050
4051 class FocusTrap extends Config {
4052 constructor(config) {
4053 super();
4054 this._config = this._getConfig(config);
4055 this._isActive = false;
4056 this._lastTabNavDirection = null;
4057 }
4058
4059 // Getters
4060 static get Default() {
4061 return Default$7;
4062 }
4063 static get DefaultType() {
4064 return DefaultType$7;
4065 }
4066 static get NAME() {
4067 return NAME$8;
4068 }
4069
4070 // Public
4071 activate() {
4072 if (this._isActive) {
4073 return;
4074 }
4075 if (this._config.autofocus) {
4076 this._config.trapElement.focus();
4077 }
4078 EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop
4079 EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));
4080 EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
4081 this._isActive = true;
4082 }
4083 deactivate() {
4084 if (!this._isActive) {
4085 return;
4086 }
4087 this._isActive = false;
4088 EventHandler.off(document, EVENT_KEY$5);
4089 }
4090
4091 // Private
4092 _handleFocusin(event) {
4093 const {
4094 trapElement
4095 } = this._config;
4096 if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
4097 return;
4098 }
4099 const elements = SelectorEngine.focusableChildren(trapElement);
4100 if (elements.length === 0) {
4101 trapElement.focus();
4102 } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
4103 elements[elements.length - 1].focus();
4104 } else {
4105 elements[0].focus();
4106 }
4107 }
4108 _handleKeydown(event) {
4109 if (event.key !== TAB_KEY) {
4110 return;
4111 }
4112 this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
4113 }
4114 }
4115
4116 /**
4117 * --------------------------------------------------------------------------
4118 * Bootstrap util/scrollBar.js
4119 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4120 * --------------------------------------------------------------------------
4121 */
4122
4123
4124 /**
4125 * Constants
4126 */
4127
4128 const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
4129 const SELECTOR_STICKY_CONTENT = '.sticky-top';
4130 const PROPERTY_PADDING = 'padding-right';
4131 const PROPERTY_MARGIN = 'margin-right';
4132
4133 /**
4134 * Class definition
4135 */
4136
4137 class ScrollBarHelper {
4138 constructor() {
4139 this._element = document.body;
4140 }
4141
4142 // Public
4143 getWidth() {
4144 // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
4145 const documentWidth = document.documentElement.clientWidth;
4146 return Math.abs(window.innerWidth - documentWidth);
4147 }
4148 hide() {
4149 const width = this.getWidth();
4150 this._disableOverFlow();
4151 // give padding to element to balance the hidden scrollbar width
4152 this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
4153 // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
4154 this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
4155 this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
4156 }
4157 reset() {
4158 this._resetElementAttributes(this._element, 'overflow');
4159 this._resetElementAttributes(this._element, PROPERTY_PADDING);
4160 this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
4161 this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
4162 }
4163 isOverflowing() {
4164 return this.getWidth() > 0;
4165 }
4166
4167 // Private
4168 _disableOverFlow() {
4169 this._saveInitialAttribute(this._element, 'overflow');
4170 this._element.style.overflow = 'hidden';
4171 }
4172 _setElementAttributes(selector, styleProperty, callback) {
4173 const scrollbarWidth = this.getWidth();
4174 const manipulationCallBack = element => {
4175 if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
4176 return;
4177 }
4178 this._saveInitialAttribute(element, styleProperty);
4179 const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
4180 element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
4181 };
4182 this._applyManipulationCallback(selector, manipulationCallBack);
4183 }
4184 _saveInitialAttribute(element, styleProperty) {
4185 const actualValue = element.style.getPropertyValue(styleProperty);
4186 if (actualValue) {
4187 Manipulator.setDataAttribute(element, styleProperty, actualValue);
4188 }
4189 }
4190 _resetElementAttributes(selector, styleProperty) {
4191 const manipulationCallBack = element => {
4192 const value = Manipulator.getDataAttribute(element, styleProperty);
4193 // We only want to remove the property if the value is `null`; the value can also be zero
4194 if (value === null) {
4195 element.style.removeProperty(styleProperty);
4196 return;
4197 }
4198 Manipulator.removeDataAttribute(element, styleProperty);
4199 element.style.setProperty(styleProperty, value);
4200 };
4201 this._applyManipulationCallback(selector, manipulationCallBack);
4202 }
4203 _applyManipulationCallback(selector, callBack) {
4204 if (isElement$1(selector)) {
4205 callBack(selector);
4206 return;
4207 }
4208 for (const sel of SelectorEngine.find(selector, this._element)) {
4209 callBack(sel);
4210 }
4211 }
4212 }
4213
4214 /**
4215 * --------------------------------------------------------------------------
4216 * Bootstrap modal.js
4217 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4218 * --------------------------------------------------------------------------
4219 */
4220
4221
4222 /**
4223 * Constants
4224 */
4225
4226 const NAME$7 = 'modal';
4227 const DATA_KEY$4 = 'bs.modal';
4228 const EVENT_KEY$4 = `.${DATA_KEY$4}`;
4229 const DATA_API_KEY$2 = '.data-api';
4230 const ESCAPE_KEY$1 = 'Escape';
4231 const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
4232 const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
4233 const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
4234 const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
4235 const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
4236 const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
4237 const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
4238 const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
4239 const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
4240 const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
4241 const CLASS_NAME_OPEN = 'modal-open';
4242 const CLASS_NAME_FADE$3 = 'fade';
4243 const CLASS_NAME_SHOW$4 = 'show';
4244 const CLASS_NAME_STATIC = 'modal-static';
4245 const OPEN_SELECTOR$1 = '.modal.show';
4246 const SELECTOR_DIALOG = '.modal-dialog';
4247 const SELECTOR_MODAL_BODY = '.modal-body';
4248 const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
4249 const Default$6 = {
4250 backdrop: true,
4251 focus: true,
4252 keyboard: true
4253 };
4254 const DefaultType$6 = {
4255 backdrop: '(boolean|string)',
4256 focus: 'boolean',
4257 keyboard: 'boolean'
4258 };
4259
4260 /**
4261 * Class definition
4262 */
4263
4264 class Modal extends BaseComponent {
4265 constructor(element, config) {
4266 super(element, config);
4267 this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
4268 this._backdrop = this._initializeBackDrop();
4269 this._focustrap = this._initializeFocusTrap();
4270 this._isShown = false;
4271 this._isTransitioning = false;
4272 this._scrollBar = new ScrollBarHelper();
4273 this._addEventListeners();
4274 }
4275
4276 // Getters
4277 static get Default() {
4278 return Default$6;
4279 }
4280 static get DefaultType() {
4281 return DefaultType$6;
4282 }
4283 static get NAME() {
4284 return NAME$7;
4285 }
4286
4287 // Public
4288 toggle(relatedTarget) {
4289 return this._isShown ? this.hide() : this.show(relatedTarget);
4290 }
4291 show(relatedTarget) {
4292 if (this._isShown || this._isTransitioning) {
4293 return;
4294 }
4295 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
4296 relatedTarget
4297 });
4298 if (showEvent.defaultPrevented) {
4299 return;
4300 }
4301 this._isShown = true;
4302 this._isTransitioning = true;
4303 this._scrollBar.hide();
4304 document.body.classList.add(CLASS_NAME_OPEN);
4305 this._adjustDialog();
4306 this._backdrop.show(() => this._showElement(relatedTarget));
4307 }
4308 hide() {
4309 if (!this._isShown || this._isTransitioning) {
4310 return;
4311 }
4312 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
4313 if (hideEvent.defaultPrevented) {
4314 return;
4315 }
4316 this._isShown = false;
4317 this._isTransitioning = true;
4318 this._focustrap.deactivate();
4319 this._element.classList.remove(CLASS_NAME_SHOW$4);
4320 this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
4321 }
4322 dispose() {
4323 EventHandler.off(window, EVENT_KEY$4);
4324 EventHandler.off(this._dialog, EVENT_KEY$4);
4325 this._backdrop.dispose();
4326 this._focustrap.deactivate();
4327 super.dispose();
4328 }
4329 handleUpdate() {
4330 this._adjustDialog();
4331 }
4332
4333 // Private
4334 _initializeBackDrop() {
4335 return new Backdrop({
4336 isVisible: Boolean(this._config.backdrop),
4337 // 'static' option will be translated to true, and booleans will keep their value,
4338 isAnimated: this._isAnimated()
4339 });
4340 }
4341 _initializeFocusTrap() {
4342 return new FocusTrap({
4343 trapElement: this._element
4344 });
4345 }
4346 _showElement(relatedTarget) {
4347 // try to append dynamic modal
4348 if (!document.body.contains(this._element)) {
4349 document.body.append(this._element);
4350 }
4351 this._element.style.display = 'block';
4352 this._element.removeAttribute('aria-hidden');
4353 this._element.setAttribute('aria-modal', true);
4354 this._element.setAttribute('role', 'dialog');
4355 this._element.scrollTop = 0;
4356 const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
4357 if (modalBody) {
4358 modalBody.scrollTop = 0;
4359 }
4360 reflow(this._element);
4361 this._element.classList.add(CLASS_NAME_SHOW$4);
4362 const transitionComplete = () => {
4363 if (this._config.focus) {
4364 this._focustrap.activate();
4365 }
4366 this._isTransitioning = false;
4367 EventHandler.trigger(this._element, EVENT_SHOWN$4, {
4368 relatedTarget
4369 });
4370 };
4371 this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
4372 }
4373 _addEventListeners() {
4374 EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
4375 if (event.key !== ESCAPE_KEY$1) {
4376 return;
4377 }
4378 if (this._config.keyboard) {
4379 this.hide();
4380 return;
4381 }
4382 this._triggerBackdropTransition();
4383 });
4384 EventHandler.on(window, EVENT_RESIZE$1, () => {
4385 if (this._isShown && !this._isTransitioning) {
4386 this._adjustDialog();
4387 }
4388 });
4389 EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
4390 // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
4391 EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
4392 if (this._element !== event.target || this._element !== event2.target) {
4393 return;
4394 }
4395 if (this._config.backdrop === 'static') {
4396 this._triggerBackdropTransition();
4397 return;
4398 }
4399 if (this._config.backdrop) {
4400 this.hide();
4401 }
4402 });
4403 });
4404 }
4405 _hideModal() {
4406 this._element.style.display = 'none';
4407 this._element.setAttribute('aria-hidden', true);
4408 this._element.removeAttribute('aria-modal');
4409 this._element.removeAttribute('role');
4410 this._isTransitioning = false;
4411 this._backdrop.hide(() => {
4412 document.body.classList.remove(CLASS_NAME_OPEN);
4413 this._resetAdjustments();
4414 this._scrollBar.reset();
4415 EventHandler.trigger(this._element, EVENT_HIDDEN$4);
4416 });
4417 }
4418 _isAnimated() {
4419 return this._element.classList.contains(CLASS_NAME_FADE$3);
4420 }
4421 _triggerBackdropTransition() {
4422 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
4423 if (hideEvent.defaultPrevented) {
4424 return;
4425 }
4426 const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
4427 const initialOverflowY = this._element.style.overflowY;
4428 // return if the following background transition hasn't yet completed
4429 if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
4430 return;
4431 }
4432 if (!isModalOverflowing) {
4433 this._element.style.overflowY = 'hidden';
4434 }
4435 this._element.classList.add(CLASS_NAME_STATIC);
4436 this._queueCallback(() => {
4437 this._element.classList.remove(CLASS_NAME_STATIC);
4438 this._queueCallback(() => {
4439 this._element.style.overflowY = initialOverflowY;
4440 }, this._dialog);
4441 }, this._dialog);
4442 this._element.focus();
4443 }
4444
4445 /**
4446 * The following methods are used to handle overflowing modals
4447 */
4448
4449 _adjustDialog() {
4450 const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
4451 const scrollbarWidth = this._scrollBar.getWidth();
4452 const isBodyOverflowing = scrollbarWidth > 0;
4453 if (isBodyOverflowing && !isModalOverflowing) {
4454 const property = isRTL() ? 'paddingLeft' : 'paddingRight';
4455 this._element.style[property] = `${scrollbarWidth}px`;
4456 }
4457 if (!isBodyOverflowing && isModalOverflowing) {
4458 const property = isRTL() ? 'paddingRight' : 'paddingLeft';
4459 this._element.style[property] = `${scrollbarWidth}px`;
4460 }
4461 }
4462 _resetAdjustments() {
4463 this._element.style.paddingLeft = '';
4464 this._element.style.paddingRight = '';
4465 }
4466
4467 // Static
4468 static jQueryInterface(config, relatedTarget) {
4469 return this.each(function () {
4470 const data = Modal.getOrCreateInstance(this, config);
4471 if (typeof config !== 'string') {
4472 return;
4473 }
4474 if (typeof data[config] === 'undefined') {
4475 throw new TypeError(`No method named "${config}"`);
4476 }
4477 data[config](relatedTarget);
4478 });
4479 }
4480 }
4481
4482 /**
4483 * Data API implementation
4484 */
4485
4486 EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
4487 const target = SelectorEngine.getElementFromSelector(this);
4488 if (['A', 'AREA'].includes(this.tagName)) {
4489 event.preventDefault();
4490 }
4491 EventHandler.one(target, EVENT_SHOW$4, showEvent => {
4492 if (showEvent.defaultPrevented) {
4493 // only register focus restorer if modal will actually get shown
4494 return;
4495 }
4496 EventHandler.one(target, EVENT_HIDDEN$4, () => {
4497 if (isVisible(this)) {
4498 this.focus();
4499 }
4500 });
4501 });
4502
4503 // avoid conflict when clicking modal toggler while another one is open
4504 const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
4505 if (alreadyOpen) {
4506 Modal.getInstance(alreadyOpen).hide();
4507 }
4508 const data = Modal.getOrCreateInstance(target);
4509 data.toggle(this);
4510 });
4511 enableDismissTrigger(Modal);
4512
4513 /**
4514 * jQuery
4515 */
4516
4517 defineJQueryPlugin(Modal);
4518
4519 /**
4520 * --------------------------------------------------------------------------
4521 * Bootstrap offcanvas.js
4522 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4523 * --------------------------------------------------------------------------
4524 */
4525
4526
4527 /**
4528 * Constants
4529 */
4530
4531 const NAME$6 = 'offcanvas';
4532 const DATA_KEY$3 = 'bs.offcanvas';
4533 const EVENT_KEY$3 = `.${DATA_KEY$3}`;
4534 const DATA_API_KEY$1 = '.data-api';
4535 const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
4536 const ESCAPE_KEY = 'Escape';
4537 const CLASS_NAME_SHOW$3 = 'show';
4538 const CLASS_NAME_SHOWING$1 = 'showing';
4539 const CLASS_NAME_HIDING = 'hiding';
4540 const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
4541 const OPEN_SELECTOR = '.offcanvas.show';
4542 const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
4543 const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
4544 const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
4545 const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
4546 const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
4547 const EVENT_RESIZE = `resize${EVENT_KEY$3}`;
4548 const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
4549 const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
4550 const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
4551 const Default$5 = {
4552 backdrop: true,
4553 keyboard: true,
4554 scroll: false
4555 };
4556 const DefaultType$5 = {
4557 backdrop: '(boolean|string)',
4558 keyboard: 'boolean',
4559 scroll: 'boolean'
4560 };
4561
4562 /**
4563 * Class definition
4564 */
4565
4566 class Offcanvas extends BaseComponent {
4567 constructor(element, config) {
4568 super(element, config);
4569 this._isShown = false;
4570 this._backdrop = this._initializeBackDrop();
4571 this._focustrap = this._initializeFocusTrap();
4572 this._addEventListeners();
4573 }
4574
4575 // Getters
4576 static get Default() {
4577 return Default$5;
4578 }
4579 static get DefaultType() {
4580 return DefaultType$5;
4581 }
4582 static get NAME() {
4583 return NAME$6;
4584 }
4585
4586 // Public
4587 toggle(relatedTarget) {
4588 return this._isShown ? this.hide() : this.show(relatedTarget);
4589 }
4590 show(relatedTarget) {
4591 if (this._isShown) {
4592 return;
4593 }
4594 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
4595 relatedTarget
4596 });
4597 if (showEvent.defaultPrevented) {
4598 return;
4599 }
4600 this._isShown = true;
4601 this._backdrop.show();
4602 if (!this._config.scroll) {
4603 new ScrollBarHelper().hide();
4604 }
4605 this._element.setAttribute('aria-modal', true);
4606 this._element.setAttribute('role', 'dialog');
4607 this._element.classList.add(CLASS_NAME_SHOWING$1);
4608 const completeCallBack = () => {
4609 if (!this._config.scroll || this._config.backdrop) {
4610 this._focustrap.activate();
4611 }
4612 this._element.classList.add(CLASS_NAME_SHOW$3);
4613 this._element.classList.remove(CLASS_NAME_SHOWING$1);
4614 EventHandler.trigger(this._element, EVENT_SHOWN$3, {
4615 relatedTarget
4616 });
4617 };
4618 this._queueCallback(completeCallBack, this._element, true);
4619 }
4620 hide() {
4621 if (!this._isShown) {
4622 return;
4623 }
4624 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
4625 if (hideEvent.defaultPrevented) {
4626 return;
4627 }
4628 this._focustrap.deactivate();
4629 this._element.blur();
4630 this._isShown = false;
4631 this._element.classList.add(CLASS_NAME_HIDING);
4632 this._backdrop.hide();
4633 const completeCallback = () => {
4634 this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
4635 this._element.removeAttribute('aria-modal');
4636 this._element.removeAttribute('role');
4637 if (!this._config.scroll) {
4638 new ScrollBarHelper().reset();
4639 }
4640 EventHandler.trigger(this._element, EVENT_HIDDEN$3);
4641 };
4642 this._queueCallback(completeCallback, this._element, true);
4643 }
4644 dispose() {
4645 this._backdrop.dispose();
4646 this._focustrap.deactivate();
4647 super.dispose();
4648 }
4649
4650 // Private
4651 _initializeBackDrop() {
4652 const clickCallback = () => {
4653 if (this._config.backdrop === 'static') {
4654 EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
4655 return;
4656 }
4657 this.hide();
4658 };
4659
4660 // 'static' option will be translated to true, and booleans will keep their value
4661 const isVisible = Boolean(this._config.backdrop);
4662 return new Backdrop({
4663 className: CLASS_NAME_BACKDROP,
4664 isVisible,
4665 isAnimated: true,
4666 rootElement: this._element.parentNode,
4667 clickCallback: isVisible ? clickCallback : null
4668 });
4669 }
4670 _initializeFocusTrap() {
4671 return new FocusTrap({
4672 trapElement: this._element
4673 });
4674 }
4675 _addEventListeners() {
4676 EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
4677 if (event.key !== ESCAPE_KEY) {
4678 return;
4679 }
4680 if (this._config.keyboard) {
4681 this.hide();
4682 return;
4683 }
4684 EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
4685 });
4686 }
4687
4688 // Static
4689 static jQueryInterface(config) {
4690 return this.each(function () {
4691 const data = Offcanvas.getOrCreateInstance(this, config);
4692 if (typeof config !== 'string') {
4693 return;
4694 }
4695 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
4696 throw new TypeError(`No method named "${config}"`);
4697 }
4698 data[config](this);
4699 });
4700 }
4701 }
4702
4703 /**
4704 * Data API implementation
4705 */
4706
4707 EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
4708 const target = SelectorEngine.getElementFromSelector(this);
4709 if (['A', 'AREA'].includes(this.tagName)) {
4710 event.preventDefault();
4711 }
4712 if (isDisabled(this)) {
4713 return;
4714 }
4715 EventHandler.one(target, EVENT_HIDDEN$3, () => {
4716 // focus on trigger when it is closed
4717 if (isVisible(this)) {
4718 this.focus();
4719 }
4720 });
4721
4722 // avoid conflict when clicking a toggler of an offcanvas, while another is open
4723 const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
4724 if (alreadyOpen && alreadyOpen !== target) {
4725 Offcanvas.getInstance(alreadyOpen).hide();
4726 }
4727 const data = Offcanvas.getOrCreateInstance(target);
4728 data.toggle(this);
4729 });
4730 EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
4731 for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
4732 Offcanvas.getOrCreateInstance(selector).show();
4733 }
4734 });
4735 EventHandler.on(window, EVENT_RESIZE, () => {
4736 for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
4737 if (getComputedStyle(element).position !== 'fixed') {
4738 Offcanvas.getOrCreateInstance(element).hide();
4739 }
4740 }
4741 });
4742 enableDismissTrigger(Offcanvas);
4743
4744 /**
4745 * jQuery
4746 */
4747
4748 defineJQueryPlugin(Offcanvas);
4749
4750 /**
4751 * --------------------------------------------------------------------------
4752 * Bootstrap util/sanitizer.js
4753 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4754 * --------------------------------------------------------------------------
4755 */
4756
4757 // js-docs-start allow-list
4758 const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
4759 const DefaultAllowlist = {
4760 // Global attributes allowed on any supplied element below.
4761 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
4762 a: ['target', 'href', 'title', 'rel'],
4763 area: [],
4764 b: [],
4765 br: [],
4766 col: [],
4767 code: [],
4768 dd: [],
4769 div: [],
4770 dl: [],
4771 dt: [],
4772 em: [],
4773 hr: [],
4774 h1: [],
4775 h2: [],
4776 h3: [],
4777 h4: [],
4778 h5: [],
4779 h6: [],
4780 i: [],
4781 img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
4782 li: [],
4783 ol: [],
4784 p: [],
4785 pre: [],
4786 s: [],
4787 small: [],
4788 span: [],
4789 sub: [],
4790 sup: [],
4791 strong: [],
4792 u: [],
4793 ul: []
4794 };
4795 // js-docs-end allow-list
4796
4797 const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
4798
4799 /**
4800 * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
4801 * contexts.
4802 *
4803 * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
4804 */
4805 // eslint-disable-next-line unicorn/better-regex
4806 const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
4807 const allowedAttribute = (attribute, allowedAttributeList) => {
4808 const attributeName = attribute.nodeName.toLowerCase();
4809 if (allowedAttributeList.includes(attributeName)) {
4810 if (uriAttributes.has(attributeName)) {
4811 return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
4812 }
4813 return true;
4814 }
4815
4816 // Check if a regular expression validates the attribute.
4817 return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
4818 };
4819 function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
4820 if (!unsafeHtml.length) {
4821 return unsafeHtml;
4822 }
4823 if (sanitizeFunction && typeof sanitizeFunction === 'function') {
4824 return sanitizeFunction(unsafeHtml);
4825 }
4826 const domParser = new window.DOMParser();
4827 const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
4828 const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
4829 for (const element of elements) {
4830 const elementName = element.nodeName.toLowerCase();
4831 if (!Object.keys(allowList).includes(elementName)) {
4832 element.remove();
4833 continue;
4834 }
4835 const attributeList = [].concat(...element.attributes);
4836 const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
4837 for (const attribute of attributeList) {
4838 if (!allowedAttribute(attribute, allowedAttributes)) {
4839 element.removeAttribute(attribute.nodeName);
4840 }
4841 }
4842 }
4843 return createdDocument.body.innerHTML;
4844 }
4845
4846 /**
4847 * --------------------------------------------------------------------------
4848 * Bootstrap util/template-factory.js
4849 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4850 * --------------------------------------------------------------------------
4851 */
4852
4853
4854 /**
4855 * Constants
4856 */
4857
4858 const NAME$5 = 'TemplateFactory';
4859 const Default$4 = {
4860 allowList: DefaultAllowlist,
4861 content: {},
4862 // { selector : text , selector2 : text2 , }
4863 extraClass: '',
4864 html: false,
4865 sanitize: true,
4866 sanitizeFn: null,
4867 template: '<div></div>'
4868 };
4869 const DefaultType$4 = {
4870 allowList: 'object',
4871 content: 'object',
4872 extraClass: '(string|function)',
4873 html: 'boolean',
4874 sanitize: 'boolean',
4875 sanitizeFn: '(null|function)',
4876 template: 'string'
4877 };
4878 const DefaultContentType = {
4879 entry: '(string|element|function|null)',
4880 selector: '(string|element)'
4881 };
4882
4883 /**
4884 * Class definition
4885 */
4886
4887 class TemplateFactory extends Config {
4888 constructor(config) {
4889 super();
4890 this._config = this._getConfig(config);
4891 }
4892
4893 // Getters
4894 static get Default() {
4895 return Default$4;
4896 }
4897 static get DefaultType() {
4898 return DefaultType$4;
4899 }
4900 static get NAME() {
4901 return NAME$5;
4902 }
4903
4904 // Public
4905 getContent() {
4906 return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);
4907 }
4908 hasContent() {
4909 return this.getContent().length > 0;
4910 }
4911 changeContent(content) {
4912 this._checkContent(content);
4913 this._config.content = {
4914 ...this._config.content,
4915 ...content
4916 };
4917 return this;
4918 }
4919 toHtml() {
4920 const templateWrapper = document.createElement('div');
4921 templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
4922 for (const [selector, text] of Object.entries(this._config.content)) {
4923 this._setContent(templateWrapper, text, selector);
4924 }
4925 const template = templateWrapper.children[0];
4926 const extraClass = this._resolvePossibleFunction(this._config.extraClass);
4927 if (extraClass) {
4928 template.classList.add(...extraClass.split(' '));
4929 }
4930 return template;
4931 }
4932
4933 // Private
4934 _typeCheckConfig(config) {
4935 super._typeCheckConfig(config);
4936 this._checkContent(config.content);
4937 }
4938 _checkContent(arg) {
4939 for (const [selector, content] of Object.entries(arg)) {
4940 super._typeCheckConfig({
4941 selector,
4942 entry: content
4943 }, DefaultContentType);
4944 }
4945 }
4946 _setContent(template, content, selector) {
4947 const templateElement = SelectorEngine.findOne(selector, template);
4948 if (!templateElement) {
4949 return;
4950 }
4951 content = this._resolvePossibleFunction(content);
4952 if (!content) {
4953 templateElement.remove();
4954 return;
4955 }
4956 if (isElement$1(content)) {
4957 this._putElementInTemplate(getElement(content), templateElement);
4958 return;
4959 }
4960 if (this._config.html) {
4961 templateElement.innerHTML = this._maybeSanitize(content);
4962 return;
4963 }
4964 templateElement.textContent = content;
4965 }
4966 _maybeSanitize(arg) {
4967 return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
4968 }
4969 _resolvePossibleFunction(arg) {
4970 return execute(arg, [this]);
4971 }
4972 _putElementInTemplate(element, templateElement) {
4973 if (this._config.html) {
4974 templateElement.innerHTML = '';
4975 templateElement.append(element);
4976 return;
4977 }
4978 templateElement.textContent = element.textContent;
4979 }
4980 }
4981
4982 /**
4983 * --------------------------------------------------------------------------
4984 * Bootstrap tooltip.js
4985 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4986 * --------------------------------------------------------------------------
4987 */
4988
4989
4990 /**
4991 * Constants
4992 */
4993
4994 const NAME$4 = 'tooltip';
4995 const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
4996 const CLASS_NAME_FADE$2 = 'fade';
4997 const CLASS_NAME_MODAL = 'modal';
4998 const CLASS_NAME_SHOW$2 = 'show';
4999 const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
5000 const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
5001 const EVENT_MODAL_HIDE = 'hide.bs.modal';
5002 const TRIGGER_HOVER = 'hover';
5003 const TRIGGER_FOCUS = 'focus';
5004 const TRIGGER_CLICK = 'click';
5005 const TRIGGER_MANUAL = 'manual';
5006 const EVENT_HIDE$2 = 'hide';
5007 const EVENT_HIDDEN$2 = 'hidden';
5008 const EVENT_SHOW$2 = 'show';
5009 const EVENT_SHOWN$2 = 'shown';
5010 const EVENT_INSERTED = 'inserted';
5011 const EVENT_CLICK$1 = 'click';
5012 const EVENT_FOCUSIN$1 = 'focusin';
5013 const EVENT_FOCUSOUT$1 = 'focusout';
5014 const EVENT_MOUSEENTER = 'mouseenter';
5015 const EVENT_MOUSELEAVE = 'mouseleave';
5016 const AttachmentMap = {
5017 AUTO: 'auto',
5018 TOP: 'top',
5019 RIGHT: isRTL() ? 'left' : 'right',
5020 BOTTOM: 'bottom',
5021 LEFT: isRTL() ? 'right' : 'left'
5022 };
5023 const Default$3 = {
5024 allowList: DefaultAllowlist,
5025 animation: true,
5026 boundary: 'clippingParents',
5027 container: false,
5028 customClass: '',
5029 delay: 0,
5030 fallbackPlacements: ['top', 'right', 'bottom', 'left'],
5031 html: false,
5032 offset: [0, 6],
5033 placement: 'top',
5034 popperConfig: null,
5035 sanitize: true,
5036 sanitizeFn: null,
5037 selector: false,
5038 template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
5039 title: '',
5040 trigger: 'hover focus'
5041 };
5042 const DefaultType$3 = {
5043 allowList: 'object',
5044 animation: 'boolean',
5045 boundary: '(string|element)',
5046 container: '(string|element|boolean)',
5047 customClass: '(string|function)',
5048 delay: '(number|object)',
5049 fallbackPlacements: 'array',
5050 html: 'boolean',
5051 offset: '(array|string|function)',
5052 placement: '(string|function)',
5053 popperConfig: '(null|object|function)',
5054 sanitize: 'boolean',
5055 sanitizeFn: '(null|function)',
5056 selector: '(string|boolean)',
5057 template: 'string',
5058 title: '(string|element|function)',
5059 trigger: 'string'
5060 };
5061
5062 /**
5063 * Class definition
5064 */
5065
5066 class Tooltip extends BaseComponent {
5067 constructor(element, config) {
5068 if (typeof Popper === 'undefined') {
5069 throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
5070 }
5071 super(element, config);
5072
5073 // Private
5074 this._isEnabled = true;
5075 this._timeout = 0;
5076 this._isHovered = null;
5077 this._activeTrigger = {};
5078 this._popper = null;
5079 this._templateFactory = null;
5080 this._newContent = null;
5081
5082 // Protected
5083 this.tip = null;
5084 this._setListeners();
5085 if (!this._config.selector) {
5086 this._fixTitle();
5087 }
5088 }
5089
5090 // Getters
5091 static get Default() {
5092 return Default$3;
5093 }
5094 static get DefaultType() {
5095 return DefaultType$3;
5096 }
5097 static get NAME() {
5098 return NAME$4;
5099 }
5100
5101 // Public
5102 enable() {
5103 this._isEnabled = true;
5104 }
5105 disable() {
5106 this._isEnabled = false;
5107 }
5108 toggleEnabled() {
5109 this._isEnabled = !this._isEnabled;
5110 }
5111 toggle() {
5112 if (!this._isEnabled) {
5113 return;
5114 }
5115 this._activeTrigger.click = !this._activeTrigger.click;
5116 if (this._isShown()) {
5117 this._leave();
5118 return;
5119 }
5120 this._enter();
5121 }
5122 dispose() {
5123 clearTimeout(this._timeout);
5124 EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
5125 if (this._element.getAttribute('data-bs-original-title')) {
5126 this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
5127 }
5128 this._disposePopper();
5129 super.dispose();
5130 }
5131 show() {
5132 if (this._element.style.display === 'none') {
5133 throw new Error('Please use show on visible elements');
5134 }
5135 if (!(this._isWithContent() && this._isEnabled)) {
5136 return;
5137 }
5138 const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
5139 const shadowRoot = findShadowRoot(this._element);
5140 const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
5141 if (showEvent.defaultPrevented || !isInTheDom) {
5142 return;
5143 }
5144
5145 // TODO: v6 remove this or make it optional
5146 this._disposePopper();
5147 const tip = this._getTipElement();
5148 this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
5149 const {
5150 container
5151 } = this._config;
5152 if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
5153 container.append(tip);
5154 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
5155 }
5156 this._popper = this._createPopper(tip);
5157 tip.classList.add(CLASS_NAME_SHOW$2);
5158
5159 // If this is a touch-enabled device we add extra
5160 // empty mouseover listeners to the body's immediate children;
5161 // only needed because of broken event delegation on iOS
5162 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
5163 if ('ontouchstart' in document.documentElement) {
5164 for (const element of [].concat(...document.body.children)) {
5165 EventHandler.on(element, 'mouseover', noop);
5166 }
5167 }
5168 const complete = () => {
5169 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
5170 if (this._isHovered === false) {
5171 this._leave();
5172 }
5173 this._isHovered = false;
5174 };
5175 this._queueCallback(complete, this.tip, this._isAnimated());
5176 }
5177 hide() {
5178 if (!this._isShown()) {
5179 return;
5180 }
5181 const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
5182 if (hideEvent.defaultPrevented) {
5183 return;
5184 }
5185 const tip = this._getTipElement();
5186 tip.classList.remove(CLASS_NAME_SHOW$2);
5187
5188 // If this is a touch-enabled device we remove the extra
5189 // empty mouseover listeners we added for iOS support
5190 if ('ontouchstart' in document.documentElement) {
5191 for (const element of [].concat(...document.body.children)) {
5192 EventHandler.off(element, 'mouseover', noop);
5193 }
5194 }
5195 this._activeTrigger[TRIGGER_CLICK] = false;
5196 this._activeTrigger[TRIGGER_FOCUS] = false;
5197 this._activeTrigger[TRIGGER_HOVER] = false;
5198 this._isHovered = null; // it is a trick to support manual triggering
5199
5200 const complete = () => {
5201 if (this._isWithActiveTrigger()) {
5202 return;
5203 }
5204 if (!this._isHovered) {
5205 this._disposePopper();
5206 }
5207 this._element.removeAttribute('aria-describedby');
5208 EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
5209 };
5210 this._queueCallback(complete, this.tip, this._isAnimated());
5211 }
5212 update() {
5213 if (this._popper) {
5214 this._popper.update();
5215 }
5216 }
5217
5218 // Protected
5219 _isWithContent() {
5220 return Boolean(this._getTitle());
5221 }
5222 _getTipElement() {
5223 if (!this.tip) {
5224 this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
5225 }
5226 return this.tip;
5227 }
5228 _createTipElement(content) {
5229 const tip = this._getTemplateFactory(content).toHtml();
5230
5231 // TODO: remove this check in v6
5232 if (!tip) {
5233 return null;
5234 }
5235 tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
5236 // TODO: v6 the following can be achieved with CSS only
5237 tip.classList.add(`bs-${this.constructor.NAME}-auto`);
5238 const tipId = getUID(this.constructor.NAME).toString();
5239 tip.setAttribute('id', tipId);
5240 if (this._isAnimated()) {
5241 tip.classList.add(CLASS_NAME_FADE$2);
5242 }
5243 return tip;
5244 }
5245 setContent(content) {
5246 this._newContent = content;
5247 if (this._isShown()) {
5248 this._disposePopper();
5249 this.show();
5250 }
5251 }
5252 _getTemplateFactory(content) {
5253 if (this._templateFactory) {
5254 this._templateFactory.changeContent(content);
5255 } else {
5256 this._templateFactory = new TemplateFactory({
5257 ...this._config,
5258 // the `content` var has to be after `this._config`
5259 // to override config.content in case of popover
5260 content,
5261 extraClass: this._resolvePossibleFunction(this._config.customClass)
5262 });
5263 }
5264 return this._templateFactory;
5265 }
5266 _getContentForTemplate() {
5267 return {
5268 [SELECTOR_TOOLTIP_INNER]: this._getTitle()
5269 };
5270 }
5271 _getTitle() {
5272 return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');
5273 }
5274
5275 // Private
5276 _initializeOnDelegatedTarget(event) {
5277 return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
5278 }
5279 _isAnimated() {
5280 return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
5281 }
5282 _isShown() {
5283 return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
5284 }
5285 _createPopper(tip) {
5286 const placement = execute(this._config.placement, [this, tip, this._element]);
5287 const attachment = AttachmentMap[placement.toUpperCase()];
5288 return createPopper(this._element, tip, this._getPopperConfig(attachment));
5289 }
5290 _getOffset() {
5291 const {
5292 offset
5293 } = this._config;
5294 if (typeof offset === 'string') {
5295 return offset.split(',').map(value => Number.parseInt(value, 10));
5296 }
5297 if (typeof offset === 'function') {
5298 return popperData => offset(popperData, this._element);
5299 }
5300 return offset;
5301 }
5302 _resolvePossibleFunction(arg) {
5303 return execute(arg, [this._element]);
5304 }
5305 _getPopperConfig(attachment) {
5306 const defaultBsPopperConfig = {
5307 placement: attachment,
5308 modifiers: [{
5309 name: 'flip',
5310 options: {
5311 fallbackPlacements: this._config.fallbackPlacements
5312 }
5313 }, {
5314 name: 'offset',
5315 options: {
5316 offset: this._getOffset()
5317 }
5318 }, {
5319 name: 'preventOverflow',
5320 options: {
5321 boundary: this._config.boundary
5322 }
5323 }, {
5324 name: 'arrow',
5325 options: {
5326 element: `.${this.constructor.NAME}-arrow`
5327 }
5328 }, {
5329 name: 'preSetPlacement',
5330 enabled: true,
5331 phase: 'beforeMain',
5332 fn: data => {
5333 // Pre-set Popper's placement attribute in order to read the arrow sizes properly.
5334 // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement
5335 this._getTipElement().setAttribute('data-popper-placement', data.state.placement);
5336 }
5337 }]
5338 };
5339 return {
5340 ...defaultBsPopperConfig,
5341 ...execute(this._config.popperConfig, [defaultBsPopperConfig])
5342 };
5343 }
5344 _setListeners() {
5345 const triggers = this._config.trigger.split(' ');
5346 for (const trigger of triggers) {
5347 if (trigger === 'click') {
5348 EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {
5349 const context = this._initializeOnDelegatedTarget(event);
5350 context.toggle();
5351 });
5352 } else if (trigger !== TRIGGER_MANUAL) {
5353 const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
5354 const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
5355 EventHandler.on(this._element, eventIn, this._config.selector, event => {
5356 const context = this._initializeOnDelegatedTarget(event);
5357 context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
5358 context._enter();
5359 });
5360 EventHandler.on(this._element, eventOut, this._config.selector, event => {
5361 const context = this._initializeOnDelegatedTarget(event);
5362 context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
5363 context._leave();
5364 });
5365 }
5366 }
5367 this._hideModalHandler = () => {
5368 if (this._element) {
5369 this.hide();
5370 }
5371 };
5372 EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
5373 }
5374 _fixTitle() {
5375 const title = this._element.getAttribute('title');
5376 if (!title) {
5377 return;
5378 }
5379 if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
5380 this._element.setAttribute('aria-label', title);
5381 }
5382 this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
5383 this._element.removeAttribute('title');
5384 }
5385 _enter() {
5386 if (this._isShown() || this._isHovered) {
5387 this._isHovered = true;
5388 return;
5389 }
5390 this._isHovered = true;
5391 this._setTimeout(() => {
5392 if (this._isHovered) {
5393 this.show();
5394 }
5395 }, this._config.delay.show);
5396 }
5397 _leave() {
5398 if (this._isWithActiveTrigger()) {
5399 return;
5400 }
5401 this._isHovered = false;
5402 this._setTimeout(() => {
5403 if (!this._isHovered) {
5404 this.hide();
5405 }
5406 }, this._config.delay.hide);
5407 }
5408 _setTimeout(handler, timeout) {
5409 clearTimeout(this._timeout);
5410 this._timeout = setTimeout(handler, timeout);
5411 }
5412 _isWithActiveTrigger() {
5413 return Object.values(this._activeTrigger).includes(true);
5414 }
5415 _getConfig(config) {
5416 const dataAttributes = Manipulator.getDataAttributes(this._element);
5417 for (const dataAttribute of Object.keys(dataAttributes)) {
5418 if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
5419 delete dataAttributes[dataAttribute];
5420 }
5421 }
5422 config = {
5423 ...dataAttributes,
5424 ...(typeof config === 'object' && config ? config : {})
5425 };
5426 config = this._mergeConfigObj(config);
5427 config = this._configAfterMerge(config);
5428 this._typeCheckConfig(config);
5429 return config;
5430 }
5431 _configAfterMerge(config) {
5432 config.container = config.container === false ? document.body : getElement(config.container);
5433 if (typeof config.delay === 'number') {
5434 config.delay = {
5435 show: config.delay,
5436 hide: config.delay
5437 };
5438 }
5439 if (typeof config.title === 'number') {
5440 config.title = config.title.toString();
5441 }
5442 if (typeof config.content === 'number') {
5443 config.content = config.content.toString();
5444 }
5445 return config;
5446 }
5447 _getDelegateConfig() {
5448 const config = {};
5449 for (const [key, value] of Object.entries(this._config)) {
5450 if (this.constructor.Default[key] !== value) {
5451 config[key] = value;
5452 }
5453 }
5454 config.selector = false;
5455 config.trigger = 'manual';
5456
5457 // In the future can be replaced with:
5458 // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
5459 // `Object.fromEntries(keysWithDifferentValues)`
5460 return config;
5461 }
5462 _disposePopper() {
5463 if (this._popper) {
5464 this._popper.destroy();
5465 this._popper = null;
5466 }
5467 if (this.tip) {
5468 this.tip.remove();
5469 this.tip = null;
5470 }
5471 }
5472
5473 // Static
5474 static jQueryInterface(config) {
5475 return this.each(function () {
5476 const data = Tooltip.getOrCreateInstance(this, config);
5477 if (typeof config !== 'string') {
5478 return;
5479 }
5480 if (typeof data[config] === 'undefined') {
5481 throw new TypeError(`No method named "${config}"`);
5482 }
5483 data[config]();
5484 });
5485 }
5486 }
5487
5488 /**
5489 * jQuery
5490 */
5491
5492 defineJQueryPlugin(Tooltip);
5493
5494 /**
5495 * --------------------------------------------------------------------------
5496 * Bootstrap popover.js
5497 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5498 * --------------------------------------------------------------------------
5499 */
5500
5501
5502 /**
5503 * Constants
5504 */
5505
5506 const NAME$3 = 'popover';
5507 const SELECTOR_TITLE = '.popover-header';
5508 const SELECTOR_CONTENT = '.popover-body';
5509 const Default$2 = {
5510 ...Tooltip.Default,
5511 content: '',
5512 offset: [0, 8],
5513 placement: 'right',
5514 template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>',
5515 trigger: 'click'
5516 };
5517 const DefaultType$2 = {
5518 ...Tooltip.DefaultType,
5519 content: '(null|string|element|function)'
5520 };
5521
5522 /**
5523 * Class definition
5524 */
5525
5526 class Popover extends Tooltip {
5527 // Getters
5528 static get Default() {
5529 return Default$2;
5530 }
5531 static get DefaultType() {
5532 return DefaultType$2;
5533 }
5534 static get NAME() {
5535 return NAME$3;
5536 }
5537
5538 // Overrides
5539 _isWithContent() {
5540 return this._getTitle() || this._getContent();
5541 }
5542
5543 // Private
5544 _getContentForTemplate() {
5545 return {
5546 [SELECTOR_TITLE]: this._getTitle(),
5547 [SELECTOR_CONTENT]: this._getContent()
5548 };
5549 }
5550 _getContent() {
5551 return this._resolvePossibleFunction(this._config.content);
5552 }
5553
5554 // Static
5555 static jQueryInterface(config) {
5556 return this.each(function () {
5557 const data = Popover.getOrCreateInstance(this, config);
5558 if (typeof config !== 'string') {
5559 return;
5560 }
5561 if (typeof data[config] === 'undefined') {
5562 throw new TypeError(`No method named "${config}"`);
5563 }
5564 data[config]();
5565 });
5566 }
5567 }
5568
5569 /**
5570 * jQuery
5571 */
5572
5573 defineJQueryPlugin(Popover);
5574
5575 /**
5576 * --------------------------------------------------------------------------
5577 * Bootstrap scrollspy.js
5578 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5579 * --------------------------------------------------------------------------
5580 */
5581
5582
5583 /**
5584 * Constants
5585 */
5586
5587 const NAME$2 = 'scrollspy';
5588 const DATA_KEY$2 = 'bs.scrollspy';
5589 const EVENT_KEY$2 = `.${DATA_KEY$2}`;
5590 const DATA_API_KEY = '.data-api';
5591 const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
5592 const EVENT_CLICK = `click${EVENT_KEY$2}`;
5593 const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
5594 const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
5595 const CLASS_NAME_ACTIVE$1 = 'active';
5596 const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
5597 const SELECTOR_TARGET_LINKS = '[href]';
5598 const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
5599 const SELECTOR_NAV_LINKS = '.nav-link';
5600 const SELECTOR_NAV_ITEMS = '.nav-item';
5601 const SELECTOR_LIST_ITEMS = '.list-group-item';
5602 const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
5603 const SELECTOR_DROPDOWN = '.dropdown';
5604 const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
5605 const Default$1 = {
5606 offset: null,
5607 // TODO: v6 @deprecated, keep it for backwards compatibility reasons
5608 rootMargin: '0px 0px -25%',
5609 smoothScroll: false,
5610 target: null,
5611 threshold: [0.1, 0.5, 1]
5612 };
5613 const DefaultType$1 = {
5614 offset: '(number|null)',
5615 // TODO v6 @deprecated, keep it for backwards compatibility reasons
5616 rootMargin: 'string',
5617 smoothScroll: 'boolean',
5618 target: 'element',
5619 threshold: 'array'
5620 };
5621
5622 /**
5623 * Class definition
5624 */
5625
5626 class ScrollSpy extends BaseComponent {
5627 constructor(element, config) {
5628 super(element, config);
5629
5630 // this._element is the observablesContainer and config.target the menu links wrapper
5631 this._targetLinks = new Map();
5632 this._observableSections = new Map();
5633 this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;
5634 this._activeTarget = null;
5635 this._observer = null;
5636 this._previousScrollData = {
5637 visibleEntryTop: 0,
5638 parentScrollTop: 0
5639 };
5640 this.refresh(); // initialize
5641 }
5642
5643 // Getters
5644 static get Default() {
5645 return Default$1;
5646 }
5647 static get DefaultType() {
5648 return DefaultType$1;
5649 }
5650 static get NAME() {
5651 return NAME$2;
5652 }
5653
5654 // Public
5655 refresh() {
5656 this._initializeTargetsAndObservables();
5657 this._maybeEnableSmoothScroll();
5658 if (this._observer) {
5659 this._observer.disconnect();
5660 } else {
5661 this._observer = this._getNewObserver();
5662 }
5663 for (const section of this._observableSections.values()) {
5664 this._observer.observe(section);
5665 }
5666 }
5667 dispose() {
5668 this._observer.disconnect();
5669 super.dispose();
5670 }
5671
5672 // Private
5673 _configAfterMerge(config) {
5674 // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
5675 config.target = getElement(config.target) || document.body;
5676
5677 // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
5678 config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
5679 if (typeof config.threshold === 'string') {
5680 config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));
5681 }
5682 return config;
5683 }
5684 _maybeEnableSmoothScroll() {
5685 if (!this._config.smoothScroll) {
5686 return;
5687 }
5688
5689 // unregister any previous listeners
5690 EventHandler.off(this._config.target, EVENT_CLICK);
5691 EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
5692 const observableSection = this._observableSections.get(event.target.hash);
5693 if (observableSection) {
5694 event.preventDefault();
5695 const root = this._rootElement || window;
5696 const height = observableSection.offsetTop - this._element.offsetTop;
5697 if (root.scrollTo) {
5698 root.scrollTo({
5699 top: height,
5700 behavior: 'smooth'
5701 });
5702 return;
5703 }
5704
5705 // Chrome 60 doesn't support `scrollTo`
5706 root.scrollTop = height;
5707 }
5708 });
5709 }
5710 _getNewObserver() {
5711 const options = {
5712 root: this._rootElement,
5713 threshold: this._config.threshold,
5714 rootMargin: this._config.rootMargin
5715 };
5716 return new IntersectionObserver(entries => this._observerCallback(entries), options);
5717 }
5718
5719 // The logic of selection
5720 _observerCallback(entries) {
5721 const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);
5722 const activate = entry => {
5723 this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
5724 this._process(targetElement(entry));
5725 };
5726 const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
5727 const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
5728 this._previousScrollData.parentScrollTop = parentScrollTop;
5729 for (const entry of entries) {
5730 if (!entry.isIntersecting) {
5731 this._activeTarget = null;
5732 this._clearActiveClass(targetElement(entry));
5733 continue;
5734 }
5735 const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
5736 // if we are scrolling down, pick the bigger offsetTop
5737 if (userScrollsDown && entryIsLowerThanPrevious) {
5738 activate(entry);
5739 // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
5740 if (!parentScrollTop) {
5741 return;
5742 }
5743 continue;
5744 }
5745
5746 // if we are scrolling up, pick the smallest offsetTop
5747 if (!userScrollsDown && !entryIsLowerThanPrevious) {
5748 activate(entry);
5749 }
5750 }
5751 }
5752 _initializeTargetsAndObservables() {
5753 this._targetLinks = new Map();
5754 this._observableSections = new Map();
5755 const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
5756 for (const anchor of targetLinks) {
5757 // ensure that the anchor has an id and is not disabled
5758 if (!anchor.hash || isDisabled(anchor)) {
5759 continue;
5760 }
5761 const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
5762
5763 // ensure that the observableSection exists & is visible
5764 if (isVisible(observableSection)) {
5765 this._targetLinks.set(decodeURI(anchor.hash), anchor);
5766 this._observableSections.set(anchor.hash, observableSection);
5767 }
5768 }
5769 }
5770 _process(target) {
5771 if (this._activeTarget === target) {
5772 return;
5773 }
5774 this._clearActiveClass(this._config.target);
5775 this._activeTarget = target;
5776 target.classList.add(CLASS_NAME_ACTIVE$1);
5777 this._activateParents(target);
5778 EventHandler.trigger(this._element, EVENT_ACTIVATE, {
5779 relatedTarget: target
5780 });
5781 }
5782 _activateParents(target) {
5783 // Activate dropdown parents
5784 if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
5785 SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
5786 return;
5787 }
5788 for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
5789 // Set triggered links parents as active
5790 // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
5791 for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
5792 item.classList.add(CLASS_NAME_ACTIVE$1);
5793 }
5794 }
5795 }
5796 _clearActiveClass(parent) {
5797 parent.classList.remove(CLASS_NAME_ACTIVE$1);
5798 const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
5799 for (const node of activeNodes) {
5800 node.classList.remove(CLASS_NAME_ACTIVE$1);
5801 }
5802 }
5803
5804 // Static
5805 static jQueryInterface(config) {
5806 return this.each(function () {
5807 const data = ScrollSpy.getOrCreateInstance(this, config);
5808 if (typeof config !== 'string') {
5809 return;
5810 }
5811 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
5812 throw new TypeError(`No method named "${config}"`);
5813 }
5814 data[config]();
5815 });
5816 }
5817 }
5818
5819 /**
5820 * Data API implementation
5821 */
5822
5823 EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
5824 for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
5825 ScrollSpy.getOrCreateInstance(spy);
5826 }
5827 });
5828
5829 /**
5830 * jQuery
5831 */
5832
5833 defineJQueryPlugin(ScrollSpy);
5834
5835 /**
5836 * --------------------------------------------------------------------------
5837 * Bootstrap tab.js
5838 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5839 * --------------------------------------------------------------------------
5840 */
5841
5842
5843 /**
5844 * Constants
5845 */
5846
5847 const NAME$1 = 'tab';
5848 const DATA_KEY$1 = 'bs.tab';
5849 const EVENT_KEY$1 = `.${DATA_KEY$1}`;
5850 const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
5851 const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
5852 const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
5853 const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
5854 const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
5855 const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
5856 const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
5857 const ARROW_LEFT_KEY = 'ArrowLeft';
5858 const ARROW_RIGHT_KEY = 'ArrowRight';
5859 const ARROW_UP_KEY = 'ArrowUp';
5860 const ARROW_DOWN_KEY = 'ArrowDown';
5861 const HOME_KEY = 'Home';
5862 const END_KEY = 'End';
5863 const CLASS_NAME_ACTIVE = 'active';
5864 const CLASS_NAME_FADE$1 = 'fade';
5865 const CLASS_NAME_SHOW$1 = 'show';
5866 const CLASS_DROPDOWN = 'dropdown';
5867 const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
5868 const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
5869 const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
5870 const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
5871 const SELECTOR_OUTER = '.nav-item, .list-group-item';
5872 const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
5873 const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6
5874 const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
5875 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"]`;
5876
5877 /**
5878 * Class definition
5879 */
5880
5881 class Tab extends BaseComponent {
5882 constructor(element) {
5883 super(element);
5884 this._parent = this._element.closest(SELECTOR_TAB_PANEL);
5885 if (!this._parent) {
5886 return;
5887 // TODO: should throw exception in v6
5888 // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
5889 }
5890
5891 // Set up initial aria attributes
5892 this._setInitialAttributes(this._parent, this._getChildren());
5893 EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
5894 }
5895
5896 // Getters
5897 static get NAME() {
5898 return NAME$1;
5899 }
5900
5901 // Public
5902 show() {
5903 // Shows this elem and deactivate the active sibling if exists
5904 const innerElem = this._element;
5905 if (this._elemIsActive(innerElem)) {
5906 return;
5907 }
5908
5909 // Search for active tab on same parent to deactivate it
5910 const active = this._getActiveElem();
5911 const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
5912 relatedTarget: innerElem
5913 }) : null;
5914 const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
5915 relatedTarget: active
5916 });
5917 if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
5918 return;
5919 }
5920 this._deactivate(active, innerElem);
5921 this._activate(innerElem, active);
5922 }
5923
5924 // Private
5925 _activate(element, relatedElem) {
5926 if (!element) {
5927 return;
5928 }
5929 element.classList.add(CLASS_NAME_ACTIVE);
5930 this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
5931
5932 const complete = () => {
5933 if (element.getAttribute('role') !== 'tab') {
5934 element.classList.add(CLASS_NAME_SHOW$1);
5935 return;
5936 }
5937 element.removeAttribute('tabindex');
5938 element.setAttribute('aria-selected', true);
5939 this._toggleDropDown(element, true);
5940 EventHandler.trigger(element, EVENT_SHOWN$1, {
5941 relatedTarget: relatedElem
5942 });
5943 };
5944 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
5945 }
5946 _deactivate(element, relatedElem) {
5947 if (!element) {
5948 return;
5949 }
5950 element.classList.remove(CLASS_NAME_ACTIVE);
5951 element.blur();
5952 this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too
5953
5954 const complete = () => {
5955 if (element.getAttribute('role') !== 'tab') {
5956 element.classList.remove(CLASS_NAME_SHOW$1);
5957 return;
5958 }
5959 element.setAttribute('aria-selected', false);
5960 element.setAttribute('tabindex', '-1');
5961 this._toggleDropDown(element, false);
5962 EventHandler.trigger(element, EVENT_HIDDEN$1, {
5963 relatedTarget: relatedElem
5964 });
5965 };
5966 this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
5967 }
5968 _keydown(event) {
5969 if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
5970 return;
5971 }
5972 event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
5973 event.preventDefault();
5974 const children = this._getChildren().filter(element => !isDisabled(element));
5975 let nextActiveElement;
5976 if ([HOME_KEY, END_KEY].includes(event.key)) {
5977 nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
5978 } else {
5979 const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
5980 nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
5981 }
5982 if (nextActiveElement) {
5983 nextActiveElement.focus({
5984 preventScroll: true
5985 });
5986 Tab.getOrCreateInstance(nextActiveElement).show();
5987 }
5988 }
5989 _getChildren() {
5990 // collection of inner elements
5991 return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
5992 }
5993 _getActiveElem() {
5994 return this._getChildren().find(child => this._elemIsActive(child)) || null;
5995 }
5996 _setInitialAttributes(parent, children) {
5997 this._setAttributeIfNotExists(parent, 'role', 'tablist');
5998 for (const child of children) {
5999 this._setInitialAttributesOnChild(child);
6000 }
6001 }
6002 _setInitialAttributesOnChild(child) {
6003 child = this._getInnerElement(child);
6004 const isActive = this._elemIsActive(child);
6005 const outerElem = this._getOuterElement(child);
6006 child.setAttribute('aria-selected', isActive);
6007 if (outerElem !== child) {
6008 this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
6009 }
6010 if (!isActive) {
6011 child.setAttribute('tabindex', '-1');
6012 }
6013 this._setAttributeIfNotExists(child, 'role', 'tab');
6014
6015 // set attributes to the related panel too
6016 this._setInitialAttributesOnTargetPanel(child);
6017 }
6018 _setInitialAttributesOnTargetPanel(child) {
6019 const target = SelectorEngine.getElementFromSelector(child);
6020 if (!target) {
6021 return;
6022 }
6023 this._setAttributeIfNotExists(target, 'role', 'tabpanel');
6024 if (child.id) {
6025 this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);
6026 }
6027 }
6028 _toggleDropDown(element, open) {
6029 const outerElem = this._getOuterElement(element);
6030 if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
6031 return;
6032 }
6033 const toggle = (selector, className) => {
6034 const element = SelectorEngine.findOne(selector, outerElem);
6035 if (element) {
6036 element.classList.toggle(className, open);
6037 }
6038 };
6039 toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
6040 toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
6041 outerElem.setAttribute('aria-expanded', open);
6042 }
6043 _setAttributeIfNotExists(element, attribute, value) {
6044 if (!element.hasAttribute(attribute)) {
6045 element.setAttribute(attribute, value);
6046 }
6047 }
6048 _elemIsActive(elem) {
6049 return elem.classList.contains(CLASS_NAME_ACTIVE);
6050 }
6051
6052 // Try to get the inner element (usually the .nav-link)
6053 _getInnerElement(elem) {
6054 return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
6055 }
6056
6057 // Try to get the outer element (usually the .nav-item)
6058 _getOuterElement(elem) {
6059 return elem.closest(SELECTOR_OUTER) || elem;
6060 }
6061
6062 // Static
6063 static jQueryInterface(config) {
6064 return this.each(function () {
6065 const data = Tab.getOrCreateInstance(this);
6066 if (typeof config !== 'string') {
6067 return;
6068 }
6069 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
6070 throw new TypeError(`No method named "${config}"`);
6071 }
6072 data[config]();
6073 });
6074 }
6075 }
6076
6077 /**
6078 * Data API implementation
6079 */
6080
6081 EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
6082 if (['A', 'AREA'].includes(this.tagName)) {
6083 event.preventDefault();
6084 }
6085 if (isDisabled(this)) {
6086 return;
6087 }
6088 Tab.getOrCreateInstance(this).show();
6089 });
6090
6091 /**
6092 * Initialize on focus
6093 */
6094 EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
6095 for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
6096 Tab.getOrCreateInstance(element);
6097 }
6098 });
6099 /**
6100 * jQuery
6101 */
6102
6103 defineJQueryPlugin(Tab);
6104
6105 /**
6106 * --------------------------------------------------------------------------
6107 * Bootstrap toast.js
6108 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6109 * --------------------------------------------------------------------------
6110 */
6111
6112
6113 /**
6114 * Constants
6115 */
6116
6117 const NAME = 'toast';
6118 const DATA_KEY = 'bs.toast';
6119 const EVENT_KEY = `.${DATA_KEY}`;
6120 const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
6121 const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
6122 const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
6123 const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
6124 const EVENT_HIDE = `hide${EVENT_KEY}`;
6125 const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
6126 const EVENT_SHOW = `show${EVENT_KEY}`;
6127 const EVENT_SHOWN = `shown${EVENT_KEY}`;
6128 const CLASS_NAME_FADE = 'fade';
6129 const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
6130 const CLASS_NAME_SHOW = 'show';
6131 const CLASS_NAME_SHOWING = 'showing';
6132 const DefaultType = {
6133 animation: 'boolean',
6134 autohide: 'boolean',
6135 delay: 'number'
6136 };
6137 const Default = {
6138 animation: true,
6139 autohide: true,
6140 delay: 5000
6141 };
6142
6143 /**
6144 * Class definition
6145 */
6146
6147 class Toast extends BaseComponent {
6148 constructor(element, config) {
6149 super(element, config);
6150 this._timeout = null;
6151 this._hasMouseInteraction = false;
6152 this._hasKeyboardInteraction = false;
6153 this._setListeners();
6154 }
6155
6156 // Getters
6157 static get Default() {
6158 return Default;
6159 }
6160 static get DefaultType() {
6161 return DefaultType;
6162 }
6163 static get NAME() {
6164 return NAME;
6165 }
6166
6167 // Public
6168 show() {
6169 const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
6170 if (showEvent.defaultPrevented) {
6171 return;
6172 }
6173 this._clearTimeout();
6174 if (this._config.animation) {
6175 this._element.classList.add(CLASS_NAME_FADE);
6176 }
6177 const complete = () => {
6178 this._element.classList.remove(CLASS_NAME_SHOWING);
6179 EventHandler.trigger(this._element, EVENT_SHOWN);
6180 this._maybeScheduleHide();
6181 };
6182 this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
6183 reflow(this._element);
6184 this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
6185 this._queueCallback(complete, this._element, this._config.animation);
6186 }
6187 hide() {
6188 if (!this.isShown()) {
6189 return;
6190 }
6191 const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
6192 if (hideEvent.defaultPrevented) {
6193 return;
6194 }
6195 const complete = () => {
6196 this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
6197 this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
6198 EventHandler.trigger(this._element, EVENT_HIDDEN);
6199 };
6200 this._element.classList.add(CLASS_NAME_SHOWING);
6201 this._queueCallback(complete, this._element, this._config.animation);
6202 }
6203 dispose() {
6204 this._clearTimeout();
6205 if (this.isShown()) {
6206 this._element.classList.remove(CLASS_NAME_SHOW);
6207 }
6208 super.dispose();
6209 }
6210 isShown() {
6211 return this._element.classList.contains(CLASS_NAME_SHOW);
6212 }
6213
6214 // Private
6215
6216 _maybeScheduleHide() {
6217 if (!this._config.autohide) {
6218 return;
6219 }
6220 if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
6221 return;
6222 }
6223 this._timeout = setTimeout(() => {
6224 this.hide();
6225 }, this._config.delay);
6226 }
6227 _onInteraction(event, isInteracting) {
6228 switch (event.type) {
6229 case 'mouseover':
6230 case 'mouseout':
6231 {
6232 this._hasMouseInteraction = isInteracting;
6233 break;
6234 }
6235 case 'focusin':
6236 case 'focusout':
6237 {
6238 this._hasKeyboardInteraction = isInteracting;
6239 break;
6240 }
6241 }
6242 if (isInteracting) {
6243 this._clearTimeout();
6244 return;
6245 }
6246 const nextElement = event.relatedTarget;
6247 if (this._element === nextElement || this._element.contains(nextElement)) {
6248 return;
6249 }
6250 this._maybeScheduleHide();
6251 }
6252 _setListeners() {
6253 EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
6254 EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
6255 EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
6256 EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
6257 }
6258 _clearTimeout() {
6259 clearTimeout(this._timeout);
6260 this._timeout = null;
6261 }
6262
6263 // Static
6264 static jQueryInterface(config) {
6265 return this.each(function () {
6266 const data = Toast.getOrCreateInstance(this, config);
6267 if (typeof config === 'string') {
6268 if (typeof data[config] === 'undefined') {
6269 throw new TypeError(`No method named "${config}"`);
6270 }
6271 data[config](this);
6272 }
6273 });
6274 }
6275 }
6276
6277 /**
6278 * Data API implementation
6279 */
6280
6281 enableDismissTrigger(Toast);
6282
6283 /**
6284 * jQuery
6285 */
6286
6287 defineJQueryPlugin(Toast);
6288
6289 /**
6290 * --------------------------------------------------------------------------
6291 * Bootstrap index.umd.js
6292 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6293 * --------------------------------------------------------------------------
6294 */
6295
6296 const index_umd = {
6297 Alert,
6298 Button,
6299 Carousel,
6300 Collapse,
6301 Dropdown,
6302 Modal,
6303 Offcanvas,
6304 Popover,
6305 ScrollSpy,
6306 Tab,
6307 Toast,
6308 Tooltip
6309 };
6310
6311 return index_umd;
6312
6313}));
6314//# sourceMappingURL=bootstrap.bundle.js.map
Note: See TracBrowser for help on using the repository browser.