Subversion Repositories oidplus

Rev

Rev 637 | Rev 846 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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