Repository: mdbootstrap/mdb-ui-kit Branch: master Commit: 05b5e7f83f53 Files: 365 Total size: 1.4 MB Directory structure: gitextract_2w7zpwz8/ ├── .gitignore ├── License.txt ├── README.md ├── README.txt ├── index.html ├── package.json └── src/ ├── js/ │ ├── autoinit/ │ │ ├── callbacks/ │ │ │ └── free.js │ │ ├── index.free.js │ │ ├── init.js │ │ └── initSelectors/ │ │ └── free.js │ ├── bootstrap/ │ │ ├── dist/ │ │ │ ├── alert.js │ │ │ ├── base-component.js │ │ │ ├── button.js │ │ │ ├── carousel.js │ │ │ ├── collapse.js │ │ │ ├── dom/ │ │ │ │ ├── data.js │ │ │ │ ├── event-handler.js │ │ │ │ ├── manipulator.js │ │ │ │ └── selector-engine.js │ │ │ ├── dropdown.js │ │ │ ├── modal.js │ │ │ ├── offcanvas.js │ │ │ ├── popover.js │ │ │ ├── scrollspy.js │ │ │ ├── tab.js │ │ │ ├── toast.js │ │ │ ├── tooltip.js │ │ │ └── util/ │ │ │ ├── backdrop.js │ │ │ ├── component-functions.js │ │ │ ├── config.js │ │ │ ├── focustrap.js │ │ │ ├── index.js │ │ │ ├── sanitizer.js │ │ │ ├── scrollbar.js │ │ │ ├── swipe.js │ │ │ └── template-factory.js │ │ ├── mdb-prefix/ │ │ │ ├── alert.js │ │ │ ├── base-component.js │ │ │ ├── button.js │ │ │ ├── carousel.js │ │ │ ├── collapse.js │ │ │ ├── dom/ │ │ │ │ ├── data.js │ │ │ │ ├── event-handler.js │ │ │ │ ├── manipulator.js │ │ │ │ └── selector-engine.js │ │ │ ├── dropdown.js │ │ │ ├── modal.js │ │ │ ├── offcanvas.js │ │ │ ├── popover.js │ │ │ ├── scrollspy.js │ │ │ ├── tab.js │ │ │ ├── toast.js │ │ │ ├── tooltip.js │ │ │ └── util/ │ │ │ ├── backdrop.js │ │ │ ├── component-functions.js │ │ │ ├── config.js │ │ │ ├── focustrap.js │ │ │ ├── index.js │ │ │ ├── sanitizer.js │ │ │ ├── scrollbar.js │ │ │ ├── swipe.js │ │ │ └── template-factory.js │ │ └── src/ │ │ ├── alert.js │ │ ├── base-component.js │ │ ├── button.js │ │ ├── carousel.js │ │ ├── collapse.js │ │ ├── dom/ │ │ │ ├── data.js │ │ │ ├── event-handler.js │ │ │ ├── manipulator.js │ │ │ └── selector-engine.js │ │ ├── dropdown.js │ │ ├── modal.js │ │ ├── offcanvas.js │ │ ├── popover.js │ │ ├── scrollspy.js │ │ ├── tab.js │ │ ├── toast.js │ │ ├── tooltip.js │ │ └── util/ │ │ ├── backdrop.js │ │ ├── component-functions.js │ │ ├── config.js │ │ ├── focustrap.js │ │ ├── index.js │ │ ├── sanitizer.js │ │ ├── scrollbar.js │ │ ├── swipe.js │ │ └── template-factory.js │ ├── free/ │ │ ├── alert.js │ │ ├── base-component.js │ │ ├── button.js │ │ ├── carousel.js │ │ ├── collapse.js │ │ ├── dropdown.js │ │ ├── input.js │ │ ├── modal.js │ │ ├── popover.js │ │ ├── range.js │ │ ├── ripple.js │ │ ├── scrollspy.js │ │ ├── tab.js │ │ ├── toast.js │ │ └── tooltip.js │ ├── mdb/ │ │ ├── dom/ │ │ │ ├── data.js │ │ │ ├── event-handler.js │ │ │ ├── manipulator.js │ │ │ └── selector-engine.js │ │ ├── perfect-scrollbar/ │ │ │ ├── handlers/ │ │ │ │ ├── click-rail.js │ │ │ │ ├── drag-thumb.js │ │ │ │ ├── keyboard.js │ │ │ │ ├── mouse-wheel.js │ │ │ │ └── touch.js │ │ │ ├── index.js │ │ │ ├── lib/ │ │ │ │ ├── class-names.js │ │ │ │ ├── css.js │ │ │ │ ├── dom.js │ │ │ │ ├── event-manager.js │ │ │ │ └── util.js │ │ │ ├── process-scroll-diff.js │ │ │ └── update-geometry.js │ │ └── util/ │ │ ├── focusTrap.js │ │ ├── index.js │ │ ├── keycodes.js │ │ ├── sanitizer.js │ │ ├── scrollbar.js │ │ ├── stack.js │ │ └── touch/ │ │ ├── index.js │ │ ├── swipe.js │ │ └── touchUtil.js │ ├── mdb.free.es.js │ └── mdb.free.umd.js └── scss/ ├── bootstrap/ │ ├── _accordion.scss │ ├── _alert.scss │ ├── _badge.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _containers.scss │ ├── _dropdown.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _grid.scss │ ├── _helpers.scss │ ├── _images.scss │ ├── _list-group.scss │ ├── _maps.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _offcanvas.scss │ ├── _pagination.scss │ ├── _placeholders.scss │ ├── _popover.scss │ ├── _progress.scss │ ├── _reboot.scss │ ├── _root.scss │ ├── _spinners.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _transitions.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables-dark.scss │ ├── _variables.scss │ ├── bootstrap-grid.scss │ ├── bootstrap-reboot.scss │ ├── bootstrap-utilities.scss │ ├── bootstrap.scss │ ├── forms/ │ │ ├── _floating-labels.scss │ │ ├── _form-check.scss │ │ ├── _form-control.scss │ │ ├── _form-range.scss │ │ ├── _form-select.scss │ │ ├── _form-text.scss │ │ ├── _input-group.scss │ │ ├── _labels.scss │ │ └── _validation.scss │ ├── helpers/ │ │ ├── _clearfix.scss │ │ ├── _color-bg.scss │ │ ├── _colored-links.scss │ │ ├── _focus-ring.scss │ │ ├── _icon-link.scss │ │ ├── _position.scss │ │ ├── _ratio.scss │ │ ├── _stacks.scss │ │ ├── _stretched-link.scss │ │ ├── _text-truncation.scss │ │ ├── _visually-hidden.scss │ │ └── _vr.scss │ ├── mixins/ │ │ ├── _alert.scss │ │ ├── _backdrop.scss │ │ ├── _banner.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _color-mode.scss │ │ ├── _color-scheme.scss │ │ ├── _container.scss │ │ ├── _deprecate.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _table-variants.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ ├── _utilities.scss │ │ └── _visually-hidden.scss │ ├── utilities/ │ │ └── _api.scss │ └── vendor/ │ └── _rfs.scss ├── bootstrap-rtl-fix/ │ ├── _accordion.scss │ ├── _alert.scss │ ├── _badge.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _containers.scss │ ├── _dropdown.scss │ ├── _forms.scss │ ├── _functions.scss │ ├── _grid.scss │ ├── _helpers.scss │ ├── _images.scss │ ├── _list-group.scss │ ├── _maps.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _offcanvas.scss │ ├── _pagination.scss │ ├── _placeholders.scss │ ├── _popover.scss │ ├── _progress.scss │ ├── _reboot.scss │ ├── _root.scss │ ├── _spinners.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _transitions.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables-dark.scss │ ├── _variables.scss │ ├── bootstrap-grid.scss │ ├── bootstrap-reboot.scss │ ├── bootstrap-utilities.scss │ ├── bootstrap.scss │ ├── forms/ │ │ ├── _floating-labels.scss │ │ ├── _form-check.scss │ │ ├── _form-control.scss │ │ ├── _form-range.scss │ │ ├── _form-select.scss │ │ ├── _form-text.scss │ │ ├── _input-group.scss │ │ ├── _labels.scss │ │ └── _validation.scss │ ├── helpers/ │ │ ├── _clearfix.scss │ │ ├── _color-bg.scss │ │ ├── _colored-links.scss │ │ ├── _focus-ring.scss │ │ ├── _icon-link.scss │ │ ├── _position.scss │ │ ├── _ratio.scss │ │ ├── _stacks.scss │ │ ├── _stretched-link.scss │ │ ├── _text-truncation.scss │ │ ├── _visually-hidden.scss │ │ └── _vr.scss │ ├── mixins/ │ │ ├── _alert.scss │ │ ├── _backdrop.scss │ │ ├── _banner.scss │ │ ├── _border-radius.scss │ │ ├── _box-shadow.scss │ │ ├── _breakpoints.scss │ │ ├── _buttons.scss │ │ ├── _caret.scss │ │ ├── _clearfix.scss │ │ ├── _color-mode.scss │ │ ├── _color-scheme.scss │ │ ├── _container.scss │ │ ├── _deprecate.scss │ │ ├── _forms.scss │ │ ├── _gradients.scss │ │ ├── _grid.scss │ │ ├── _image.scss │ │ ├── _list-group.scss │ │ ├── _lists.scss │ │ ├── _pagination.scss │ │ ├── _reset-text.scss │ │ ├── _resize.scss │ │ ├── _table-variants.scss │ │ ├── _text-truncate.scss │ │ ├── _transition.scss │ │ ├── _utilities.scss │ │ └── _visually-hidden.scss │ ├── utilities/ │ │ └── _api.scss │ └── vendor/ │ └── _rfs.scss ├── custom/ │ ├── _styles.scss │ └── _variables.scss ├── free/ │ ├── _accordion.scss │ ├── _alert.scss │ ├── _badge.scss │ ├── _breadcrumb.scss │ ├── _button-group.scss │ ├── _buttons.scss │ ├── _card.scss │ ├── _carousel.scss │ ├── _close.scss │ ├── _colors.scss │ ├── _deprecated.scss │ ├── _dropdown.scss │ ├── _flag.scss │ ├── _functions.scss │ ├── _images.scss │ ├── _list-group.scss │ ├── _mixins.scss │ ├── _modal.scss │ ├── _nav.scss │ ├── _navbar.scss │ ├── _pagination.scss │ ├── _popover.scss │ ├── _progress.scss │ ├── _range.scss │ ├── _reboot.scss │ ├── _ripple.scss │ ├── _root.scss │ ├── _scrollspy.scss │ ├── _shadows.scss │ ├── _tables.scss │ ├── _toasts.scss │ ├── _tooltip.scss │ ├── _type.scss │ ├── _utilities.scss │ ├── _variables-dark.scss │ ├── _variables.scss │ ├── forms/ │ │ ├── _form-check.scss │ │ ├── _form-control.scss │ │ ├── _form-file.scss │ │ ├── _form-range.scss │ │ ├── _form-select.scss │ │ ├── _input-group.scss │ │ └── _validation.scss │ └── mixins/ │ ├── _buttons.scss │ ├── _color-mode.scss │ ├── _ripple.scss │ └── _table-variants.scss └── mdb.free.scss ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ node_modules ================================================ FILE: License.txt ================================================ MIT license for MDB Free Free packages are available under the MIT License. -- Highlights ● Free for personal use ● Free for commercial use ● No attribution required -- Copyright notice Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The software is provided "As is", without warranty of any kind, express or implied, including but not limited To the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall The authors or copyright holders be liable for any claim, damages or other liability, whether in an action of Contract, tort or otherwise, arising from, out of or in connection with the software or the use or other Dealings in the software. ================================================ FILE: README.md ================================================ Bootstrap 5 UI KIT - 700+ components, plain JavaScript, MIT license, simple installation. MDB is a collection of free Bootstrap templates, themes, design tools & resources. --- # Get started ### [>> Get Started in 1 minute](https://mdbootstrap.com/docs/standard/getting-started/installation/) Simple installation via .zip, npm or cdnjs. ### [>> Install with Webpack](https://mdbootstrap.com/docs/standard/getting-started/installation/#section-webpack) This option is useful for experienced developers it enables bundling, unit testing code formatting, linting, saas support & more. ### [>> Install with MDBGO](https://mdbgo.com/) Free Hosting, WordPress support, custom domains, SSL support, free database, frontend & backend templates, webpack starter included, git repostiory, FTP & jenkins support. ### [>> Install with MDBGO + e-commerce shop integration](https://mdbgo.com/wordpress-shop/) One click setup! MDB GO allows you to create a WordPress page with a single click. Regardless whether you want to create a Travel Blog or an e-commerce shop to sell your product you can easily do that. You can even combine both into single page. ## About Material Design for Bootstrap 5 & Vanilla JavaScript

