프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / ConvertService / ServiceBase / UploadFonts / Scripts / bootstrap.js @ f333dcc2

이력 | 보기 | 이력해설 | 다운로드 (142 KB)

1 950e6b84 taeseongkim
/*!
2 65674874 taeseongkim
  * Bootstrap v5.2.3 (https://getbootstrap.com/)
3
  * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
  */
6
(function (global, factory) {
7
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :
8
  typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));
10
})(this, (function (Popper) { 'use strict';
11
12
  function _interopNamespace(e) {
13
    if (e && e.__esModule) return e;
14
    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
15
    if (e) {
16
      for (const k in e) {
17
        if (k !== 'default') {
18
          const d = Object.getOwnPropertyDescriptor(e, k);
19
          Object.defineProperty(n, k, d.get ? d : {
20
            enumerable: true,
21
            get: () => e[k]
22
          });
23
        }
24
      }
25
    }
26
    n.default = e;
27
    return Object.freeze(n);
28 950e6b84 taeseongkim
  }
29
30 65674874 taeseongkim
  const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
31 950e6b84 taeseongkim
32 65674874 taeseongkim
  /**
33
   * --------------------------------------------------------------------------
34
   * Bootstrap (v5.2.3): util/index.js
35
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
36
   * --------------------------------------------------------------------------
37
   */
38
  const MAX_UID = 1000000;
39
  const MILLISECONDS_MULTIPLIER = 1000;
40
  const TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp)
41 950e6b84 taeseongkim
42 65674874 taeseongkim
  const toType = object => {
43
    if (object === null || object === undefined) {
44
      return `${object}`;
45
    }
46 950e6b84 taeseongkim
47 65674874 taeseongkim
    return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
48
  };
49
  /**
50
   * Public Util API
51
   */
52 950e6b84 taeseongkim
53
54 65674874 taeseongkim
  const getUID = prefix => {
55
    do {
56
      prefix += Math.floor(Math.random() * MAX_UID);
57
    } while (document.getElementById(prefix));
58 950e6b84 taeseongkim
59 65674874 taeseongkim
    return prefix;
60
  };
61 950e6b84 taeseongkim
62 65674874 taeseongkim
  const getSelector = element => {
63
    let selector = element.getAttribute('data-bs-target');
64 950e6b84 taeseongkim
65 65674874 taeseongkim
    if (!selector || selector === '#') {
66
      let hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
67
      // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
68
      // `document.querySelector` will rightfully complain it is invalid.
69
      // See https://github.com/twbs/bootstrap/issues/32273
70 950e6b84 taeseongkim
71 65674874 taeseongkim
      if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
72
        return null;
73
      } // Just in case some CMS puts out a full URL with the anchor appended
74 950e6b84 taeseongkim
75
76 65674874 taeseongkim
      if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
77
        hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
78 950e6b84 taeseongkim
      }
79 65674874 taeseongkim
80
      selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
81 950e6b84 taeseongkim
    }
82
83 65674874 taeseongkim
    return selector;
84
  };
85 950e6b84 taeseongkim
86 65674874 taeseongkim
  const getSelectorFromElement = element => {
87
    const selector = getSelector(element);
88 950e6b84 taeseongkim
89 65674874 taeseongkim
    if (selector) {
90
      return document.querySelector(selector) ? selector : null;
91
    }
92 950e6b84 taeseongkim
93 65674874 taeseongkim
    return null;
94
  };
95 950e6b84 taeseongkim
96 65674874 taeseongkim
  const getElementFromSelector = element => {
97
    const selector = getSelector(element);
98
    return selector ? document.querySelector(selector) : null;
99
  };
100 950e6b84 taeseongkim
101 65674874 taeseongkim
  const getTransitionDurationFromElement = element => {
102
    if (!element) {
103
      return 0;
104
    } // Get transition-duration of the element
105 950e6b84 taeseongkim
106
107 65674874 taeseongkim
    let {
108
      transitionDuration,
109
      transitionDelay
110
    } = window.getComputedStyle(element);
111
    const floatTransitionDuration = Number.parseFloat(transitionDuration);
112
    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
113 950e6b84 taeseongkim
114 65674874 taeseongkim
    if (!floatTransitionDuration && !floatTransitionDelay) {
115
      return 0;
116
    } // If multiple durations are defined, take the first
117 950e6b84 taeseongkim
118
119 65674874 taeseongkim
    transitionDuration = transitionDuration.split(',')[0];
120
    transitionDelay = transitionDelay.split(',')[0];
121
    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
122
  };
