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 |