Created by Downloads License MDBootstrap tutorial

Trusted by 3 000 000+ developers & designers. Used by companies & institutions like
  • 700+ UI components
  • Free templates
  • Super simple, 1 minute installation
  • Detailed docs & practical examples
  • Lots of tutorials
  • Plain JavaScript (but works also with jQuery)
  • Huge and active community
  • MIT license - free for personal & commercial use
___ # Bootstrap 5 tutorial **[>> Learn more about Bootstrap 5](https://mdbootstrap.com/docs/standard/)** **[>> Bootstrap 5 Tutorial](https://mdbootstrap.com/learn/mdb-foundations/basics/introduction/)** **[>> Subscribe to our YouTube channel with dozens of Bootstrap tutorials](https://www.youtube.com/c/Mdbootstrap)**

Start learning from Basics

Learn Bootstrap 5 | Crash Course for Beginners in 1.5H

___ # Demo #### Simplicity and ease of use are key features of MDB 5 UI Kit. You need only one minute to install and run it. ### Carousel

A slideshow component for cycling through elements—images or slides of text—like a carousel.

### Buttons

Use MDB custom button styles for actions in forms, dialogs, and more with support for multiple sizes, states, and more.

### Spinners

Indicate the loading state of a component or page with MDB spinners, built entirely with HTML, CSS, and no JavaScript.

### Cards

A card is a flexible and extensible content container. It includes options for headers and footers, a wide variety of content, contextual background colors, and powerful display options.

### Validation

Provide valuable, actionable feedback to your users with HTML5 form validation, via browser default behaviors or custom styles and JavaScript.

### Forms

Examples and usage guidelines for form control styles, layout options, and custom components for creating a wide variety of forms.

### Footer

A footer is an additional navigation component. It can hold links, buttons, company info, copyrights, forms, and many other elements.

### Modal

Use MDB modal plugin to add dialogs to your site for lightboxes, user notifications, or completely custom content.

### Hover

MDB hover effect appears when the user positions the computer cursor over an element without activating it. Hover effects make a website more interactive.

### Tabs

Tabs are quasi-navigation components which can highly improve website clarity and increase user experience.

### Notes

Notes are small components very helpful in inserting an additional piece of information.

### ScrollSpy

Automatically update Bootstrap navigation or list group components based on scroll position to indicate which link is currently active in the viewport.

Also check out our standalone project Perfect Scrollbar which is included in MDB.

----------------------------- # Free Bootstrap 5 templates

All of the templates were created with MDB 5 UI KIT (Material Design for Bootstrap 5).

MDB is a free (MIT license) library, that provides extra features and significantly extends Bootstrap's capabilities.

Ecommerce

Carousel Full Cover

Image Full Cover

Portfolio

Post

Pricing

Video Full Cover

Carousel Half Cover

Video Half Cover

Login

Magazine

Checkout

Blog

Product

Category

Landing Page

Admin

Coming Soon

Classic Jumbotron

One Column

Two Columns

Three Columns

___ # Extended documentation ================================================ FILE: README.txt ================================================ MDB5 Version: FREE 9.3.0 Documentation: https://mdbootstrap.com/docs/standard/ Contact: contact@mdbootstrap.com ================================================ FILE: index.html ================================================ Material Design for Bootstrap
Thank you for using our product. We're glad you're with us.

MDB Team