123 950e6b84 taeseongkim
124 65674874 taeseongkim
  const triggerTransitionEnd = element => {
125
    element.dispatchEvent(new Event(TRANSITION_END));
126
  };
127 950e6b84 taeseongkim
128 65674874 taeseongkim
  const isElement = object => {
129
    if (!object || typeof object !== 'object') {
130
      return false;
131 950e6b84 taeseongkim
    }
132
133 65674874 taeseongkim
    if (typeof object.jquery !== 'undefined') {
134
      object = object[0];
135
    }
136 950e6b84 taeseongkim
137 65674874 taeseongkim
    return typeof object.nodeType !== 'undefined';
138
  };
139 950e6b84 taeseongkim
140 65674874 taeseongkim
  const getElement = object => {
141
    // it's a jQuery object or a node element
142
    if (isElement(object)) {
143
      return object.jquery ? object[0] : object;
144
    }
145 950e6b84 taeseongkim
146 65674874 taeseongkim
    if (typeof object === 'string' && object.length > 0) {
147
      return document.querySelector(object);
148 950e6b84 taeseongkim
    }
149
150 65674874 taeseongkim
    return null;
151
  };
152 950e6b84 taeseongkim
153 65674874 taeseongkim
  const isVisible = element => {
154
    if (!isElement(element) || element.getClientRects().length === 0) {
155
      return false;
156
    }
157 950e6b84 taeseongkim
158 65674874 taeseongkim
    const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed
159 950e6b84 taeseongkim
160 65674874 taeseongkim
    const closedDetails = element.closest('details:not([open])');
161 950e6b84 taeseongkim
162 65674874 taeseongkim
    if (!closedDetails) {
163
      return elementIsVisible;
164
    }
165 950e6b84 taeseongkim
166 65674874 taeseongkim
    if (closedDetails !== element) {
167
      const summary = element.closest('summary');
168 950e6b84 taeseongkim
169 65674874 taeseongkim
      if (summary && summary.parentNode !== closedDetails) {
170
        return false;
171
      }
172 950e6b84 taeseongkim
173 65674874 taeseongkim
      if (summary === null) {
174
        return false;
175
      }
176
    }
177 950e6b84 taeseongkim
178 65674874 taeseongkim
    return elementIsVisible;
179
  };
180 950e6b84 taeseongkim
181 65674874 taeseongkim
  const isDisabled = element => {
182
    if (!element || element.nodeType !== Node.ELEMENT_NODE) {
183
      return true;
184
    }
185
186
    if (element.classList.contains('disabled')) {
187
      return true;
188
    }
189 950e6b84 taeseongkim
190 65674874 taeseongkim
    if (typeof element.disabled !== 'undefined') {
191
      return element.disabled;
192
    }
193 950e6b84 taeseongkim
194 65674874 taeseongkim
    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
195
  };
196 950e6b84 taeseongkim
197 65674874 taeseongkim
  const findShadowRoot = element => {
198
    if (!document.documentElement.attachShadow) {
199
      return null;
200
    } // Can find the shadow root otherwise it'll return the document
201 950e6b84 taeseongkim
202
203 65674874 taeseongkim
    if (typeof element.getRootNode === 'function') {
204
      const root = element.getRootNode();
205
      return root instanceof ShadowRoot ? root : null;
206
    }
207 950e6b84 taeseongkim
208 65674874 taeseongkim
    if (element instanceof ShadowRoot) {
209
      return element;
210
    } // when we don't find a shadow root
211 950e6b84 taeseongkim
212
213 65674874 taeseongkim
    if (!element.parentNode) {
214
      return null;
215
    }
216 950e6b84 taeseongkim
217 65674874 taeseongkim
    return findShadowRoot(element.parentNode);
218
  };
219 950e6b84 taeseongkim
220 65674874 taeseongkim
  const noop = () => {};
