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