Start MDB tutorial
================================================ FILE: package.json ================================================ { "name": "mdb-ui-kit", "version": "9.3.0", "type": "module", "main": "./js/mdb.umd.min.js", "module": "./js/mdb.es.min.js", "homepage": "https://mdbootstrap.com/docs/standard/", "repository": "https://github.com/mdbootstrap/mdb-ui-kit.git", "author": "MDBootstrap", "license": "SEE LICENSE IN " } ================================================ FILE: src/js/autoinit/callbacks/free.js ================================================ import EventHandler from '../../mdb/dom/event-handler'; import SelectorEngine from '../../mdb/dom/selector-engine'; import Manipulator from '../../mdb/dom/manipulator'; import { isDisabled, getElementFromSelector, isVisible, getSelectorFromElement, } from '../../mdb/util'; import { enableDismissTrigger } from '../../bootstrap/mdb-prefix/util/component-functions'; const callbackInitState = new Map(); const alertCallback = (component, initSelector) => { const Alert = component; if (!callbackInitState.has(component.name)) { enableDismissTrigger(Alert); callbackInitState.set(component.name, true); } // MDB init SelectorEngine.find(initSelector).forEach((element) => { return Alert.getOrCreateInstance(element); }); }; const buttonCallback = (component, initSelector) => { const Button = component; const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; if (!callbackInitState.has(component.name)) { // BS init EventHandler.on(document, EVENT_CLICK_DATA_API, initSelector, (event) => { event.preventDefault(); const button = event.target.closest(initSelector); const data = Button.getOrCreateInstance(button); data.toggle(); }); callbackInitState.set(component.name, true); } // MDB init SelectorEngine.find(initSelector).forEach((element) => { return Button.getOrCreateInstance(element); }); }; const carouselCallback = (component, initSelector) => { if (callbackInitState.has(component.name)) { return; } const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; const SELECTOR_DATA_SLIDE = '[data-mdb-slide], [data-mdb-slide-to]'; const CLASS_NAME_CAROUSEL = 'carousel'; const Carousel = component; const EVENT_LOAD_DATA_API = `load.bs.${component.name}.data-api`; const SELECTOR_DATA_RIDE = initSelector; EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) { const target = getElementFromSelector(this); if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { return; } event.preventDefault(); const carousel = Carousel.getOrCreateInstance(target); const slideIndex = this.getAttribute('data-mdb-slide-to'); if (slideIndex) { carousel.to(slideIndex); carousel._maybeEnableCycle(); return; } if (Manipulator.getDataAttribute(this, 'slide') === 'next') { carousel.next(); carousel._maybeEnableCycle(); return; } carousel.prev(); carousel._maybeEnableCycle(); }); EventHandler.on(window, EVENT_LOAD_DATA_API, () => { const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); carousels.forEach((carousel) => { Carousel.getOrCreateInstance(carousel); }); }); callbackInitState.set(component.name, true); }; const collapseCallback = (component, initSelector) => { const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; const SELECTOR_DATA_TOGGLE = initSelector; const Collapse = component; if (!callbackInitState.has(component.name)) { EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // preventDefault only for elements (which change the URL) not inside the collapsible element if ( event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A') ) { event.preventDefault(); } const selector = getSelectorFromElement(this); const selectorElements = SelectorEngine.find(selector); selectorElements.forEach((element) => { Collapse.getOrCreateInstance(element, { toggle: false }).toggle(); }); }); callbackInitState.set(component.name, true); } SelectorEngine.find(SELECTOR_DATA_TOGGLE).forEach((el) => { const selector = getSelectorFromElement(el); const selectorElements = SelectorEngine.find(selector); selectorElements.forEach((element) => { Collapse.getOrCreateInstance(element, { toggle: false }); }); }); }; const dropdownCallback = (component, initSelector) => { const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; const EVENT_KEYDOWN_DATA_API = `keydown.bs.${component.name}.data-api`; const EVENT_KEYUP_DATA_API = `keyup.bs.${component.name}.data-api`; const SELECTOR_MENU = '.dropdown-menu'; const SELECTOR_DATA_TOGGLE = `[data-mdb-${component.NAME}-initialized]`; const Dropdown = component; if (!callbackInitState.has(component.name)) { EventHandler.on( document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler ); EventHandler.on( document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler ); EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus); EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { event.preventDefault(); Dropdown.getOrCreateInstance(this).toggle(); }); } callbackInitState.set(component.name, true); SelectorEngine.find(initSelector).forEach((el) => { Dropdown.getOrCreateInstance(el); }); }; const inputCallback = (component, initSelector) => { const SELECTOR_DATA_INIT = initSelector; const SELECTOR_OUTLINE_INPUT = `${SELECTOR_DATA_INIT} input`; const SELECTOR_OUTLINE_TEXTAREA = `${SELECTOR_DATA_INIT} textarea`; const Input = component; if (!callbackInitState.has(component.name)) { EventHandler.on(document, 'focus', SELECTOR_OUTLINE_INPUT, Input.activate(new Input())); EventHandler.on(document, 'input', SELECTOR_OUTLINE_INPUT, Input.activate(new Input())); EventHandler.on(document, 'blur', SELECTOR_OUTLINE_INPUT, Input.deactivate(new Input())); EventHandler.on(document, 'focus', SELECTOR_OUTLINE_TEXTAREA, Input.activate(new Input())); EventHandler.on(document, 'input', SELECTOR_OUTLINE_TEXTAREA, Input.activate(new Input())); EventHandler.on(document, 'blur', SELECTOR_OUTLINE_TEXTAREA, Input.deactivate(new Input())); EventHandler.on(window, 'shown.bs.modal', (e) => { SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.update(); }); SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.update(); }); }); EventHandler.on(window, 'shown.bs.dropdown', (e) => { const target = e.target.parentNode.querySelector('.dropdown-menu'); if (target) { SelectorEngine.find(SELECTOR_OUTLINE_INPUT, target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.update(); }); SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.update(); }); } }); EventHandler.on(window, 'shown.bs.tab', (e) => { let targetId; if (e.target.href) { targetId = e.target.href.split('#')[1]; } else { targetId = Manipulator.getDataAttribute(e.target, 'target').split('#')[1]; } const target = SelectorEngine.findOne(`#${targetId}`); SelectorEngine.find(SELECTOR_OUTLINE_INPUT, target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.update(); }); SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.update(); }); }); // form reset handler EventHandler.on(window, 'reset', (e) => { SelectorEngine.find(SELECTOR_OUTLINE_INPUT, e.target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.forceInactive(); }); SelectorEngine.find(SELECTOR_OUTLINE_TEXTAREA, e.target).forEach((element) => { const instance = Input.getInstance(element.parentNode); if (!instance) { return; } instance.forceInactive(); }); }); // auto-fill EventHandler.on(window, 'onautocomplete', (e) => { const instance = Input.getInstance(e.target.parentNode); if (!instance || !e.cancelable) { return; } instance.forceActive(); }); callbackInitState.set(component.name, true); } // auto-init SelectorEngine.find(SELECTOR_DATA_INIT).map((element) => Input.getOrCreateInstance(element)); }; const modalCallback = (component, initSelector) => { const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; const OPEN_SELECTOR = '.modal.show'; const Modal = component; const EVENT_SHOW = `show.bs.${component.name}`; const EVENT_HIDDEN = `hidden.bs.${component.name}`; if (!callbackInitState.has(component.name)) { EventHandler.on(document, EVENT_CLICK_DATA_API, initSelector, function (event) { const target = getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } EventHandler.one(target, EVENT_SHOW, (showEvent) => { if (showEvent.defaultPrevented) { // only register focus restorer if modal will actually get shown return; } EventHandler.one(target, EVENT_HIDDEN, () => { if (isVisible(this)) { this.focus(); } }); }); // avoid conflict when clicking modal toggler while another one is open const alreadyOpenedModals = SelectorEngine.find(OPEN_SELECTOR); alreadyOpenedModals.forEach((modal) => { if (!modal.classList.contains('modal-non-invasive-show')) { Modal.getInstance(modal).hide(); } }); const data = Modal.getOrCreateInstance(target); data.toggle(this); }); enableDismissTrigger(Modal); callbackInitState.set(component.name, true); } SelectorEngine.find(initSelector).forEach((el) => { const selector = getSelectorFromElement(el); const selectorElement = SelectorEngine.findOne(selector); Modal.getOrCreateInstance(selectorElement); }); }; const popoverCallback = (component, initSelector) => { const Popover = component; const SELECTOR_DATA_TOGGLE = initSelector; SelectorEngine.find(SELECTOR_DATA_TOGGLE).forEach((el) => { Popover.getOrCreateInstance(el); }); }; const offcanvasCallback = (component, initSelector) => { if (callbackInitState.has(component.name)) { return; } const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; const OPEN_SELECTOR = '.offcanvas.show'; const Offcanvas = component; const EVENT_HIDDEN = `hidden.bs.${component.name}`; const EVENT_LOAD_DATA_API = `load.bs.${component.name}.data-api`; const EVENT_RESIZE = `resize.bs.${component.name}`; EventHandler.on(document, EVENT_CLICK_DATA_API, initSelector, function (event) { const target = getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } if (isDisabled(this)) { return; } EventHandler.one(target, EVENT_HIDDEN, () => { // focus on trigger when it is closed if (isVisible(this)) { this.focus(); } }); // avoid conflict when clicking a toggler of an offcanvas, while another is open const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); if (alreadyOpen && alreadyOpen !== target) { Offcanvas.getInstance(alreadyOpen).hide(); } const data = Offcanvas.getOrCreateInstance(target); data.toggle(this); }); EventHandler.on(window, EVENT_LOAD_DATA_API, () => { SelectorEngine.find(OPEN_SELECTOR).forEach((selector) => { Offcanvas.getOrCreateInstance(selector).show(); }); }); EventHandler.on(window, EVENT_RESIZE, () => { SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]').forEach((element) => { if (getComputedStyle(element).position !== 'fixed') { Offcanvas.getOrCreateInstance(element).hide(); } }); }); enableDismissTrigger(Offcanvas); callbackInitState.set(component.name, true); }; const scrollspyCallback = (component, initSelector) => { if (callbackInitState.has(component.name)) { return; } const EVENT_LOAD_DATA_API = `load.bs.${component.name}.data-api`; const ScrollSpy = component; EventHandler.on(window, EVENT_LOAD_DATA_API, () => { SelectorEngine.find(initSelector).forEach((el) => { ScrollSpy.getOrCreateInstance(el); }); }); callbackInitState.set(component.name, true); }; const tabCallback = (component, initSelector) => { const EVENT_LOAD_DATA_API = `load.bs.${component.name}.data-api`; const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`; const CLASS_NAME_ACTIVE = 'active'; const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-mdb-tab-init], .${CLASS_NAME_ACTIVE}[data-mdb-pill-init], .${CLASS_NAME_ACTIVE}[data-mdb-toggle="list"]`; const Tab = component; if (!callbackInitState.has(component.name)) { EventHandler.on(document, EVENT_CLICK_DATA_API, initSelector, function (event) { if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } if (isDisabled(this)) { return; } Tab.getOrCreateInstance(this).show(); }); EventHandler.on(window, EVENT_LOAD_DATA_API, () => { SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE).forEach((element) => { Tab.getOrCreateInstance(element); }); }); callbackInitState.set(component.name, true); } }; const toastCallback = (component, initSelector) => { const Toast = component; if (!callbackInitState.has(component.name)) { enableDismissTrigger(Toast); callbackInitState.set(component.name, true); } // MDB init SelectorEngine.find(initSelector).forEach((element) => { return Toast.getOrCreateInstance(element); }); }; const rippleCallback = (component, initSelector) => { const Ripple = component; if (!callbackInitState.has(component.name)) { EventHandler.one(document, 'mousedown', initSelector, Ripple.autoInitial(new Ripple())); callbackInitState.set(component.name, true); } }; export { alertCallback, buttonCallback, carouselCallback, collapseCallback, dropdownCallback, inputCallback, modalCallback, offcanvasCallback, tabCallback, toastCallback, popoverCallback, rippleCallback, scrollspyCallback, }; ================================================ FILE: src/js/autoinit/index.free.js ================================================ import defaultInitSelectors from './initSelectors/free'; import { InitMDB } from './init'; const initMDBInstance = new InitMDB(defaultInitSelectors); const initMDB = initMDBInstance.initMDB; export default initMDB; ================================================ FILE: src/js/autoinit/init.js ================================================ import SelectorEngine from '../mdb/dom/selector-engine'; import { defineJQueryPlugin } from '../mdb/util/index'; const mapComponentsData = (() => { const componentsData = []; return { set(componentName) { componentsData.push(componentName); }, get(componentName) { return componentsData.includes(componentName); }, }; })(); export const InitializedComponents = { set(componentName) { mapComponentsData.set(componentName); }, get(componentName) { return mapComponentsData.get(componentName); }, }; const isInitialized = (componentName) => { return InitializedComponents.get(componentName); }; export const bindCallbackEventsIfNeeded = (component) => { if (!isInitialized(component.NAME)) { const manualInit = true; initComponent(component, manualInit); } }; const initComponent = (component, manualInit = false) => { if (!component || InitializedComponents.get(component.NAME)) { return; } if (!manualInit) { InitializedComponents.set(component.NAME); } const thisComponent = _defaultInitSelectors[component.NAME] || null; const isToggler = thisComponent?.isToggler || false; defineJQueryPlugin(component); if (thisComponent?.advanced) { thisComponent.advanced(component, thisComponent?.selector); return; } if (isToggler) { thisComponent.callback(component, thisComponent?.selector); return; } if (manualInit) { return; } SelectorEngine.find(thisComponent?.selector).forEach((element) => { let instance = component.getInstance(element); if (!instance) { instance = new component(element); // eslint-disable-line if (thisComponent?.onInit) { instance[thisComponent.onInit](); } } }); }; let _defaultInitSelectors; export class InitMDB { constructor(defaultInitSelectors) { _defaultInitSelectors = defaultInitSelectors; } init = (components) => { components.forEach((component) => initComponent(component)); }; initMDB = (components, checkOtherImports = false) => { const componentList = Object.keys(_defaultInitSelectors).map((element) => { const requireAutoInit = Boolean( document.querySelector(_defaultInitSelectors[element].selector) ); if (requireAutoInit) { const component = components[_defaultInitSelectors[element].name]; if (!component && !InitializedComponents.get(element) && checkOtherImports) { // eslint-disable-next-line no-console console.warn( `Please import ${_defaultInitSelectors[element].name} from "MDB" package and add it to a object parameter inside "initMDB" function` ); } return component; } return null; }); this.init(componentList); }; } ================================================ FILE: src/js/autoinit/initSelectors/free.js ================================================ import { alertCallback, dropdownCallback, offcanvasCallback, tabCallback, buttonCallback, modalCallback, rippleCallback, collapseCallback, carouselCallback, scrollspyCallback, toastCallback, inputCallback, } from '../callbacks/free'; const defaultInitSelectors = { // Bootstrap Components alert: { name: 'Alert', selector: '[data-mdb-alert-init]', isToggler: true, callback: alertCallback, }, button: { name: 'Button', selector: '[data-mdb-button-init]', isToggler: true, callback: buttonCallback, }, carousel: { name: 'Carousel', selector: '[data-mdb-carousel-init]', isToggler: true, callback: carouselCallback, }, collapse: { name: 'Collapse', selector: '[data-mdb-collapse-init]', isToggler: true, callback: collapseCallback, }, dropdown: { name: 'Dropdown', selector: '[data-mdb-dropdown-init]', isToggler: true, callback: dropdownCallback, }, modal: { name: 'Modal', selector: '[data-mdb-modal-init]', isToggler: true, callback: modalCallback, }, offcanvas: { name: 'Offcanvas', selector: '[data-mdb-offcanvas-init]', isToggler: true, callback: offcanvasCallback, }, scrollspy: { name: 'ScrollSpy', selector: '[data-mdb-scrollspy-init]', isToggler: true, callback: scrollspyCallback, }, tab: { name: 'Tab', selector: '[data-mdb-tab-init], [data-mdb-pill-init], [data-mdb-list-init]', isToggler: true, callback: tabCallback, }, toast: { name: 'Toast', selector: '[data-mdb-toast-init]', isToggler: true, callback: toastCallback, }, tooltip: { name: 'Tooltip', selector: '[data-mdb-tooltip-init]', isToggler: false, }, input: { name: 'Input', selector: '[data-mdb-input-init]', isToggler: true, callback: inputCallback, }, range: { name: 'Range', selector: '[data-mdb-range-init]', isToggler: false, }, ripple: { name: 'Ripple', selector: '[data-mdb-ripple-init]', isToggler: true, callback: rippleCallback, }, popover: { name: 'Popover', selector: '[data-mdb-popover-init]', isToggler: false, callback: rippleCallback, }, }; export default defaultInitSelectors; ================================================ FILE: src/js/bootstrap/dist/alert.js ================================================ /*! * Bootstrap alert.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./util/component-functions.js'), require('./util/index.js') )) : typeof define === 'function' && define.amd ? define( ['./base-component', './dom/event-handler', './util/component-functions', './util/index'], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Alert = factory( global.BaseComponent, global.EventHandler, global.ComponentFunctions, global.Index ))); })(this, function (BaseComponent, EventHandler, componentFunctions_js, index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap alert.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'alert'; const DATA_KEY = 'bs.alert'; const EVENT_KEY = `.${DATA_KEY}`; const EVENT_CLOSE = `close${EVENT_KEY}`; const EVENT_CLOSED = `closed${EVENT_KEY}`; const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_SHOW = 'show'; /** * Class definition */ class Alert extends BaseComponent { // Getters static get NAME() { return NAME; } // Public close() { const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE); if (closeEvent.defaultPrevented) { return; } this._element.classList.remove(CLASS_NAME_SHOW); const isAnimated = this._element.classList.contains(CLASS_NAME_FADE); this._queueCallback(() => this._destroyElement(), this._element, isAnimated); } // Private _destroyElement() { this._element.remove(); EventHandler.trigger(this._element, EVENT_CLOSED); this.dispose(); } // Static static jQueryInterface(config) { return this.each(function () { const data = Alert.getOrCreateInstance(this); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError(`No method named "${config}"`); } data[config](this); }); } } /** * Data API implementation */ componentFunctions_js.enableDismissTrigger(Alert, 'close'); /** * jQuery */ index_js.defineJQueryPlugin(Alert); return Alert; }); //# sourceMappingURL=alert.js.map ================================================ FILE: src/js/bootstrap/dist/base-component.js ================================================ /*! * Bootstrap base-component.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./dom/data.js'), require('./dom/event-handler.js'), require('./util/config.js'), require('./util/index.js') )) : typeof define === 'function' && define.amd ? define(['./dom/data', './dom/event-handler', './util/config', './util/index'], factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.BaseComponent = factory( global.Data, global.EventHandler, global.Config, global.Index ))); })(this, function (Data, EventHandler, Config, index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap base-component.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const VERSION = '5.3.3'; /** * Class definition */ class BaseComponent extends Config { constructor(element, config) { super(); element = index_js.getElement(element); if (!element) { return; } this._element = element; this._config = this._getConfig(config); Data.set(this._element, this.constructor.DATA_KEY, this); } // Public dispose() { Data.remove(this._element, this.constructor.DATA_KEY); EventHandler.off(this._element, this.constructor.EVENT_KEY); for (const propertyName of Object.getOwnPropertyNames(this)) { this[propertyName] = null; } } _queueCallback(callback, element, isAnimated = true) { index_js.executeAfterTransition(callback, element, isAnimated); } _getConfig(config) { config = this._mergeConfigObj(config, this._element); config = this._configAfterMerge(config); this._typeCheckConfig(config); return config; } // Static static getInstance(element) { return Data.get(index_js.getElement(element), this.DATA_KEY); } static getOrCreateInstance(element, config = {}) { return ( this.getInstance(element) || new this(element, typeof config === 'object' ? config : null) ); } static get VERSION() { return VERSION; } static get DATA_KEY() { return `bs.${this.NAME}`; } static get EVENT_KEY() { return `.${this.DATA_KEY}`; } static eventName(name) { return `${name}${this.EVENT_KEY}`; } } return BaseComponent; }); //# sourceMappingURL=base-component.js.map ================================================ FILE: src/js/bootstrap/dist/button.js ================================================ /*! * Bootstrap button.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./util/index.js') )) : typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './util/index'], factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Button = factory(global.BaseComponent, global.EventHandler, global.Index))); })(this, function (BaseComponent, EventHandler, index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap button.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'button'; const DATA_KEY = 'bs.button'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const CLASS_NAME_ACTIVE = 'active'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; /** * Class definition */ class Button extends BaseComponent { // Getters static get NAME() { return NAME; } // Public toggle() { // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE)); } // Static static jQueryInterface(config) { return this.each(function () { const data = Button.getOrCreateInstance(this); if (config === 'toggle') { data[config](); } }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => { event.preventDefault(); const button = event.target.closest(SELECTOR_DATA_TOGGLE); const data = Button.getOrCreateInstance(button); data.toggle(); }); /** * jQuery */ index_js.defineJQueryPlugin(Button); return Button; }); //# sourceMappingURL=button.js.map ================================================ FILE: src/js/bootstrap/dist/carousel.js ================================================ /*! * Bootstrap carousel.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./util/index.js'), require('./util/swipe.js') )) : typeof define === 'function' && define.amd ? define( [ './base-component', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './util/index', './util/swipe', ], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Carousel = factory( global.BaseComponent, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Index, global.Swipe ))); })(this, function (BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js, Swipe) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap carousel.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'carousel'; const DATA_KEY = 'bs.carousel'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const ARROW_LEFT_KEY = 'ArrowLeft'; const ARROW_RIGHT_KEY = 'ArrowRight'; const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch const ORDER_NEXT = 'next'; const ORDER_PREV = 'prev'; const DIRECTION_LEFT = 'left'; const DIRECTION_RIGHT = 'right'; const EVENT_SLIDE = `slide${EVENT_KEY}`; const EVENT_SLID = `slid${EVENT_KEY}`; const EVENT_KEYDOWN = `keydown${EVENT_KEY}`; const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`; const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`; const EVENT_DRAG_START = `dragstart${EVENT_KEY}`; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_CAROUSEL = 'carousel'; const CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_SLIDE = 'slide'; const CLASS_NAME_END = 'carousel-item-end'; const CLASS_NAME_START = 'carousel-item-start'; const CLASS_NAME_NEXT = 'carousel-item-next'; const CLASS_NAME_PREV = 'carousel-item-prev'; const SELECTOR_ACTIVE = '.active'; const SELECTOR_ITEM = '.carousel-item'; const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM; const SELECTOR_ITEM_IMG = '.carousel-item img'; const SELECTOR_INDICATORS = '.carousel-indicators'; const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'; const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; const KEY_TO_DIRECTION = { [ARROW_LEFT_KEY]: DIRECTION_RIGHT, [ARROW_RIGHT_KEY]: DIRECTION_LEFT, }; const Default = { interval: 5000, keyboard: true, pause: 'hover', ride: false, touch: true, wrap: true, }; const DefaultType = { interval: '(number|boolean)', // TODO:v6 remove boolean support keyboard: 'boolean', pause: '(string|boolean)', ride: '(boolean|string)', touch: 'boolean', wrap: 'boolean', }; /** * Class definition */ class Carousel extends BaseComponent { constructor(element, config) { super(element, config); this._interval = null; this._activeElement = null; this._isSliding = false; this.touchTimeout = null; this._swipeHelper = null; this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element); this._addEventListeners(); if (this._config.ride === CLASS_NAME_CAROUSEL) { this.cycle(); } } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public next() { this._slide(ORDER_NEXT); } nextWhenVisible() { // FIXME TODO use `document.visibilityState` // Don't call next when the page isn't visible // or the carousel or its parent isn't visible if (!document.hidden && index_js.isVisible(this._element)) { this.next(); } } prev() { this._slide(ORDER_PREV); } pause() { if (this._isSliding) { index_js.triggerTransitionEnd(this._element); } this._clearInterval(); } cycle() { this._clearInterval(); this._updateInterval(); this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval); } _maybeEnableCycle() { if (!this._config.ride) { return; } if (this._isSliding) { EventHandler.one(this._element, EVENT_SLID, () => this.cycle()); return; } this.cycle(); } to(index) { const items = this._getItems(); if (index > items.length - 1 || index < 0) { return; } if (this._isSliding) { EventHandler.one(this._element, EVENT_SLID, () => this.to(index)); return; } const activeIndex = this._getItemIndex(this._getActive()); if (activeIndex === index) { return; } const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; this._slide(order, items[index]); } dispose() { if (this._swipeHelper) { this._swipeHelper.dispose(); } super.dispose(); } // Private _configAfterMerge(config) { config.defaultInterval = config.interval; return config; } _addEventListeners() { if (this._config.keyboard) { EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event)); } if (this._config.pause === 'hover') { EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause()); EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle()); } if (this._config.touch && Swipe.isSupported()) { this._addTouchEventListeners(); } } _addTouchEventListeners() { for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) { EventHandler.on(img, EVENT_DRAG_START, (event) => event.preventDefault()); } const endCallBack = () => { if (this._config.pause !== 'hover') { return; } // If it's a touch-enabled device, mouseenter/leave are fired as // part of the mouse compatibility events on first tap - the carousel // would stop cycling until user tapped out of it; // here, we listen for touchend, explicitly pause the carousel // (as if it's the second time we tap on it, mouseenter compat event // is NOT fired) and after a timeout (to allow for mouse compatibility // events to fire) we explicitly restart cycling this.pause(); if (this.touchTimeout) { clearTimeout(this.touchTimeout); } this.touchTimeout = setTimeout( () => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval ); }; const swipeConfig = { leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)), rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)), endCallback: endCallBack, }; this._swipeHelper = new Swipe(this._element, swipeConfig); } _keydown(event) { if (/input|textarea/i.test(event.target.tagName)) { return; } const direction = KEY_TO_DIRECTION[event.key]; if (direction) { event.preventDefault(); this._slide(this._directionToOrder(direction)); } } _getItemIndex(element) { return this._getItems().indexOf(element); } _setActiveIndicatorElement(index) { if (!this._indicatorsElement) { return; } const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement); activeIndicator.classList.remove(CLASS_NAME_ACTIVE); activeIndicator.removeAttribute('aria-current'); const newActiveIndicator = SelectorEngine.findOne( `[data-bs-slide-to="${index}"]`, this._indicatorsElement ); if (newActiveIndicator) { newActiveIndicator.classList.add(CLASS_NAME_ACTIVE); newActiveIndicator.setAttribute('aria-current', 'true'); } } _updateInterval() { const element = this._activeElement || this._getActive(); if (!element) { return; } const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); this._config.interval = elementInterval || this._config.defaultInterval; } _slide(order, element = null) { if (this._isSliding) { return; } const activeElement = this._getActive(); const isNext = order === ORDER_NEXT; const nextElement = element || index_js.getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap); if (nextElement === activeElement) { return; } const nextElementIndex = this._getItemIndex(nextElement); const triggerEvent = (eventName) => { return EventHandler.trigger(this._element, eventName, { relatedTarget: nextElement, direction: this._orderToDirection(order), from: this._getItemIndex(activeElement), to: nextElementIndex, }); }; const slideEvent = triggerEvent(EVENT_SLIDE); if (slideEvent.defaultPrevented) { return; } if (!activeElement || !nextElement) { // Some weirdness is happening, so we bail // TODO: change tests that use empty divs to avoid this check return; } const isCycling = Boolean(this._interval); this.pause(); this._isSliding = true; this._setActiveIndicatorElement(nextElementIndex); this._activeElement = nextElement; const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; nextElement.classList.add(orderClassName); index_js.reflow(nextElement); activeElement.classList.add(directionalClassName); nextElement.classList.add(directionalClassName); const completeCallBack = () => { nextElement.classList.remove(directionalClassName, orderClassName); nextElement.classList.add(CLASS_NAME_ACTIVE); activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName); this._isSliding = false; triggerEvent(EVENT_SLID); }; this._queueCallback(completeCallBack, activeElement, this._isAnimated()); if (isCycling) { this.cycle(); } } _isAnimated() { return this._element.classList.contains(CLASS_NAME_SLIDE); } _getActive() { return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); } _getItems() { return SelectorEngine.find(SELECTOR_ITEM, this._element); } _clearInterval() { if (this._interval) { clearInterval(this._interval); this._interval = null; } } _directionToOrder(direction) { if (index_js.isRTL()) { return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; } return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; } _orderToDirection(order) { if (index_js.isRTL()) { return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; } return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; } // Static static jQueryInterface(config) { return this.each(function () { const data = Carousel.getOrCreateInstance(this, config); if (typeof config === 'number') { data.to(config); return; } if (typeof config === 'string') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError(`No method named "${config}"`); } data[config](); } }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) { const target = SelectorEngine.getElementFromSelector(this); if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { return; } event.preventDefault(); const carousel = Carousel.getOrCreateInstance(target); const slideIndex = this.getAttribute('data-bs-slide-to'); if (slideIndex) { carousel.to(slideIndex); carousel._maybeEnableCycle(); return; } if (Manipulator.getDataAttribute(this, 'slide') === 'next') { carousel.next(); carousel._maybeEnableCycle(); return; } carousel.prev(); carousel._maybeEnableCycle(); }); EventHandler.on(window, EVENT_LOAD_DATA_API, () => { const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); for (const carousel of carousels) { Carousel.getOrCreateInstance(carousel); } }); /** * jQuery */ index_js.defineJQueryPlugin(Carousel); return Carousel; }); //# sourceMappingURL=carousel.js.map ================================================ FILE: src/js/bootstrap/dist/collapse.js ================================================ /*! * Bootstrap collapse.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js') )) : typeof define === 'function' && define.amd ? define( ['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Collapse = factory( global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index ))); })(this, function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap collapse.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'collapse'; const DATA_KEY = 'bs.collapse'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_COLLAPSE = 'collapse'; const CLASS_NAME_COLLAPSING = 'collapsing'; const CLASS_NAME_COLLAPSED = 'collapsed'; const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`; const CLASS_NAME_HORIZONTAL = 'collapse-horizontal'; const WIDTH = 'width'; const HEIGHT = 'height'; const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]'; const Default = { parent: null, toggle: true, }; const DefaultType = { parent: '(null|element)', toggle: 'boolean', }; /** * Class definition */ class Collapse extends BaseComponent { constructor(element, config) { super(element, config); this._isTransitioning = false; this._triggerArray = []; const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE); for (const elem of toggleList) { const selector = SelectorEngine.getSelectorFromElement(elem); const filterElement = SelectorEngine.find(selector).filter( (foundElement) => foundElement === this._element ); if (selector !== null && filterElement.length) { this._triggerArray.push(elem); } } this._initializeChildren(); if (!this._config.parent) { this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); } if (this._config.toggle) { this.toggle(); } } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public toggle() { if (this._isShown()) { this.hide(); } else { this.show(); } } show() { if (this._isTransitioning || this._isShown()) { return; } let activeChildren = []; // find active children if (this._config.parent) { activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES) .filter((element) => element !== this._element) .map((element) => Collapse.getOrCreateInstance(element, { toggle: false, }) ); } if (activeChildren.length && activeChildren[0]._isTransitioning) { return; } const startEvent = EventHandler.trigger(this._element, EVENT_SHOW); if (startEvent.defaultPrevented) { return; } for (const activeInstance of activeChildren) { activeInstance.hide(); } const dimension = this._getDimension(); this._element.classList.remove(CLASS_NAME_COLLAPSE); this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.style[dimension] = 0; this._addAriaAndCollapsedClass(this._triggerArray, true); this._isTransitioning = true; const complete = () => { this._isTransitioning = false; this._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); this._element.style[dimension] = ''; EventHandler.trigger(this._element, EVENT_SHOWN); }; const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); const scrollSize = `scroll${capitalizedDimension}`; this._queueCallback(complete, this._element, true); this._element.style[dimension] = `${this._element[scrollSize]}px`; } hide() { if (this._isTransitioning || !this._isShown()) { return; } const startEvent = EventHandler.trigger(this._element, EVENT_HIDE); if (startEvent.defaultPrevented) { return; } const dimension = this._getDimension(); this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; index_js.reflow(this._element); this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); for (const trigger of this._triggerArray) { const element = SelectorEngine.getElementFromSelector(trigger); if (element && !this._isShown(element)) { this._addAriaAndCollapsedClass([trigger], false); } } this._isTransitioning = true; const complete = () => { this._isTransitioning = false; this._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.add(CLASS_NAME_COLLAPSE); EventHandler.trigger(this._element, EVENT_HIDDEN); }; this._element.style[dimension] = ''; this._queueCallback(complete, this._element, true); } _isShown(element = this._element) { return element.classList.contains(CLASS_NAME_SHOW); } // Private _configAfterMerge(config) { config.toggle = Boolean(config.toggle); // Coerce string values config.parent = index_js.getElement(config.parent); return config; } _getDimension() { return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; } _initializeChildren() { if (!this._config.parent) { return; } const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE); for (const element of children) { const selected = SelectorEngine.getElementFromSelector(element); if (selected) { this._addAriaAndCollapsedClass([element], this._isShown(selected)); } } } _getFirstLevelChildren(selector) { const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth return SelectorEngine.find(selector, this._config.parent).filter( (element) => !children.includes(element) ); } _addAriaAndCollapsedClass(triggerArray, isOpen) { if (!triggerArray.length) { return; } for (const element of triggerArray) { element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); element.setAttribute('aria-expanded', isOpen); } } // Static static jQueryInterface(config) { const _config = {}; if (typeof config === 'string' && /show|hide/.test(config)) { _config.toggle = false; } return this.each(function () { const data = Collapse.getOrCreateInstance(this, _config); if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](); } }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // preventDefault only for elements (which change the URL) not inside the collapsible element if ( event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A') ) { event.preventDefault(); } for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) { Collapse.getOrCreateInstance(element, { toggle: false, }).toggle(); } }); /** * jQuery */ index_js.defineJQueryPlugin(Collapse); return Collapse; }); //# sourceMappingURL=collapse.js.map ================================================ FILE: src/js/bootstrap/dist/dom/data.js ================================================ /*! * Bootstrap data.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory()) : typeof define === 'function' && define.amd ? define(factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Data = factory())); })(this, function () { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap dom/data.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const elementMap = new Map(); const data = { set(element, key, instance) { if (!elementMap.has(element)) { elementMap.set(element, new Map()); } const instanceMap = elementMap.get(element); // make it clear we only want one instance per element // can be removed later when multiple key/instances are fine to be used if (!instanceMap.has(key) && instanceMap.size !== 0) { // eslint-disable-next-line no-console console.error( `Bootstrap doesn't allow more than one instance per element. Bound instance: ${ Array.from(instanceMap.keys())[0] }.` ); return; } instanceMap.set(key, instance); }, get(element, key) { if (elementMap.has(element)) { return elementMap.get(element).get(key) || null; } return null; }, remove(element, key) { if (!elementMap.has(element)) { return; } const instanceMap = elementMap.get(element); instanceMap.delete(key); // free up element references if there are no instances left for an element if (instanceMap.size === 0) { elementMap.delete(element); } }, }; return data; }); //# sourceMappingURL=data.js.map ================================================ FILE: src/js/bootstrap/dist/dom/event-handler.js ================================================ /*! * Bootstrap event-handler.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory(require('../util/index.js'))) : typeof define === 'function' && define.amd ? define(['../util/index'], factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.EventHandler = factory(global.Index))); })(this, function (index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap dom/event-handler.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const namespaceRegex = /[^.]*(?=\..*)\.|.*/; const stripNameRegex = /\..*/; const stripUidRegex = /::\d+$/; const eventRegistry = {}; // Events storage let uidEvent = 1; const customEvents = { mouseenter: 'mouseover', mouseleave: 'mouseout', }; 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', ]); /** * Private methods */ function makeEventUid(element, uid) { return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++; } function getElementEvents(element) { const uid = makeEventUid(element); element.uidEvent = uid; eventRegistry[uid] = eventRegistry[uid] || {}; return eventRegistry[uid]; } function bootstrapHandler(element, fn) { return function handler(event) { hydrateObj(event, { delegateTarget: element, }); if (handler.oneOff) { EventHandler.off(element, event.type, fn); } return fn.apply(element, [event]); }; } function bootstrapDelegationHandler(element, selector, fn) { return function handler(event) { const domElements = element.querySelectorAll(selector); for (let { target } = event; target && target !== this; target = target.parentNode) { for (const domElement of domElements) { if (domElement !== target) { continue; } hydrateObj(event, { delegateTarget: target, }); if (handler.oneOff) { EventHandler.off(element, event.type, selector, fn); } return fn.apply(target, [event]); } } }; } function findHandler(events, callable, delegationSelector = null) { return Object.values(events).find( (event) => event.callable === callable && event.delegationSelector === delegationSelector ); } function normalizeParameters(originalTypeEvent, handler, delegationFunction) { const isDelegated = typeof handler === 'string'; // TODO: tooltip passes `false` instead of selector, so we need to check const callable = isDelegated ? delegationFunction : handler || delegationFunction; let typeEvent = getTypeEvent(originalTypeEvent); if (!nativeEvents.has(typeEvent)) { typeEvent = originalTypeEvent; } return [isDelegated, callable, typeEvent]; } function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { if (typeof originalTypeEvent !== 'string' || !element) { return; } let [isDelegated, callable, typeEvent] = normalizeParameters( originalTypeEvent, handler, delegationFunction ); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position // this prevents the handler from being dispatched the same way as mouseover or mouseout does if (originalTypeEvent in customEvents) { const wrapFunction = (fn) => { return function (event) { if ( !event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) ) { return fn.call(this, event); } }; }; callable = wrapFunction(callable); } const events = getElementEvents(element); const handlers = events[typeEvent] || (events[typeEvent] = {}); const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); if (previousFunction) { previousFunction.oneOff = previousFunction.oneOff && oneOff; return; } const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')); const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable); fn.delegationSelector = isDelegated ? handler : null; fn.callable = callable; fn.oneOff = oneOff; fn.uidEvent = uid; handlers[uid] = fn; element.addEventListener(typeEvent, fn, isDelegated); } function removeHandler(element, events, typeEvent, handler, delegationSelector) { const fn = findHandler(events[typeEvent], handler, delegationSelector); if (!fn) { return; } element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); delete events[typeEvent][fn.uidEvent]; } function removeNamespacedHandlers(element, events, typeEvent, namespace) { const storeElementEvent = events[typeEvent] || {}; for (const [handlerKey, event] of Object.entries(storeElementEvent)) { if (handlerKey.includes(namespace)) { removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); } } } function getTypeEvent(event) { // allow to get the native events from namespaced events ('click.bs.button' --> 'click') event = event.replace(stripNameRegex, ''); return customEvents[event] || event; } const EventHandler = { on(element, event, handler, delegationFunction) { addHandler(element, event, handler, delegationFunction, false); }, one(element, event, handler, delegationFunction) { addHandler(element, event, handler, delegationFunction, true); }, off(element, originalTypeEvent, handler, delegationFunction) { if (typeof originalTypeEvent !== 'string' || !element) { return; } const [isDelegated, callable, typeEvent] = normalizeParameters( originalTypeEvent, handler, delegationFunction ); const inNamespace = typeEvent !== originalTypeEvent; const events = getElementEvents(element); const storeElementEvent = events[typeEvent] || {}; const isNamespace = originalTypeEvent.startsWith('.'); if (typeof callable !== 'undefined') { // Simplest case: handler is passed, remove that listener ONLY. if (!Object.keys(storeElementEvent).length) { return; } removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); return; } if (isNamespace) { for (const elementEvent of Object.keys(events)) { removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); } } for (const [keyHandlers, event] of Object.entries(storeElementEvent)) { const handlerKey = keyHandlers.replace(stripUidRegex, ''); if (!inNamespace || originalTypeEvent.includes(handlerKey)) { removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); } } }, trigger(element, event, args) { if (typeof event !== 'string' || !element) { return null; } const $ = index_js.getjQuery(); const typeEvent = getTypeEvent(event); const inNamespace = event !== typeEvent; let jQueryEvent = null; let bubbles = true; let nativeDispatch = true; let defaultPrevented = false; if (inNamespace && $) { jQueryEvent = $.Event(event, args); $(element).trigger(jQueryEvent); bubbles = !jQueryEvent.isPropagationStopped(); nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); defaultPrevented = jQueryEvent.isDefaultPrevented(); } const evt = hydrateObj( new Event(event, { bubbles, cancelable: true, }), args ); if (defaultPrevented) { evt.preventDefault(); } if (nativeDispatch) { element.dispatchEvent(evt); } if (evt.defaultPrevented && jQueryEvent) { jQueryEvent.preventDefault(); } return evt; }, }; function hydrateObj(obj, meta = {}) { for (const [key, value] of Object.entries(meta)) { try { obj[key] = value; } catch (_unused) { Object.defineProperty(obj, key, { configurable: true, get() { return value; }, }); } } return obj; } return EventHandler; }); //# sourceMappingURL=event-handler.js.map ================================================ FILE: src/js/bootstrap/dist/dom/manipulator.js ================================================ /*! * Bootstrap manipulator.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory()) : typeof define === 'function' && define.amd ? define(factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Manipulator = factory())); })(this, function () { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap dom/manipulator.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ function normalizeData(value) { if (value === 'true') { return true; } if (value === 'false') { return false; } if (value === Number(value).toString()) { return Number(value); } if (value === '' || value === 'null') { return null; } if (typeof value !== 'string') { return value; } try { return JSON.parse(decodeURIComponent(value)); } catch (_unused) { return value; } } function normalizeDataKey(key) { return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); } const Manipulator = { setDataAttribute(element, key, value) { element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); }, removeDataAttribute(element, key) { element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); }, getDataAttributes(element) { if (!element) { return {}; } const attributes = {}; const bsKeys = Object.keys(element.dataset).filter( (key) => key.startsWith('bs') && !key.startsWith('bsConfig') ); for (const key of bsKeys) { let pureKey = key.replace(/^bs/, ''); pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); attributes[pureKey] = normalizeData(element.dataset[key]); } return attributes; }, getDataAttribute(element, key) { return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); }, }; return Manipulator; }); //# sourceMappingURL=manipulator.js.map ================================================ FILE: src/js/bootstrap/dist/dom/selector-engine.js ================================================ /*! * Bootstrap selector-engine.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory(require('../util/index.js'))) : typeof define === 'function' && define.amd ? define(['../util/index'], factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.SelectorEngine = factory(global.Index))); })(this, function (index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap dom/selector-engine.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ const getSelector = (element) => { let selector = element.getAttribute('data-bs-target'); if (!selector || selector === '#') { let hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, // so everything starting with `#` or `.`. If a "real" URL is used as the selector, // `document.querySelector` will rightfully complain it is invalid. // See https://github.com/twbs/bootstrap/issues/32273 if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) { return null; } // Just in case some CMS puts out a full URL with the anchor appended if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) { hrefAttribute = `#${hrefAttribute.split('#')[1]}`; } selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null; } return selector ? selector .split(',') .map((sel) => index_js.parseSelector(sel)) .join(',') : null; }; const SelectorEngine = { find(selector, element = document.documentElement) { return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); }, findOne(selector, element = document.documentElement) { return Element.prototype.querySelector.call(element, selector); }, children(element, selector) { return [].concat(...element.children).filter((child) => child.matches(selector)); }, parents(element, selector) { const parents = []; let ancestor = element.parentNode.closest(selector); while (ancestor) { parents.push(ancestor); ancestor = ancestor.parentNode.closest(selector); } return parents; }, prev(element, selector) { let previous = element.previousElementSibling; while (previous) { if (previous.matches(selector)) { return [previous]; } previous = previous.previousElementSibling; } return []; }, // TODO: this is now unused; remove later along with prev() next(element, selector) { let next = element.nextElementSibling; while (next) { if (next.matches(selector)) { return [next]; } next = next.nextElementSibling; } return []; }, focusableChildren(element) { const focusables = [ 'a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]', ] .map((selector) => `${selector}:not([tabindex^="-"])`) .join(','); return this.find(focusables, element).filter( (el) => !index_js.isDisabled(el) && index_js.isVisible(el) ); }, getSelectorFromElement(element) { const selector = getSelector(element); if (selector) { return SelectorEngine.findOne(selector) ? selector : null; } return null; }, getElementFromSelector(element) { const selector = getSelector(element); return selector ? SelectorEngine.findOne(selector) : null; }, getMultipleElementsFromSelector(element) { const selector = getSelector(element); return selector ? SelectorEngine.find(selector) : []; }, }; return SelectorEngine; }); //# sourceMappingURL=selector-engine.js.map ================================================ FILE: src/js/bootstrap/dist/dropdown.js ================================================ /*! * Bootstrap dropdown.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./util/index.js') )) : typeof define === 'function' && define.amd ? define( [ '@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './util/index', ], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Dropdown = factory( global['@popperjs/core'], global.BaseComponent, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Index ))); })(this, function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) { 'use strict'; function _interopNamespaceDefault(e) { const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); if (e) { for (const k in e) { if (k !== 'default') { const d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty( n, k, d.get ? d : { enumerable: true, get: () => e[k], } ); } } } n.default = e; return Object.freeze(n); } const Popper__namespace = /*#__PURE__*/ _interopNamespaceDefault(Popper); /** * -------------------------------------------------------------------------- * Bootstrap dropdown.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'dropdown'; const DATA_KEY = 'bs.dropdown'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const ESCAPE_KEY = 'Escape'; const TAB_KEY = 'Tab'; const ARROW_UP_KEY = 'ArrowUp'; const ARROW_DOWN_KEY = 'ArrowDown'; const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`; const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_DROPUP = 'dropup'; const CLASS_NAME_DROPEND = 'dropend'; const CLASS_NAME_DROPSTART = 'dropstart'; const CLASS_NAME_DROPUP_CENTER = 'dropup-center'; const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'; const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`; const SELECTOR_MENU = '.dropdown-menu'; const SELECTOR_NAVBAR = '.navbar'; const SELECTOR_NAVBAR_NAV = '.navbar-nav'; const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start'; const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end'; const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start'; const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end'; const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start'; const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start'; const PLACEMENT_TOPCENTER = 'top'; const PLACEMENT_BOTTOMCENTER = 'bottom'; const Default = { autoClose: true, boundary: 'clippingParents', display: 'dynamic', offset: [0, 2], popperConfig: null, reference: 'toggle', }; const DefaultType = { autoClose: '(boolean|string)', boundary: '(string|element)', display: 'string', offset: '(array|string|function)', popperConfig: '(null|object|function)', reference: '(string|element|object)', }; /** * Class definition */ class Dropdown extends BaseComponent { constructor(element, config) { super(element, config); this._popper = null; this._parent = this._element.parentNode; // dropdown wrapper // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/ this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent); this._inNavbar = this._detectNavbar(); } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public toggle() { return this._isShown() ? this.hide() : this.show(); } show() { if (index_js.isDisabled(this._element) || this._isShown()) { return; } const relatedTarget = { relatedTarget: this._element, }; const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget); if (showEvent.defaultPrevented) { return; } this._createPopper(); // If this is a touch-enabled device we add extra // empty mouseover listeners to the body's immediate children; // only needed because of broken event delegation on iOS // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html if ( 'ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV) ) { for (const element of [].concat(...document.body.children)) { EventHandler.on(element, 'mouseover', index_js.noop); } } this._element.focus(); this._element.setAttribute('aria-expanded', true); this._menu.classList.add(CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_SHOW); EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget); } hide() { if (index_js.isDisabled(this._element) || !this._isShown()) { return; } const relatedTarget = { relatedTarget: this._element, }; this._completeHide(relatedTarget); } dispose() { if (this._popper) { this._popper.destroy(); } super.dispose(); } update() { this._inNavbar = this._detectNavbar(); if (this._popper) { this._popper.update(); } } // Private _completeHide(relatedTarget) { const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget); if (hideEvent.defaultPrevented) { return; } // If this is a touch-enabled device we remove the extra // empty mouseover listeners we added for iOS support if ('ontouchstart' in document.documentElement) { for (const element of [].concat(...document.body.children)) { EventHandler.off(element, 'mouseover', index_js.noop); } } if (this._popper) { this._popper.destroy(); } this._menu.classList.remove(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOW); this._element.setAttribute('aria-expanded', 'false'); Manipulator.removeDataAttribute(this._menu, 'popper'); EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget); } _getConfig(config) { config = super._getConfig(config); if ( typeof config.reference === 'object' && !index_js.isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function' ) { // Popper virtual elements require a getBoundingClientRect method throw new TypeError( `${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.` ); } return config; } _createPopper() { if (typeof Popper__namespace === 'undefined') { throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); } let referenceElement = this._element; if (this._config.reference === 'parent') { referenceElement = this._parent; } else if (index_js.isElement(this._config.reference)) { referenceElement = index_js.getElement(this._config.reference); } else if (typeof this._config.reference === 'object') { referenceElement = this._config.reference; } const popperConfig = this._getPopperConfig(); this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig); } _isShown() { return this._menu.classList.contains(CLASS_NAME_SHOW); } _getPlacement() { const parentDropdown = this._parent; if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { return PLACEMENT_RIGHT; } if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { return PLACEMENT_LEFT; } if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { return PLACEMENT_TOPCENTER; } if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { return PLACEMENT_BOTTOMCENTER; } // We need to trim the value because custom properties can also include spaces const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; } return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; } _detectNavbar() { return this._element.closest(SELECTOR_NAVBAR) !== null; } _getOffset() { const { offset } = this._config; if (typeof offset === 'string') { return offset.split(',').map((value) => Number.parseInt(value, 10)); } if (typeof offset === 'function') { return (popperData) => offset(popperData, this._element); } return offset; } _getPopperConfig() { const defaultBsPopperConfig = { placement: this._getPlacement(), modifiers: [ { name: 'preventOverflow', options: { boundary: this._config.boundary, }, }, { name: 'offset', options: { offset: this._getOffset(), }, }, ], }; // Disable Popper if we have a static display or Dropdown is in Navbar if (this._inNavbar || this._config.display === 'static') { Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove defaultBsPopperConfig.modifiers = [ { name: 'applyStyles', enabled: false, }, ]; } return { ...defaultBsPopperConfig, ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig]), }; } _selectMenuItem({ key, target }) { const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => index_js.isVisible(element) ); if (!items.length) { return; } // if target isn't included in items (e.g. when expanding the dropdown) // allow cycling to get the last item in case key equals ARROW_UP_KEY index_js .getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)) .focus(); } // Static static jQueryInterface(config) { return this.each(function () { const data = Dropdown.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](); }); } static clearMenus(event) { if ( event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY) ) { return; } const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN); for (const toggle of openToggles) { const context = Dropdown.getInstance(toggle); if (!context || context._config.autoClose === false) { continue; } const composedPath = event.composedPath(); const isMenuTarget = composedPath.includes(context._menu); if ( composedPath.includes(context._element) || (context._config.autoClose === 'inside' && !isMenuTarget) || (context._config.autoClose === 'outside' && isMenuTarget) ) { continue; } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu if ( context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName)) ) { continue; } const relatedTarget = { relatedTarget: context._element, }; if (event.type === 'click') { relatedTarget.clickEvent = event; } context._completeHide(relatedTarget); } } static dataApiKeydownHandler(event) { // If not an UP | DOWN | ESCAPE key => not a dropdown command // If input/textarea && if key is other than ESCAPE => not a dropdown command const isInput = /input|textarea/i.test(event.target.tagName); const isEscapeEvent = event.key === ESCAPE_KEY; const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key); if (!isUpOrDownEvent && !isEscapeEvent) { return; } if (isInput && !isEscapeEvent) { return; } event.preventDefault(); // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode); const instance = Dropdown.getOrCreateInstance(getToggleButton); if (isUpOrDownEvent) { event.stopPropagation(); instance.show(); instance._selectMenuItem(event); return; } if (instance._isShown()) { // else is escape and we check if it is shown event.stopPropagation(); instance.hide(); getToggleButton.focus(); } } } /** * Data API implementation */ EventHandler.on( document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler ); EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus); EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { event.preventDefault(); Dropdown.getOrCreateInstance(this).toggle(); }); /** * jQuery */ index_js.defineJQueryPlugin(Dropdown); return Dropdown; }); //# sourceMappingURL=dropdown.js.map ================================================ FILE: src/js/bootstrap/dist/modal.js ================================================ /*! * Bootstrap modal.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js') )) : typeof define === 'function' && define.amd ? define( [ './base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar', ], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Modal = factory( global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar ))); })( this, function ( BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper ) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap modal.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'modal'; const DATA_KEY = 'bs.modal'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const ESCAPE_KEY = 'Escape'; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_RESIZE = `resize${EVENT_KEY}`; const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`; const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`; const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_OPEN = 'modal-open'; const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_STATIC = 'modal-static'; const OPEN_SELECTOR = '.modal.show'; const SELECTOR_DIALOG = '.modal-dialog'; const SELECTOR_MODAL_BODY = '.modal-body'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]'; const Default = { backdrop: true, focus: true, keyboard: true, }; const DefaultType = { backdrop: '(boolean|string)', focus: 'boolean', keyboard: 'boolean', }; /** * Class definition */ class Modal extends BaseComponent { constructor(element, config) { super(element, config); this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element); this._backdrop = this._initializeBackDrop(); this._focustrap = this._initializeFocusTrap(); this._isShown = false; this._isTransitioning = false; this._scrollBar = new ScrollBarHelper(); this._addEventListeners(); } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); } show(relatedTarget) { if (this._isShown || this._isTransitioning) { return; } const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget, }); if (showEvent.defaultPrevented) { return; } this._isShown = true; this._isTransitioning = true; this._scrollBar.hide(); document.body.classList.add(CLASS_NAME_OPEN); this._adjustDialog(); this._backdrop.show(() => this._showElement(relatedTarget)); } hide() { if (!this._isShown || this._isTransitioning) { return; } const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE); if (hideEvent.defaultPrevented) { return; } this._isShown = false; this._isTransitioning = true; this._focustrap.deactivate(); this._element.classList.remove(CLASS_NAME_SHOW); this._queueCallback(() => this._hideModal(), this._element, this._isAnimated()); } dispose() { EventHandler.off(window, EVENT_KEY); EventHandler.off(this._dialog, EVENT_KEY); this._backdrop.dispose(); this._focustrap.deactivate(); super.dispose(); } handleUpdate() { this._adjustDialog(); } // Private _initializeBackDrop() { return new Backdrop({ isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value, isAnimated: this._isAnimated(), }); } _initializeFocusTrap() { return new FocusTrap({ trapElement: this._element, }); } _showElement(relatedTarget) { // try to append dynamic modal if (!document.body.contains(this._element)) { document.body.append(this._element); } this._element.style.display = 'block'; this._element.removeAttribute('aria-hidden'); this._element.setAttribute('aria-modal', true); this._element.setAttribute('role', 'dialog'); this._element.scrollTop = 0; const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); if (modalBody) { modalBody.scrollTop = 0; } index_js.reflow(this._element); this._element.classList.add(CLASS_NAME_SHOW); const transitionComplete = () => { if (this._config.focus) { this._focustrap.activate(); } this._isTransitioning = false; EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget, }); }; this._queueCallback(transitionComplete, this._dialog, this._isAnimated()); } _addEventListeners() { EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => { if (event.key !== ESCAPE_KEY) { return; } if (this._config.keyboard) { this.hide(); return; } this._triggerBackdropTransition(); }); EventHandler.on(window, EVENT_RESIZE, () => { if (this._isShown && !this._isTransitioning) { this._adjustDialog(); } }); EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event) => { // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event2) => { if (this._element !== event.target || this._element !== event2.target) { return; } if (this._config.backdrop === 'static') { this._triggerBackdropTransition(); return; } if (this._config.backdrop) { this.hide(); } }); }); } _hideModal() { this._element.style.display = 'none'; this._element.setAttribute('aria-hidden', true); this._element.removeAttribute('aria-modal'); this._element.removeAttribute('role'); this._isTransitioning = false; this._backdrop.hide(() => { document.body.classList.remove(CLASS_NAME_OPEN); this._resetAdjustments(); this._scrollBar.reset(); EventHandler.trigger(this._element, EVENT_HIDDEN); }); } _isAnimated() { return this._element.classList.contains(CLASS_NAME_FADE); } _triggerBackdropTransition() { const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); if (hideEvent.defaultPrevented) { return; } const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) { return; } if (!isModalOverflowing) { this._element.style.overflowY = 'hidden'; } this._element.classList.add(CLASS_NAME_STATIC); this._queueCallback(() => { this._element.classList.remove(CLASS_NAME_STATIC); this._queueCallback(() => { this._element.style.overflowY = initialOverflowY; }, this._dialog); }, this._dialog); this._element.focus(); } /** * The following methods are used to handle overflowing modals */ _adjustDialog() { const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; const scrollbarWidth = this._scrollBar.getWidth(); const isBodyOverflowing = scrollbarWidth > 0; if (isBodyOverflowing && !isModalOverflowing) { const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight'; this._element.style[property] = `${scrollbarWidth}px`; } if (!isBodyOverflowing && isModalOverflowing) { const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft'; this._element.style[property] = `${scrollbarWidth}px`; } } _resetAdjustments() { this._element.style.paddingLeft = ''; this._element.style.paddingRight = ''; } // Static static jQueryInterface(config, relatedTarget) { return this.each(function () { const data = Modal.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](relatedTarget); }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { const target = SelectorEngine.getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } EventHandler.one(target, EVENT_SHOW, (showEvent) => { if (showEvent.defaultPrevented) { // only register focus restorer if modal will actually get shown return; } EventHandler.one(target, EVENT_HIDDEN, () => { if (index_js.isVisible(this)) { this.focus(); } }); }); // avoid conflict when clicking modal toggler while another one is open const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); if (alreadyOpen) { Modal.getInstance(alreadyOpen).hide(); } const data = Modal.getOrCreateInstance(target); data.toggle(this); }); componentFunctions_js.enableDismissTrigger(Modal); /** * jQuery */ index_js.defineJQueryPlugin(Modal); return Modal; } ); //# sourceMappingURL=modal.js.map ================================================ FILE: src/js/bootstrap/dist/offcanvas.js ================================================ /*! * Bootstrap offcanvas.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js') )) : typeof define === 'function' && define.amd ? define( [ './base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar', ], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Offcanvas = factory( global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar ))); })( this, function ( BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper ) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap offcanvas.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'offcanvas'; const DATA_KEY = 'bs.offcanvas'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; const ESCAPE_KEY = 'Escape'; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOWING = 'showing'; const CLASS_NAME_HIDING = 'hiding'; const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'; const OPEN_SELECTOR = '.offcanvas.show'; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_RESIZE = `resize${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]'; const Default = { backdrop: true, keyboard: true, scroll: false, }; const DefaultType = { backdrop: '(boolean|string)', keyboard: 'boolean', scroll: 'boolean', }; /** * Class definition */ class Offcanvas extends BaseComponent { constructor(element, config) { super(element, config); this._isShown = false; this._backdrop = this._initializeBackDrop(); this._focustrap = this._initializeFocusTrap(); this._addEventListeners(); } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public toggle(relatedTarget) { return this._isShown ? this.hide() : this.show(relatedTarget); } show(relatedTarget) { if (this._isShown) { return; } const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget, }); if (showEvent.defaultPrevented) { return; } this._isShown = true; this._backdrop.show(); if (!this._config.scroll) { new ScrollBarHelper().hide(); } this._element.setAttribute('aria-modal', true); this._element.setAttribute('role', 'dialog'); this._element.classList.add(CLASS_NAME_SHOWING); const completeCallBack = () => { if (!this._config.scroll || this._config.backdrop) { this._focustrap.activate(); } this._element.classList.add(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOWING); EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget, }); }; this._queueCallback(completeCallBack, this._element, true); } hide() { if (!this._isShown) { return; } const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE); if (hideEvent.defaultPrevented) { return; } this._focustrap.deactivate(); this._element.blur(); this._isShown = false; this._element.classList.add(CLASS_NAME_HIDING); this._backdrop.hide(); const completeCallback = () => { this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING); this._element.removeAttribute('aria-modal'); this._element.removeAttribute('role'); if (!this._config.scroll) { new ScrollBarHelper().reset(); } EventHandler.trigger(this._element, EVENT_HIDDEN); }; this._queueCallback(completeCallback, this._element, true); } dispose() { this._backdrop.dispose(); this._focustrap.deactivate(); super.dispose(); } // Private _initializeBackDrop() { const clickCallback = () => { if (this._config.backdrop === 'static') { EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); return; } this.hide(); }; // 'static' option will be translated to true, and booleans will keep their value const isVisible = Boolean(this._config.backdrop); return new Backdrop({ className: CLASS_NAME_BACKDROP, isVisible, isAnimated: true, rootElement: this._element.parentNode, clickCallback: isVisible ? clickCallback : null, }); } _initializeFocusTrap() { return new FocusTrap({ trapElement: this._element, }); } _addEventListeners() { EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => { if (event.key !== ESCAPE_KEY) { return; } if (this._config.keyboard) { this.hide(); return; } EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); }); } // Static static jQueryInterface(config) { return this.each(function () { const data = Offcanvas.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { throw new TypeError(`No method named "${config}"`); } data[config](this); }); } } /** * Data API implementation */ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { const target = SelectorEngine.getElementFromSelector(this); if (['A', 'AREA'].includes(this.tagName)) { event.preventDefault(); } if (index_js.isDisabled(this)) { return; } EventHandler.one(target, EVENT_HIDDEN, () => { // focus on trigger when it is closed if (index_js.isVisible(this)) { this.focus(); } }); // avoid conflict when clicking a toggler of an offcanvas, while another is open const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); if (alreadyOpen && alreadyOpen !== target) { Offcanvas.getInstance(alreadyOpen).hide(); } const data = Offcanvas.getOrCreateInstance(target); data.toggle(this); }); EventHandler.on(window, EVENT_LOAD_DATA_API, () => { for (const selector of SelectorEngine.find(OPEN_SELECTOR)) { Offcanvas.getOrCreateInstance(selector).show(); } }); EventHandler.on(window, EVENT_RESIZE, () => { for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) { if (getComputedStyle(element).position !== 'fixed') { Offcanvas.getOrCreateInstance(element).hide(); } } }); componentFunctions_js.enableDismissTrigger(Offcanvas); /** * jQuery */ index_js.defineJQueryPlugin(Offcanvas); return Offcanvas; } ); //# sourceMappingURL=offcanvas.js.map ================================================ FILE: src/js/bootstrap/dist/popover.js ================================================ /*! * Bootstrap popover.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory(require('./tooltip.js'), require('./util/index.js'))) : typeof define === 'function' && define.amd ? define(['./tooltip', './util/index'], factory) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Popover = factory(global.Tooltip, global.Index))); })(this, function (Tooltip, index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap popover.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'popover'; const SELECTOR_TITLE = '.popover-header'; const SELECTOR_CONTENT = '.popover-body'; const Default = { ...Tooltip.Default, content: '', offset: [0, 8], placement: 'right', template: '', trigger: 'click', }; const DefaultType = { ...Tooltip.DefaultType, content: '(null|string|element|function)', }; /** * Class definition */ class Popover extends Tooltip { // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Overrides _isWithContent() { return this._getTitle() || this._getContent(); } // Private _getContentForTemplate() { return { [SELECTOR_TITLE]: this._getTitle(), [SELECTOR_CONTENT]: this._getContent(), }; } _getContent() { return this._resolvePossibleFunction(this._config.content); } // Static static jQueryInterface(config) { return this.each(function () { const data = Popover.getOrCreateInstance(this, config); if (typeof config !== 'string') { return; } if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](); }); } } /** * jQuery */ index_js.defineJQueryPlugin(Popover); return Popover; }); //# sourceMappingURL=popover.js.map ================================================ FILE: src/js/bootstrap/dist/scrollspy.js ================================================ /*! * Bootstrap scrollspy.js v5.3.3 (https://getbootstrap.com/) * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? (module.exports = factory( require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js') )) : typeof define === 'function' && define.amd ? define( ['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory ) : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), (global.Scrollspy = factory( global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index ))); })(this, function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict'; /** * -------------------------------------------------------------------------- * Bootstrap scrollspy.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * Constants */ const NAME = 'scrollspy'; const DATA_KEY = 'bs.scrollspy'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const EVENT_ACTIVATE = `activate${EVENT_KEY}`; const EVENT_CLICK = `click${EVENT_KEY}`; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; const CLASS_NAME_ACTIVE = 'active'; const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; const SELECTOR_TARGET_LINKS = '[href]'; const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; const SELECTOR_NAV_LINKS = '.nav-link'; const SELECTOR_NAV_ITEMS = '.nav-item'; const SELECTOR_LIST_ITEMS = '.list-group-item'; const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`; const SELECTOR_DROPDOWN = '.dropdown'; const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; const Default = { offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons rootMargin: '0px 0px -25%', smoothScroll: false, target: null, threshold: [0.1, 0.5, 1], }; const DefaultType = { offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons rootMargin: 'string', smoothScroll: 'boolean', target: 'element', threshold: 'array', }; /** * Class definition */ class ScrollSpy extends BaseComponent { constructor(element, config) { super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper this._targetLinks = new Map(); this._observableSections = new Map(); this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element; this._activeTarget = null; this._observer = null; this._previousScrollData = { visibleEntryTop: 0, parentScrollTop: 0, }; this.refresh(); // initialize } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public refresh() { this._initializeTargetsAndObservables(); this._maybeEnableSmoothScroll(); if (this._observer) { this._observer.disconnect(); } else { this._observer = this._getNewObserver(); } for (const section of this._observableSections.values()) { this._observer.observe(section); } } dispose() { this._observer.disconnect(); super.dispose(); } // Private _configAfterMerge(config) { // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case config.target = index_js.getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin; if (typeof config.threshold === 'string') { config.threshold = config.threshold.split(',').map((value) => Number.parseFloat(value)); } return config; } _maybeEnableSmoothScroll() { if (!this._config.smoothScroll) { return; } // unregister any previous listeners EventHandler.off(this._config.target, EVENT_CLICK); EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => { const observableSection = this._observableSections.get(event.target.hash); if (observableSection) { event.preventDefault(); const root = this._rootElement || window; const height = observableSection.offsetTop - this._element.offsetTop; if (root.scrollTo) { root.scrollTo({ top: height, behavior: 'smooth', }); return; } // Chrome 60 doesn't support `scrollTo` root.scrollTop = height; } }); } _getNewObserver() { const options = { root: this._rootElement, threshold: this._config.threshold, rootMargin: this._config.rootMargin, }; return new IntersectionObserver((entries) => this._observerCallback(entries), options); } // The logic of selection _observerCallback(entries) { const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`); const activate = (entry) => { this._previousScrollData.visibleEntryTop = entry.target.offsetTop; this._process(targetElement(entry)); }; const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; this._previousScrollData.parentScrollTop = parentScrollTop; for (const entry of entries) { if (!entry.isIntersecting) { this._activeTarget = null; this._clearActiveClass(targetElement(entry)); continue; } const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop if (userScrollsDown && entryIsLowerThanPrevious) { activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration if (!parentScrollTop) { return; } continue; } // if we are scrolling up, pick the smallest offsetTop if (!userScrollsDown && !entryIsLowerThanPrevious) { activate(entry); } } } _initializeTargetsAndObservables() { this._targetLinks = new Map(); this._observableSections = new Map(); const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target); for (const anchor of targetLinks) { // ensure that the anchor has an id and is not disabled if (!anchor.hash || index_js.isDisabled(anchor)) { continue; } const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element); // ensure that the observableSection exists & is visible if (index_js.isVisible(observableSection)) { this._targetLinks.set(decodeURI(anchor.hash), anchor); this._observableSections.set(anchor.hash, observableSection); } } } _process(target) { if (this._activeTarget === target) { return; } this._clearActiveClass(this._config.target); this._activeTarget = target; target.classList.add(CLASS_NAME_ACTIVE); this._activateParents(target); EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target, }); } _activateParents(target) { // Activate dropdown parents if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { SelectorEngine.findOne( SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN) ).classList.add(CLASS_NAME_ACTIVE); return; } for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) { // Set triggered links parents as active // With both