221
  /**
222
   * Trick to restart an element's animation
223
   *
224
   * @param {HTMLElement} element
225
   * @return void
226
   *
227
   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
228
   */
229 950e6b84 taeseongkim
230
231 65674874 taeseongkim
  const reflow = element => {
232
    element.offsetHeight; // eslint-disable-line no-unused-expressions
233
  };
234 950e6b84 taeseongkim
235 65674874 taeseongkim
  const getjQuery = () => {
236
    if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
237
      return window.jQuery;
238
    }
239 950e6b84 taeseongkim
240 65674874 taeseongkim
    return null;
241
  };
242 950e6b84 taeseongkim
243 65674874 taeseongkim
  const DOMContentLoadedCallbacks = [];
244 950e6b84 taeseongkim
245 65674874 taeseongkim
  const onDOMContentLoaded = callback => {
246
    if (document.readyState === 'loading') {
247
      // add listener on the first call when the document is in loading state
248
      if (!DOMContentLoadedCallbacks.length) {
249
        document.addEventListener('DOMContentLoaded', () => {
250
          for (const callback of DOMContentLoadedCallbacks) {
251
            callback();
252
          }
253
        });
254 950e6b84 taeseongkim
      }
255
256 65674874 taeseongkim
      DOMContentLoadedCallbacks.push(callback);
257 950e6b84 taeseongkim
    } else {
258 65674874 taeseongkim
      callback();
259 950e6b84 taeseongkim
    }
260 65674874 taeseongkim
  };
261 950e6b84 taeseongkim
262 65674874 taeseongkim
  const isRTL = () => document.documentElement.dir === 'rtl';
263 950e6b84 taeseongkim
264 65674874 taeseongkim
  const defineJQueryPlugin = plugin => {
265
    onDOMContentLoaded(() => {
266
      const $ = getjQuery();
267
      /* istanbul ignore if */
268 950e6b84 taeseongkim
269 65674874 taeseongkim
      if ($) {
270
        const name = plugin.NAME;
271
        const JQUERY_NO_CONFLICT = $.fn[name];
272
        $.fn[name] = plugin.jQueryInterface;
273
        $.fn[name].Constructor = plugin;
274 950e6b84 taeseongkim
275 65674874 taeseongkim
        $.fn[name].noConflict = () => {
276
          $.fn[name] = JQUERY_NO_CONFLICT;
277
          return plugin.jQueryInterface;
278
        };
279
      }
280
    });
281
  };
282 950e6b84 taeseongkim
283 65674874 taeseongkim
  const execute = callback => {
284
    if (typeof callback === 'function') {
285
      callback();
286
    }
287
  };
288 950e6b84 taeseongkim
289 65674874 taeseongkim
  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
290
    if (!waitForTransition) {
291
      execute(callback);
292
      return;
293
    }
294 950e6b84 taeseongkim
295 65674874 taeseongkim
    const durationPadding = 5;
296
    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
297
    let called = false;
298 950e6b84 taeseongkim
299 65674874 taeseongkim
    const handler = ({
300
      target
301
    }) => {
302
      if (target !== transitionElement) {
303
        return;
304
      }
305 950e6b84 taeseongkim
306 65674874 taeseongkim
      called = true;
307
      transitionElement.removeEventListener(TRANSITION_END, handler);
308
      execute(callback);
309
    };
310 950e6b84 taeseongkim
311 65674874 taeseongkim
    transitionElement.addEventListener(TRANSITION_END, handler);
312
    setTimeout(() => {
313
      if (!called) {
314
        triggerTransitionEnd(transitionElement);
315
      }
316
    }, emulatedDuration);
317
  };
318
  /**
319
   * Return the previous/next element of a list.
320
   *
321
   * @param {array} list    The list of elements
322
   * @param activeElement   The active element
323
   * @param shouldGetNext   Choose to get next or previous element
324
   * @param isCycleAllowed
325
   * @return {Element|elem} The proper element
326
   */
327 950e6b84 taeseongkim
328
329 65674874 taeseongkim
  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
330
    const listLength = list.length;
331
    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element
332
    // depending on the direction and if cycle is allowed
333 950e6b84 taeseongkim
334 65674874 taeseongkim
    if (index === -1) {
335
      return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
336 950e6b84 taeseongkim
    }
337
338 65674874 taeseongkim
    index += shouldGetNext ? 1 : -1;
339 950e6b84 taeseongkim
340 65674874 taeseongkim
    if (isCycleAllowed) {
341
      index = (index + listLength) % listLength;
342
    }
343 950e6b84 taeseongkim
344 65674874 taeseongkim
    return list[Math.max(0, Math.min(index, listLength - 1))];
345
  };
346 950e6b84 taeseongkim
347 65674874 taeseongkim
  /**
348
   * --------------------------------------------------------------------------
349
   * Bootstrap (v5.2.3): dom/event-handler.js
350
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
351
   * --------------------------------------------------------------------------
352
   */
353
  /**
354
   * Constants
355
   */
356 950e6b84 taeseongkim
357 65674874 taeseongkim
  const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
358
  const stripNameRegex = /\..*/;
359
  const stripUidRegex = /::\d+$/;
360
  const eventRegistry = {}; // Events storage
361
362
  let uidEvent = 1;
363
  const customEvents = {
364
    mouseenter: 'mouseover',
365
    mouseleave: 'mouseout'
366
  };
367
  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
368
  /**
369
   * Private methods
370
   */
371 950e6b84 taeseongkim
372 65674874 taeseongkim
  function makeEventUid(element, uid) {
373
    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
374 950e6b84 taeseongkim
  }
375
376 65674874 taeseongkim
  function getElementEvents(element) {
377
    const uid = makeEventUid(element);
378
    element.uidEvent = uid;
379
    eventRegistry[uid] = eventRegistry[uid] || {};
380
    return eventRegistry[uid];
381 950e6b84 taeseongkim
  }
382
383 65674874 taeseongkim
  function bootstrapHandler(element, fn) {
384
    return function handler(event) {
385
      hydrateObj(event, {
386
        delegateTarget: element
387
      });
388 950e6b84 taeseongkim
389 65674874 taeseongkim
      if (handler.oneOff) {
390
        EventHandler.off(element, event.type, fn);
391
      }
392 950e6b84 taeseongkim
393 65674874 taeseongkim
      return fn.apply(element, [event]);
394
    };
395 950e6b84 taeseongkim
  }
396
397 65674874 taeseongkim
  function bootstrapDelegationHandler(element, selector, fn) {
398
    return function handler(event) {
399
      const domElements = element.querySelectorAll(selector);
400 950e6b84 taeseongkim
401 65674874 taeseongkim
      for (let {
402
        target
403
      } = event; target && target !== this; target = target.parentNode) {
404
        for (const domElement of domElements) {
405
          if (domElement !== target) {
406
            continue;
407
          }
408
409
          hydrateObj(event, {
410
            delegateTarget: target
411
          });
412 950e6b84 taeseongkim
413 65674874 taeseongkim
          if (handler.oneOff) {
414
            EventHandler.off(element, event.type, selector, fn);
415
          }
416 950e6b84 taeseongkim
417 65674874 taeseongkim
          return fn.apply(target, [event]);
418
        }
419
      }
420
    };
421 950e6b84 taeseongkim
  }
422
423 65674874 taeseongkim
  function findHandler(events, callable, delegationSelector = null) {
424
    return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);
425 950e6b84 taeseongkim
  }
426
427 65674874 taeseongkim
  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
428
    const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check
429
430
    const callable = isDelegated ? delegationFunction : handler || delegationFunction;
431
    let typeEvent = getTypeEvent(originalTypeEvent);
432
433
    if (!nativeEvents.has(typeEvent)) {
434
      typeEvent = originalTypeEvent;
435
    }
436
437
    return [isDelegated, callable, typeEvent];
438 950e6b84 taeseongkim
  }
439
440 65674874 taeseongkim
  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
441
    if (typeof originalTypeEvent !== 'string' || !element) {
442
      return;
443 950e6b84 taeseongkim
    }
444
445 65674874 taeseongkim
    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
446
    // this prevents the handler from being dispatched the same way as mouseover or mouseout does
447 950e6b84 taeseongkim
448 65674874 taeseongkim
    if (originalTypeEvent in customEvents) {
449
      const wrapFunction = fn => {
450
        return function (event) {
451
          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
452
            return fn.call(this, event);
453
          }
454
        };
455
      };
456 950e6b84 taeseongkim
457 65674874 taeseongkim
      callable = wrapFunction(callable);
458
    }
459 950e6b84 taeseongkim
460 65674874 taeseongkim
    const events = getElementEvents(element);
461
    const handlers = events[typeEvent] || (events[typeEvent] = {});
462
    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
463 950e6b84 taeseongkim
464 65674874 taeseongkim
    if (previousFunction) {
465
      previousFunction.oneOff = previousFunction.oneOff && oneOff;
466
      return;
467
    }
468 950e6b84 taeseongkim
469 65674874 taeseongkim
    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
470
    const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
471
    fn.delegationSelector = isDelegated ? handler : null;
472
    fn.callable = callable;
473
    fn.oneOff = oneOff;
474
    fn.uidEvent = uid;
475
    handlers[uid] = fn;
476
    element.addEventListener(typeEvent, fn, isDelegated);
477 950e6b84 taeseongkim
  }
478
479 65674874 taeseongkim
  function removeHandler(element, events, typeEvent, handler, delegationSelector) {
480
    const fn = findHandler(events[typeEvent], handler, delegationSelector);
481 950e6b84 taeseongkim
482 65674874 taeseongkim
    if (!fn) {
483
      return;
484
    }
485 950e6b84 taeseongkim
486 65674874 taeseongkim
    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
487
    delete events[typeEvent][fn.uidEvent];
488
  }
489 950e6b84 taeseongkim
490 65674874 taeseongkim
  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
491
    const storeElementEvent = events[typeEvent] || {};
492 950e6b84 taeseongkim
493 65674874 taeseongkim
    for (const handlerKey of Object.keys(storeElementEvent)) {
494
      if (handlerKey.includes(namespace)) {
495
        const event = storeElementEvent[handlerKey];
496
        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
497
      }
498
    }
499 950e6b84 taeseongkim
  }
500
501 65674874 taeseongkim
  function getTypeEvent(event) {
502
    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
503
    event = event.replace(stripNameRegex, '');
504
    return customEvents[event] || event;
505
  }
506 950e6b84 taeseongkim
507 65674874 taeseongkim
  const EventHandler = {
508
    on(element, event, handler, delegationFunction) {
509
      addHandler(element, event, handler, delegationFunction, false);
510
    },
511 950e6b84 taeseongkim
512 65674874 taeseongkim
    one(element, event, handler, delegationFunction) {
513
      addHandler(element, event, handler, delegationFunction, true);
514
    },
515 950e6b84 taeseongkim
516 65674874 taeseongkim
    off(element, originalTypeEvent, handler, delegationFunction) {
517
      if (typeof originalTypeEvent !== 'string' || !element) {
518
        return;
519
      }
520 950e6b84 taeseongkim
521 65674874 taeseongkim
      const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
522
      const inNamespace = typeEvent !== originalTypeEvent;
523
      const events = getElementEvents(element);
524
      const storeElementEvent = events[typeEvent] || {};
525
      const isNamespace = originalTypeEvent.startsWith('.');
526 950e6b84 taeseongkim
527 65674874 taeseongkim
      if (typeof callable !== 'undefined') {
528
        // Simplest case: handler is passed, remove that listener ONLY.
529
        if (!Object.keys(storeElementEvent).length) {
530
          return;
531
        }
532 950e6b84 taeseongkim
533 65674874 taeseongkim
        removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
534
        return;
535
      }
536 950e6b84 taeseongkim
537 65674874 taeseongkim
      if (isNamespace) {
538
        for (const elementEvent of Object.keys(events)) {
539
          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
540
        }
541
      }
542 950e6b84 taeseongkim
543 65674874 taeseongkim
      for (const keyHandlers of Object.keys(storeElementEvent)) {
544
        const handlerKey = keyHandlers.replace(stripUidRegex, '');
545
546
        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
547
          const event = storeElementEvent[keyHandlers];
548
          removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
549
        }
550
      }
551
    },
552 950e6b84 taeseongkim
553 65674874 taeseongkim
    trigger(element, event, args) {
554
      if (typeof event !== 'string' || !element) {
555
        return null;
556
      }
557
558
      const $ = getjQuery();
559
      const typeEvent = getTypeEvent(event);
560
      const inNamespace = event !== typeEvent;
561
      let jQueryEvent = null;
562
      let bubbles = true;
563
      let nativeDispatch = true;
564
      let defaultPrevented = false;
565
566
      if (inNamespace && $) {
567
        jQueryEvent = $.Event(event, args);
568
        $(element).trigger(jQueryEvent);
569
        bubbles = !jQueryEvent.isPropagationStopped();
570
        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
571
        defaultPrevented = jQueryEvent.isDefaultPrevented();
572
      }
573 950e6b84 taeseongkim
574 65674874 taeseongkim
      let evt = new Event(event, {
575
        bubbles,
576
        cancelable: true
577
      });
578
      evt = hydrateObj(evt, args);
579 950e6b84 taeseongkim
580 65674874 taeseongkim
      if (defaultPrevented) {
581
        evt.preventDefault();
582
      }
583 950e6b84 taeseongkim
584 65674874 taeseongkim
      if (nativeDispatch) {
585
        element.dispatchEvent(evt);
586
      }
587 950e6b84 taeseongkim
588 65674874 taeseongkim
      if (evt.defaultPrevented && jQueryEvent) {
589
        jQueryEvent.preventDefault();
590
      }
591 950e6b84 taeseongkim
592 65674874 taeseongkim
      return evt;
593
    }
594 950e6b84 taeseongkim
595 65674874 taeseongkim
  };
596 950e6b84 taeseongkim
597 65674874 taeseongkim
  function hydrateObj(obj, meta) {
598
    for (const [key, value] of Object.entries(meta || {})) {
599
      try {
600
        obj[key] = value;
601
      } catch (_unused) {
602
        Object.defineProperty(obj, key, {
603
          configurable: true,
604 950e6b84 taeseongkim
605 65674874 taeseongkim
          get() {
606
            return value;
607
          }
608
609
        });
610
      }
611 950e6b84 taeseongkim
    }
612
613 65674874 taeseongkim
    return obj;
614 950e6b84 taeseongkim
  }
615
616 65674874 taeseongkim
  /**
617
   * --------------------------------------------------------------------------
618
   * Bootstrap (v5.2.3): dom/data.js
619
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
620
   * --------------------------------------------------------------------------
621
   */
622 950e6b84 taeseongkim
623 65674874 taeseongkim
  /**
624
   * Constants
625
   */
626
  const elementMap = new Map();
627
  const Data = {
628
    set(element, key, instance) {
629
      if (!elementMap.has(element)) {
630
        elementMap.set(element, new Map());
631
      }
632 950e6b84 taeseongkim
633 65674874 taeseongkim
      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
634
      // can be removed later when multiple key/instances are fine to be used
635 950e6b84 taeseongkim
636 65674874 taeseongkim
      if (!instanceMap.has(key) && instanceMap.size !== 0) {
637
        // eslint-disable-next-line no-console
638
        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
639
        return;
640
      }
641

642
      instanceMap.set(key, instance);
643
    },
644 950e6b84 taeseongkim

645 65674874 taeseongkim
    get(element, key) {
646
      if (elementMap.has(element)) {
647
        return elementMap.get(element).get(key) || null;
648
      }
649 950e6b84 taeseongkim

650 65674874 taeseongkim
      return null;
651
    },
652 950e6b84 taeseongkim

653 65674874 taeseongkim
    remove(element, key) {
654
      if (!elementMap.has(element)) {
655
        return;
656
      }
657 950e6b84 taeseongkim

658 65674874 taeseongkim
      const instanceMap = elementMap.get(element);
659
      instanceMap.delete(key); // free up element references if there are no instances left for an element
660 950e6b84 taeseongkim

661 65674874 taeseongkim
      if (instanceMap.size === 0) {
662
        elementMap.delete(element);
663
      }
664 950e6b84 taeseongkim
    }
665

666 65674874 taeseongkim
  };
667 950e6b84 taeseongkim

668 65674874 taeseongkim
  /**
669
   * --------------------------------------------------------------------------
670
   * Bootstrap (v5.2.3): dom/manipulator.js
671
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
672
   * --------------------------------------------------------------------------
673
   */
674
  function normalizeData(value) {
675
    if (value === 'true') {
676
      return true;
677
    }
678 950e6b84 taeseongkim

679 65674874 taeseongkim
    if (value === 'false') {
680
      return false;
681
    }
682 950e6b84 taeseongkim

683 65674874 taeseongkim
    if (value === Number(value).toString()) {
684
      return Number(value);
685 950e6b84 taeseongkim
    }
686

687 65674874 taeseongkim
    if (value === '' || value === 'null') {
688
      return null;
689
    }
690 950e6b84 taeseongkim

691 65674874 taeseongkim
    if (typeof value !== 'string') {
692
      return value;
693
    }
694 950e6b84 taeseongkim

695 65674874 taeseongkim
    try {
696
      return JSON.parse(decodeURIComponent(value));
697
    } catch (_unused) {
698
      return value;
699
    }
700 950e6b84 taeseongkim
  }
701

702 65674874 taeseongkim
  function normalizeDataKey(key) {
703
    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
704
  }
705 950e6b84 taeseongkim

706 65674874 taeseongkim
  const Manipulator = {
707
    setDataAttribute(element, key, value) {
708
      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
709
    },
710 950e6b84 taeseongkim

711 65674874 taeseongkim
    removeDataAttribute(element, key) {
712
      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
713
    },
714 950e6b84 taeseongkim

715 65674874 taeseongkim
    getDataAttributes(element) {
716
      if (!element) {
717
        return {};
718
      }
719 950e6b84 taeseongkim

720 65674874 taeseongkim
      const attributes = {};
721
      const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));
722 950e6b84 taeseongkim

723 65674874 taeseongkim
      for (const key of bsKeys) {
724
        let pureKey = key.replace(/^bs/, '');
725
        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
726
        attributes[pureKey] = normalizeData(element.dataset[key]);
727
      }
728 950e6b84 taeseongkim

729 65674874 taeseongkim
      return attributes;
730
    },
731 950e6b84 taeseongkim

732 65674874 taeseongkim
    getDataAttribute(element, key) {
733
      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
734 950e6b84 taeseongkim
    }
735

736 65674874 taeseongkim
  };
737 950e6b84 taeseongkim

738 65674874 taeseongkim
  /**
739
   * --------------------------------------------------------------------------
740
   * Bootstrap (v5.2.3): util/config.js
741
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
742
   * --------------------------------------------------------------------------
743
   */
744
  /**
745
   * Class definition
746
   */
747 950e6b84 taeseongkim

748 65674874 taeseongkim
  class Config {
749
    // Getters
750
    static get Default() {
751
      return {};
752
    }
753 950e6b84 taeseongkim

754 65674874 taeseongkim
    static get DefaultType() {
755
      return {};
756
    }
757 950e6b84 taeseongkim

758 65674874 taeseongkim
    static get NAME() {
759
      throw new Error('You have to implement the static method "NAME", for each component!');
760
    }
761 950e6b84 taeseongkim

762 65674874 taeseongkim
    _getConfig(config) {
763
      config = this._mergeConfigObj(config);
764
      config = this._configAfterMerge(config);
765 950e6b84 taeseongkim

766 65674874 taeseongkim
      this._typeCheckConfig(config);
767 950e6b84 taeseongkim

768 65674874 taeseongkim
      return config;
769
    }
770 950e6b84 taeseongkim

771 65674874 taeseongkim
    _configAfterMerge(config) {
772
      return config;
773
    }
774 950e6b84 taeseongkim

775 65674874 taeseongkim
    _mergeConfigObj(config, element) {
776
      const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse
777 950e6b84 taeseongkim

778 65674874 taeseongkim
      return { ...this.constructor.Default,
779
        ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
780
        ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),
781
        ...(typeof config === 'object' ? config : {})
782
      };
783
    }
784 950e6b84 taeseongkim

785 65674874 taeseongkim
    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
786
      for (const property of Object.keys(configTypes)) {
787
        const expectedTypes = configTypes[property];
788
        const value = config[property];
789
        const valueType = isElement(value) ? 'element' : toType(value);
790 950e6b84 taeseongkim

791 65674874 taeseongkim
        if (!new RegExp(expectedTypes).test(valueType)) {
792
          throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
793
        }
794
      }
795
    }
796 950e6b84 taeseongkim

797 65674874 taeseongkim
  }
798 950e6b84 taeseongkim

799 65674874 taeseongkim
  /**
800
   * --------------------------------------------------------------------------
801
   * Bootstrap (v5.2.3): base-component.js
802
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
803
   * --------------------------------------------------------------------------
804
   */
805
  /**
806
   * Constants
807
   */
808 950e6b84 taeseongkim

809 65674874 taeseongkim
  const VERSION = '5.2.3';
810
  /**
811
   * Class definition
812
   */
813 950e6b84 taeseongkim

814 65674874 taeseongkim
  class BaseComponent extends Config {
815
    constructor(element, config) {
816
      super();
817
      element = getElement(element);
818 950e6b84 taeseongkim

819 65674874 taeseongkim
      if (!element) {
820
        return;
821
      }
822 950e6b84 taeseongkim

823 65674874 taeseongkim
      this._element = element;
824
      this._config = this._getConfig(config);
825
      Data.set(this._element, this.constructor.DATA_KEY, this);
826
    } // Public
827 950e6b84 taeseongkim

828

829 65674874 taeseongkim
    dispose() {
830
      Data.remove(this._element, this.constructor.DATA_KEY);
831
      EventHandler.off(this._element, this.constructor.EVENT_KEY);
832 950e6b84 taeseongkim

833 65674874 taeseongkim
      for (const propertyName of Object.getOwnPropertyNames(this)) {
834
        this[propertyName] = null;
835
      }
836
    }
837 950e6b84 taeseongkim

838 65674874 taeseongkim
    _queueCallback(callback, element, isAnimated = true) {
839
      executeAfterTransition(callback, element, isAnimated);
840
    }
841 950e6b84 taeseongkim

842 65674874 taeseongkim
    _getConfig(config) {
843
      config = this._mergeConfigObj(config, this._element);
844
      config = this._configAfterMerge(config);
845 950e6b84 taeseongkim

846 65674874 taeseongkim
      this._typeCheckConfig(config);
847 950e6b84 taeseongkim

848 65674874 taeseongkim
      return config;
849
    } // Static
850 950e6b84 taeseongkim

851

852 65674874 taeseongkim
    static getInstance(element) {
853
      return Data.get(getElement(element), this.DATA_KEY);
854
    }
855 950e6b84 taeseongkim

856 65674874 taeseongkim
    static getOrCreateInstance(element, config = {}) {
857
      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
858
    }
859 950e6b84 taeseongkim

860 65674874 taeseongkim
    static get VERSION() {
861
      return VERSION;
862
    }
863 950e6b84 taeseongkim

864 65674874 taeseongkim
    static get DATA_KEY() {
865
      return `bs.${this.NAME}`;
866
    }
867 950e6b84 taeseongkim

868 65674874 taeseongkim
    static get EVENT_KEY() {
869
      return `.${this.DATA_KEY}`;
870 950e6b84 taeseongkim
    }
871

872 65674874 taeseongkim
    static eventName(name) {
873
      return `${name}${this.EVENT_KEY}`;
874
    }
875 950e6b84 taeseongkim

876
  }
877

878 65674874 taeseongkim
  /**
879
   * --------------------------------------------------------------------------
880
   * Bootstrap (v5.2.3): util/component-functions.js
881
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
882
   * --------------------------------------------------------------------------
883
   */
884 950e6b84 taeseongkim

885 65674874 taeseongkim
  const enableDismissTrigger = (component, method = 'hide') => {
886
    const clickEvent = `click.dismiss${component.EVENT_KEY}`;
887
    const name = component.NAME;
888
    EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
889
      if (['A', 'AREA'].includes(this.tagName)) {
890
        event.preventDefault();
891
      }
892 950e6b84 taeseongkim

893 65674874 taeseongkim
      if (isDisabled(this)) {
894
        return;
895
      }
896 950e6b84 taeseongkim

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