Release: 7.0.0

This commit is contained in:
Grzegorz Bujański 2023-11-20 11:08:21 +01:00
parent af9014d222
commit 38596347fa
272 changed files with 11535 additions and 4771 deletions

View File

@ -1,5 +1,5 @@
MDB5 MDB5
Version: FREE 6.4.2 Version: PRO 7.0.0
Documentation: Documentation:
https://mdbootstrap.com/docs/standard/ https://mdbootstrap.com/docs/standard/

36
css/mdb.dark.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

51
css/mdb.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

23
css/mdb.rtl.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -34,6 +34,7 @@
<p class="mb-3">MDB Team</p> <p class="mb-3">MDB Team</p>
<a <a
class="btn btn-primary btn-lg" class="btn btn-primary btn-lg"
data-mdb-ripple-init
href="https://mdbootstrap.com/docs/standard/getting-started/" href="https://mdbootstrap.com/docs/standard/getting-started/"
target="_blank" target="_blank"
role="button" role="button"
@ -45,7 +46,7 @@
<!-- End your project here--> <!-- End your project here-->
<!-- MDB --> <!-- MDB -->
<script type="text/javascript" src="js/mdb.min.js"></script> <script type="text/javascript" src="js/mdb.umd.min.js"></script>
<!-- Custom scripts --> <!-- Custom scripts -->
<script type="text/javascript"></script> <script type="text/javascript"></script>
</body> </body>

5052
js/mdb.es.min.js vendored Normal file

File diff suppressed because it is too large Load Diff

1
js/mdb.es.min.js.map Normal file

File diff suppressed because one or more lines are too long

20
js/mdb.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

22
js/mdb.umd.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
js/mdb.umd.min.js.map Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{ {
"name": "mdb-ui-kit", "name": "mdb-ui-kit",
"version": "6.4.2", "version": "7.0.0",
"main": "js/mdb.min.js", "main": "js/mdb.min.js",
"homepage": "https://mdbootstrap.com/docs/standard/", "homepage": "https://mdbootstrap.com/docs/standard/",
"repository": "https://github.com/mdbootstrap/mdb-ui-kit.git", "repository": "https://github.com/mdbootstrap/mdb-ui-kit.git",

View File

@ -0,0 +1,61 @@
import Manipulator from '../../mdb/dom/manipulator';
import SelectorEngine from '../../mdb/dom/selector-engine';
import DEFAULT_OPTIONS from '../../pro/charts/chartsDefaults';
const chartsCallback = (Component, initSelector) => {
// eslint-disable-next-line consistent-return
const IS_COMPLEX = (data) => {
return (
(data[0] === '{' && data[data.length - 1] === '}') ||
(data[0] === '[' && data[data.length - 1] === ']')
);
};
const CONVERT_DATA_TYPE = (data) => {
if (typeof data !== 'string') return data;
if (IS_COMPLEX(data)) {
return JSON.parse(data.replace(/'/g, '"'));
}
return data;
};
const PARSE_DATA = (data) => {
const dataset = {};
Object.keys(data).forEach((property) => {
if (property.match(/dataset.*/)) {
const chartProperty = property.slice(7, 8).toLowerCase().concat(property.slice(8));
dataset[chartProperty] = CONVERT_DATA_TYPE(data[property]);
}
});
return dataset;
};
SelectorEngine.find(initSelector).forEach((el) => {
if (
!Component.getInstance(el) &&
Manipulator.getDataAttribute(el, 'chart') !== 'bubble' &&
Manipulator.getDataAttribute(el, 'chart') !== 'scatter'
) {
const dataSet = Manipulator.getDataAttributes(el);
const dataAttr = {
data: {
datasets: [PARSE_DATA(dataSet)],
},
};
if (dataSet.chart) {
dataAttr.type = dataSet.chart;
}
if (dataSet.labels) {
dataAttr.data.labels = JSON.parse(dataSet.labels.replace(/'/g, '"'));
}
return new Component(el, {
...dataAttr,
...DEFAULT_OPTIONS[dataAttr.type],
});
}
return null;
});
};
export default chartsCallback;

View File

@ -0,0 +1,435 @@
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 alertCallback = (component, initSelector) => {
const Alert = component;
enableDismissTrigger(Alert, 'close');
// 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`;
// 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();
});
// MDB init
SelectorEngine.find(initSelector).forEach((element) => {
return Button.getOrCreateInstance(element);
});
};
const carouselCallback = (component, initSelector) => {
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);
});
});
};
const collapseCallback = (component, initSelector) => {
const EVENT_CLICK_DATA_API = `click.bs.${component.name}.data-api`;
const SELECTOR_DATA_TOGGLE = initSelector;
const Collapse = component;
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
// preventDefault only for <a> 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();
});
});
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;
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();
});
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;
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();
});
});
// auto-init
SelectorEngine.find(SELECTOR_DATA_INIT).map((element) => new Input(element));
// 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();
});
};
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}`;
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);
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) => {
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);
};
const scrollspyCallback = (component, initSelector) => {
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);
});
});
};
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;
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);
});
});
};
const toastCallback = (component, initSelector) => {
const Toast = component;
enableDismissTrigger(Toast);
// MDB init
SelectorEngine.find(initSelector).forEach((element) => {
return Toast.getOrCreateInstance(element);
});
};
const rippleCallback = (component, initSelector) => {
const Ripple = component;
EventHandler.one(document, 'mousedown', initSelector, Ripple.autoInitial(new Ripple()));
};
export {
alertCallback,
buttonCallback,
carouselCallback,
collapseCallback,
dropdownCallback,
inputCallback,
modalCallback,
offcanvasCallback,
tabCallback,
toastCallback,
popoverCallback,
rippleCallback,
scrollspyCallback,
};

View File

@ -0,0 +1,121 @@
import EventHandler from '../../mdb/dom/event-handler';
import SelectorEngine from '../../mdb/dom/selector-engine';
import { getElementFromSelector, isVisible, getSelectorFromElement } from '../../mdb/util';
import { enableDismissTrigger } from '../../bootstrap/mdb-prefix/util/component-functions';
import {
buttonCallback,
carouselCallback,
collapseCallback,
dropdownCallback,
offcanvasCallback,
scrollspyCallback,
tabCallback,
} from './free';
const alertCallback = (component, initSelector) => {
const Alert = component;
enableDismissTrigger(Alert, 'close');
// MDB init
SelectorEngine.find(initSelector).forEach((element) => {
return Alert.getOrCreateInstance(element);
});
};
const lightboxCallback = (component, initSelector) => {
const EVENT_CLICK_DATA_API = `click.mdb.${component.name}.data-api`;
const SELECTOR_DATA_INIT = initSelector;
const SELECTOR_TOGGLE = `${SELECTOR_DATA_INIT} img:not(.lightbox-disabled)`;
const Lightbox = component;
SelectorEngine.find(SELECTOR_DATA_INIT).forEach((el) => new Lightbox(el));
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_TOGGLE, Lightbox.toggle());
};
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}`;
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);
SelectorEngine.find(initSelector).forEach((el) => {
const selector = getSelectorFromElement(el);
const selectorElement = SelectorEngine.findOne(selector);
Modal.getOrCreateInstance(selectorElement);
});
};
const sidenavCallback = (component, initSelector) => {
const SELECTOR_DATA_INIT = initSelector;
const SELECTOR_TOGGLE = '[data-mdb-toggle="sidenav"]';
const Sidenav = component;
EventHandler.on(document, 'click', SELECTOR_TOGGLE, Sidenav.toggleSidenav());
SelectorEngine.find(SELECTOR_DATA_INIT).forEach((sidenav) => {
return Sidenav.getOrCreateInstance(sidenav);
});
};
const toastCallback = (component, initSelector) => {
const SELECTOR_DATA_INIT = initSelector;
const Toast = component;
enableDismissTrigger(Toast);
SelectorEngine.find(SELECTOR_DATA_INIT).forEach((toast) => {
return Toast.getOrCreateInstance(toast);
});
};
export {
alertCallback,
lightboxCallback,
buttonCallback,
carouselCallback,
collapseCallback,
dropdownCallback,
modalCallback,
offcanvasCallback,
scrollspyCallback,
sidenavCallback,
tabCallback,
toastCallback,
};

View File

@ -0,0 +1,7 @@
import defaultInitSelectors from './initSelectors/free';
import { InitMDB } from './init';
const initMDBInstance = new InitMDB(defaultInitSelectors);
const initMDB = initMDBInstance.initMDB;
export default initMDB;

View File

@ -0,0 +1,7 @@
import defaultInitSelectors from './initSelectors/pro';
import { InitMDB } from './init';
const initMDBInstance = new InitMDB(defaultInitSelectors);
const initMDB = initMDBInstance.initMDB;
export default initMDB;

105
src/js/autoinit/init.js Normal file
View File

@ -0,0 +1,105 @@
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;
}
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);
};
}

View File

@ -0,0 +1,108 @@
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;

View File

@ -0,0 +1,158 @@
import {
alertCallback,
lightboxCallback,
sidenavCallback,
modalCallback,
toastCallback,
} from '../callbacks/pro';
import * as freeSelectors from './free';
import chartsCallback from '../callbacks/charts';
const defaultInitSelectors = {
...freeSelectors.default,
chart: {
name: 'Chart',
selector: '[data-mdb-chart-init]',
isToggler: false,
advanced: chartsCallback,
},
chips: {
name: 'ChipsInput',
selector: '[data-mdb-chips-input-init]',
isToggler: false,
},
chip: {
name: 'Chip',
selector: '[data-mdb-chip-init]',
isToggler: false,
onInit: 'init',
},
datatable: {
name: 'Datatable',
selector: '[data-mdb-datatable-init]',
isToggler: false,
},
datetimepicker: {
name: 'Datetimepicker',
selector: '[data-mdb-datetimepicker-init]',
isToggler: false,
},
datepicker: {
name: 'Datepicker',
selector: '[data-mdb-datepicker-init]',
isToggler: false,
},
loading: {
name: 'Loading',
selector: '[data-mdb-loading-init]',
isToggler: false,
},
multiRangeSlider: {
name: 'MultiRangeSlider',
selector: '[data-mdb-multi-range-slider-init]',
isToggler: false,
},
select: {
name: 'Select',
selector: '[data-mdb-select-init]',
isToggler: false,
},
timepicker: {
name: 'Timepicker',
selector: '[data-mdb-timepicker-init]',
isToggler: false,
},
touch: {
name: 'Touch',
selector: '[data-mdb-touch-init]',
isToggler: false,
},
alert: {
name: 'Alert',
selector: '[data-mdb-alert-init]',
isToggler: true,
callback: alertCallback,
},
animation: {
name: 'Animate',
selector: '[data-mdb-animation-init]',
isToggler: false,
onInit: 'init',
},
clipboard: {
name: 'Clipboard',
selector: '[data-mdb-clipboard-init]',
isToggler: false,
},
infiniteScroll: {
name: 'InfiniteScroll',
selector: '[data-mdb-infinite-scroll-init]',
isToggler: false,
},
lazyLoad: {
name: 'LazyLoad',
selector: '[data-mdb-lazy-load-init]',
isToggler: false,
},
lightbox: {
name: 'Lightbox',
selector: '[data-mdb-lightbox-init]',
isToggler: true,
callback: lightboxCallback,
},
modal: {
name: 'Modal',
selector: '[data-mdb-modal-init]',
isToggler: true,
callback: modalCallback,
},
navbar: {
name: 'Navbar',
selector: '[data-mdb-navbar-init]',
isToggler: false,
},
perfectScrollbar: {
name: 'PerfectScrollbar',
selector: '[data-mdb-perfect-scrollbar-init]',
isToggler: false,
},
popconfirm: {
name: 'Popconfirm',
selector: '[data-mdb-popconfirm-init]',
isToggler: false,
},
rating: {
name: 'Rating',
selector: '[data-mdb-rating-init]',
isToggler: false,
},
sidenav: {
name: 'Sidenav',
selector: '[data-mdb-sidenav-init]',
isToggler: true,
callback: sidenavCallback,
},
smoothScroll: {
name: 'SmoothScroll',
selector: '[data-mdb-smooth-scroll-init]',
isToggler: false,
},
stepper: {
name: 'Stepper',
selector: '[data-mdb-stepper-init]',
isToggler: false,
},
sticky: {
name: 'Sticky',
selector: '[data-mdb-sticky-init]',
isToggler: false,
},
toast: {
name: 'Toast',
selector: '[data-mdb-toast-init]',
isToggler: true,
callback: toastCallback,
},
};
export default defaultInitSelectors;

View File

@ -1,43 +1,38 @@
/*! /*!
* Bootstrap alert.js v5.2.3 (https://getbootstrap.com/) * Bootstrap alert.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./base-component'), require('./util/component-functions.js'),
require('./util/component-functions') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
['./util/index', './dom/event-handler', './base-component', './util/component-functions'], ['./base-component', './dom/event-handler', './util/component-functions', './util/index'],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Alert = factory( (global.Alert = factory(
global.Index,
global.EventHandler,
global.BaseComponent, global.BaseComponent,
global.ComponentFunctions global.EventHandler,
global.ComponentFunctions,
global.Index
))); )));
})(this, function (index, EventHandler, BaseComponent, componentFunctions) { })(this, function (BaseComponent, EventHandler, componentFunctions_js, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): alert.js * Bootstrap alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -49,63 +44,61 @@
const EVENT_CLOSED = `closed${EVENT_KEY}`; const EVENT_CLOSED = `closed${EVENT_KEY}`;
const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
/** /**
* Class definition * Class definition
*/ */
class Alert extends BaseComponent__default.default { class Alert extends BaseComponent {
// Getters // Getters
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
close() { close() {
const closeEvent = EventHandler__default.default.trigger(this._element, EVENT_CLOSE); const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
if (closeEvent.defaultPrevented) { if (closeEvent.defaultPrevented) {
return; return;
} }
this._element.classList.remove(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOW);
const isAnimated = this._element.classList.contains(CLASS_NAME_FADE); const isAnimated = this._element.classList.contains(CLASS_NAME_FADE);
this._queueCallback(() => this._destroyElement(), this._element, isAnimated); this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
} // Private }
// Private
_destroyElement() { _destroyElement() {
this._element.remove(); this._element.remove();
EventHandler.trigger(this._element, EVENT_CLOSED);
EventHandler__default.default.trigger(this._element, EVENT_CLOSED);
this.dispose(); this.dispose();
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Alert.getOrCreateInstance(this); const data = Alert.getOrCreateInstance(this);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](this); data[config](this);
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
componentFunctions.enableDismissTrigger(Alert, 'close'); componentFunctions_js.enableDismissTrigger(Alert, 'close');
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Alert); index_js.defineJQueryPlugin(Alert);
return Alert; return Alert;
}); });

View File

@ -1 +1 @@
{"version":3,"file":"alert.js","sources":["../src/alert.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\nimport { enableDismissTrigger } from './util/component-functions'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n"],"names":["NAME","DATA_KEY","EVENT_KEY","EVENT_CLOSE","EVENT_CLOSED","CLASS_NAME_FADE","CLASS_NAME_SHOW","Alert","BaseComponent","close","closeEvent","EventHandler","trigger","_element","defaultPrevented","classList","remove","isAnimated","contains","_queueCallback","_destroyElement","dispose","jQueryInterface","config","each","data","getOrCreateInstance","undefined","startsWith","TypeError","enableDismissTrigger","defineJQueryPlugin"],"mappings":";;;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAOA;EACA;EACA;;EAEA,MAAMA,IAAI,GAAG,OAAb,CAAA;EACA,MAAMC,QAAQ,GAAG,UAAjB,CAAA;EACA,MAAMC,SAAS,GAAI,CAAGD,CAAAA,EAAAA,QAAS,CAA/B,CAAA,CAAA;EAEA,MAAME,WAAW,GAAI,CAAOD,KAAAA,EAAAA,SAAU,CAAtC,CAAA,CAAA;EACA,MAAME,YAAY,GAAI,CAAQF,MAAAA,EAAAA,SAAU,CAAxC,CAAA,CAAA;EACA,MAAMG,eAAe,GAAG,MAAxB,CAAA;EACA,MAAMC,eAAe,GAAG,MAAxB,CAAA;EAEA;EACA;EACA;;EAEA,MAAMC,KAAN,SAAoBC,8BAApB,CAAkC;EAChC;EACe,EAAA,WAAJR,IAAI,GAAG;EAChB,IAAA,OAAOA,IAAP,CAAA;EACD,GAJ+B;;;EAOhCS,EAAAA,KAAK,GAAG;MACN,MAAMC,UAAU,GAAGC,6BAAY,CAACC,OAAb,CAAqB,IAAKC,CAAAA,QAA1B,EAAoCV,WAApC,CAAnB,CAAA;;MAEA,IAAIO,UAAU,CAACI,gBAAf,EAAiC;EAC/B,MAAA,OAAA;EACD,KAAA;;EAED,IAAA,IAAA,CAAKD,QAAL,CAAcE,SAAd,CAAwBC,MAAxB,CAA+BV,eAA/B,CAAA,CAAA;;MAEA,MAAMW,UAAU,GAAG,IAAA,CAAKJ,QAAL,CAAcE,SAAd,CAAwBG,QAAxB,CAAiCb,eAAjC,CAAnB,CAAA;;MACA,IAAKc,CAAAA,cAAL,CAAoB,MAAM,IAAKC,CAAAA,eAAL,EAA1B,EAAkD,IAAA,CAAKP,QAAvD,EAAiEI,UAAjE,CAAA,CAAA;EACD,GAlB+B;;;EAqBhCG,EAAAA,eAAe,GAAG;MAChB,IAAKP,CAAAA,QAAL,CAAcG,MAAd,EAAA,CAAA;;EACAL,IAAAA,6BAAY,CAACC,OAAb,CAAqB,IAAKC,CAAAA,QAA1B,EAAoCT,YAApC,CAAA,CAAA;EACA,IAAA,IAAA,CAAKiB,OAAL,EAAA,CAAA;EACD,GAzB+B;;;IA4BV,OAAfC,eAAe,CAACC,MAAD,EAAS;MAC7B,OAAO,IAAA,CAAKC,IAAL,CAAU,YAAY;EAC3B,MAAA,MAAMC,IAAI,GAAGlB,KAAK,CAACmB,mBAAN,CAA0B,IAA1B,CAAb,CAAA;;EAEA,MAAA,IAAI,OAAOH,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,QAAA,OAAA;EACD,OAAA;;EAED,MAAA,IAAIE,IAAI,CAACF,MAAD,CAAJ,KAAiBI,SAAjB,IAA8BJ,MAAM,CAACK,UAAP,CAAkB,GAAlB,CAA9B,IAAwDL,MAAM,KAAK,aAAvE,EAAsF;EACpF,QAAA,MAAM,IAAIM,SAAJ,CAAe,CAAmBN,iBAAAA,EAAAA,MAAO,GAAzC,CAAN,CAAA;EACD,OAAA;;EAEDE,MAAAA,IAAI,CAACF,MAAD,CAAJ,CAAa,IAAb,CAAA,CAAA;EACD,KAZM,CAAP,CAAA;EAaD,GAAA;;EA1C+B,CAAA;EA6ClC;EACA;EACA;;;AAEAO,yCAAoB,CAACvB,KAAD,EAAQ,OAAR,CAApB,CAAA;EAEA;EACA;EACA;;AAEAwB,0BAAkB,CAACxB,KAAD,CAAlB;;;;;;;;"} {"version":3,"file":"alert.js","sources":["../src/alert.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n"],"names":["NAME","DATA_KEY","EVENT_KEY","EVENT_CLOSE","EVENT_CLOSED","CLASS_NAME_FADE","CLASS_NAME_SHOW","Alert","BaseComponent","close","closeEvent","EventHandler","trigger","_element","defaultPrevented","classList","remove","isAnimated","contains","_queueCallback","_destroyElement","dispose","jQueryInterface","config","each","data","getOrCreateInstance","undefined","startsWith","TypeError","enableDismissTrigger","defineJQueryPlugin"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;;EAOA;EACA;EACA;;EAEA,MAAMA,IAAI,GAAG,OAAO,CAAA;EACpB,MAAMC,QAAQ,GAAG,UAAU,CAAA;EAC3B,MAAMC,SAAS,GAAI,CAAGD,CAAAA,EAAAA,QAAS,CAAC,CAAA,CAAA;EAEhC,MAAME,WAAW,GAAI,CAAOD,KAAAA,EAAAA,SAAU,CAAC,CAAA,CAAA;EACvC,MAAME,YAAY,GAAI,CAAQF,MAAAA,EAAAA,SAAU,CAAC,CAAA,CAAA;EACzC,MAAMG,eAAe,GAAG,MAAM,CAAA;EAC9B,MAAMC,eAAe,GAAG,MAAM,CAAA;;EAE9B;EACA;EACA;;EAEA,MAAMC,KAAK,SAASC,aAAa,CAAC;EAChC;IACA,WAAWR,IAAIA,GAAG;EAChB,IAAA,OAAOA,IAAI,CAAA;EACb,GAAA;;EAEA;EACAS,EAAAA,KAAKA,GAAG;MACN,MAAMC,UAAU,GAAGC,YAAY,CAACC,OAAO,CAAC,IAAI,CAACC,QAAQ,EAAEV,WAAW,CAAC,CAAA;MAEnE,IAAIO,UAAU,CAACI,gBAAgB,EAAE;EAC/B,MAAA,OAAA;EACF,KAAA;MAEA,IAAI,CAACD,QAAQ,CAACE,SAAS,CAACC,MAAM,CAACV,eAAe,CAAC,CAAA;MAE/C,MAAMW,UAAU,GAAG,IAAI,CAACJ,QAAQ,CAACE,SAAS,CAACG,QAAQ,CAACb,eAAe,CAAC,CAAA;EACpE,IAAA,IAAI,CAACc,cAAc,CAAC,MAAM,IAAI,CAACC,eAAe,EAAE,EAAE,IAAI,CAACP,QAAQ,EAAEI,UAAU,CAAC,CAAA;EAC9E,GAAA;;EAEA;EACAG,EAAAA,eAAeA,GAAG;EAChB,IAAA,IAAI,CAACP,QAAQ,CAACG,MAAM,EAAE,CAAA;MACtBL,YAAY,CAACC,OAAO,CAAC,IAAI,CAACC,QAAQ,EAAET,YAAY,CAAC,CAAA;MACjD,IAAI,CAACiB,OAAO,EAAE,CAAA;EAChB,GAAA;;EAEA;IACA,OAAOC,eAAeA,CAACC,MAAM,EAAE;EAC7B,IAAA,OAAO,IAAI,CAACC,IAAI,CAAC,YAAY;EAC3B,MAAA,MAAMC,IAAI,GAAGlB,KAAK,CAACmB,mBAAmB,CAAC,IAAI,CAAC,CAAA;EAE5C,MAAA,IAAI,OAAOH,MAAM,KAAK,QAAQ,EAAE;EAC9B,QAAA,OAAA;EACF,OAAA;EAEA,MAAA,IAAIE,IAAI,CAACF,MAAM,CAAC,KAAKI,SAAS,IAAIJ,MAAM,CAACK,UAAU,CAAC,GAAG,CAAC,IAAIL,MAAM,KAAK,aAAa,EAAE;EACpF,QAAA,MAAM,IAAIM,SAAS,CAAE,CAAmBN,iBAAAA,EAAAA,MAAO,GAAE,CAAC,CAAA;EACpD,OAAA;EAEAE,MAAAA,IAAI,CAACF,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;EACpB,KAAC,CAAC,CAAA;EACJ,GAAA;EACF,CAAA;;EAEA;EACA;EACA;;AAEAO,4CAAoB,CAACvB,KAAK,EAAE,OAAO,CAAC,CAAA;;EAEpC;EACA;EACA;;AAEAwB,6BAAkB,CAACxB,KAAK,CAAC;;;;;;;;"}

View File

@ -1,108 +1,93 @@
/*! /*!
* Bootstrap base-component.js v5.2.3 (https://getbootstrap.com/) * Bootstrap base-component.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./dom/data'), require('./dom/data.js'),
require('./util/index'), require('./dom/event-handler.js'),
require('./dom/event-handler'), require('./util/config.js'),
require('./util/config') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['./dom/data', './util/index', './dom/event-handler', './util/config'], factory) ? define(['./dom/data', './dom/event-handler', './util/config', './util/index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.BaseComponent = factory( (global.BaseComponent = factory(
global.Data, global.Data,
global.Index,
global.EventHandler, global.EventHandler,
global.Config global.Config,
global.Index
))); )));
})(this, function (Data, index, EventHandler, Config) { })(this, function (Data, EventHandler, Config, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const Data__default = /*#__PURE__*/ _interopDefaultLegacy(Data);
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const Config__default = /*#__PURE__*/ _interopDefaultLegacy(Config);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): base-component.js * Bootstrap base-component.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
const VERSION = '5.2.3'; const VERSION = '5.3.2';
/** /**
* Class definition * Class definition
*/ */
class BaseComponent extends Config__default.default { class BaseComponent extends Config {
constructor(element, config) { constructor(element, config) {
super(); super();
element = index.getElement(element); element = index_js.getElement(element);
if (!element) { if (!element) {
return; return;
} }
this._element = element; this._element = element;
this._config = this._getConfig(config); this._config = this._getConfig(config);
Data__default.default.set(this._element, this.constructor.DATA_KEY, this); Data.set(this._element, this.constructor.DATA_KEY, this);
} // Public }
// Public
dispose() { dispose() {
Data__default.default.remove(this._element, this.constructor.DATA_KEY); Data.remove(this._element, this.constructor.DATA_KEY);
EventHandler__default.default.off(this._element, this.constructor.EVENT_KEY); EventHandler.off(this._element, this.constructor.EVENT_KEY);
for (const propertyName of Object.getOwnPropertyNames(this)) { for (const propertyName of Object.getOwnPropertyNames(this)) {
this[propertyName] = null; this[propertyName] = null;
} }
} }
_queueCallback(callback, element, isAnimated = true) { _queueCallback(callback, element, isAnimated = true) {
index.executeAfterTransition(callback, element, isAnimated); index_js.executeAfterTransition(callback, element, isAnimated);
} }
_getConfig(config) { _getConfig(config) {
config = this._mergeConfigObj(config, this._element); config = this._mergeConfigObj(config, this._element);
config = this._configAfterMerge(config); config = this._configAfterMerge(config);
this._typeCheckConfig(config); this._typeCheckConfig(config);
return config; return config;
} // Static
static getInstance(element) {
return Data__default.default.get(index.getElement(element), this.DATA_KEY);
} }
// Static
static getInstance(element) {
return Data.get(index_js.getElement(element), this.DATA_KEY);
}
static getOrCreateInstance(element, config = {}) { static getOrCreateInstance(element, config = {}) {
return ( return (
this.getInstance(element) || new this(element, typeof config === 'object' ? config : null) this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)
); );
} }
static get VERSION() { static get VERSION() {
return VERSION; return VERSION;
} }
static get DATA_KEY() { static get DATA_KEY() {
return `bs.${this.NAME}`; return `bs.${this.NAME}`;
} }
static get EVENT_KEY() { static get EVENT_KEY() {
return `.${this.DATA_KEY}`; return `.${this.DATA_KEY}`;
} }
static eventName(name) { static eventName(name) {
return `${name}${this.EVENT_KEY}`; return `${name}${this.EVENT_KEY}`;
} }

View File

@ -1 +1 @@
{"version":3,"file":"base-component.js","sources":["../src/base-component.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\nimport { executeAfterTransition, getElement } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport Config from './util/config'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.2.3'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n"],"names":["VERSION","BaseComponent","Config","constructor","element","config","getElement","_element","_config","_getConfig","Data","set","DATA_KEY","dispose","remove","EventHandler","off","EVENT_KEY","propertyName","Object","getOwnPropertyNames","_queueCallback","callback","isAnimated","executeAfterTransition","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","getInstance","get","getOrCreateInstance","NAME","eventName","name"],"mappings":";;;;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAOA;EACA;EACA;;EAEA,MAAMA,OAAO,GAAG,OAAhB,CAAA;EAEA;EACA;EACA;;EAEA,MAAMC,aAAN,SAA4BC,uBAA5B,CAAmC;EACjCC,EAAAA,WAAW,CAACC,OAAD,EAAUC,MAAV,EAAkB;EAC3B,IAAA,KAAA,EAAA,CAAA;EAEAD,IAAAA,OAAO,GAAGE,gBAAU,CAACF,OAAD,CAApB,CAAA;;MACA,IAAI,CAACA,OAAL,EAAc;EACZ,MAAA,OAAA;EACD,KAAA;;MAED,IAAKG,CAAAA,QAAL,GAAgBH,OAAhB,CAAA;EACA,IAAA,IAAA,CAAKI,OAAL,GAAe,IAAA,CAAKC,UAAL,CAAgBJ,MAAhB,CAAf,CAAA;MAEAK,qBAAI,CAACC,GAAL,CAAS,IAAKJ,CAAAA,QAAd,EAAwB,IAAA,CAAKJ,WAAL,CAAiBS,QAAzC,EAAmD,IAAnD,CAAA,CAAA;EACD,GAbgC;;;EAgBjCC,EAAAA,OAAO,GAAG;MACRH,qBAAI,CAACI,MAAL,CAAY,IAAA,CAAKP,QAAjB,EAA2B,IAAA,CAAKJ,WAAL,CAAiBS,QAA5C,CAAA,CAAA;MACAG,6BAAY,CAACC,GAAb,CAAiB,IAAA,CAAKT,QAAtB,EAAgC,IAAA,CAAKJ,WAAL,CAAiBc,SAAjD,CAAA,CAAA;;MAEA,KAAK,MAAMC,YAAX,IAA2BC,MAAM,CAACC,mBAAP,CAA2B,IAA3B,CAA3B,EAA6D;QAC3D,IAAKF,CAAAA,YAAL,IAAqB,IAArB,CAAA;EACD,KAAA;EACF,GAAA;;IAEDG,cAAc,CAACC,QAAD,EAAWlB,OAAX,EAAoBmB,UAAU,GAAG,IAAjC,EAAuC;EACnDC,IAAAA,4BAAsB,CAACF,QAAD,EAAWlB,OAAX,EAAoBmB,UAApB,CAAtB,CAAA;EACD,GAAA;;IAEDd,UAAU,CAACJ,MAAD,EAAS;MACjBA,MAAM,GAAG,KAAKoB,eAAL,CAAqBpB,MAArB,EAA6B,IAAA,CAAKE,QAAlC,CAAT,CAAA;EACAF,IAAAA,MAAM,GAAG,IAAA,CAAKqB,iBAAL,CAAuBrB,MAAvB,CAAT,CAAA;;MACA,IAAKsB,CAAAA,gBAAL,CAAsBtB,MAAtB,CAAA,CAAA;;EACA,IAAA,OAAOA,MAAP,CAAA;EACD,GAlCgC;;;IAqCf,OAAXuB,WAAW,CAACxB,OAAD,EAAU;MAC1B,OAAOM,qBAAI,CAACmB,GAAL,CAASvB,gBAAU,CAACF,OAAD,CAAnB,EAA8B,IAAKQ,CAAAA,QAAnC,CAAP,CAAA;EACD,GAAA;;EAEyB,EAAA,OAAnBkB,mBAAmB,CAAC1B,OAAD,EAAUC,MAAM,GAAG,EAAnB,EAAuB;EAC/C,IAAA,OAAO,KAAKuB,WAAL,CAAiBxB,OAAjB,CAA6B,IAAA,IAAI,IAAJ,CAASA,OAAT,EAAkB,OAAOC,MAAP,KAAkB,QAAlB,GAA6BA,MAA7B,GAAsC,IAAxD,CAApC,CAAA;EACD,GAAA;;EAEiB,EAAA,WAAPL,OAAO,GAAG;EACnB,IAAA,OAAOA,OAAP,CAAA;EACD,GAAA;;EAEkB,EAAA,WAARY,QAAQ,GAAG;MACpB,OAAQ,CAAA,GAAA,EAAK,IAAKmB,CAAAA,IAAK,CAAvB,CAAA,CAAA;EACD,GAAA;;EAEmB,EAAA,WAATd,SAAS,GAAG;MACrB,OAAQ,CAAA,CAAA,EAAG,IAAKL,CAAAA,QAAS,CAAzB,CAAA,CAAA;EACD,GAAA;;IAEe,OAAToB,SAAS,CAACC,IAAD,EAAO;EACrB,IAAA,OAAQ,CAAEA,EAAAA,IAAK,CAAE,EAAA,IAAA,CAAKhB,SAAU,CAAhC,CAAA,CAAA;EACD,GAAA;;EA3DgC;;;;;;;;"} {"version":3,"file":"base-component.js","sources":["../src/base-component.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n"],"names":["VERSION","BaseComponent","Config","constructor","element","config","getElement","_element","_config","_getConfig","Data","set","DATA_KEY","dispose","remove","EventHandler","off","EVENT_KEY","propertyName","Object","getOwnPropertyNames","_queueCallback","callback","isAnimated","executeAfterTransition","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","getInstance","get","getOrCreateInstance","NAME","eventName","name"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;;EAOA;EACA;EACA;;EAEA,MAAMA,OAAO,GAAG,OAAO,CAAA;;EAEvB;EACA;EACA;;EAEA,MAAMC,aAAa,SAASC,MAAM,CAAC;EACjCC,EAAAA,WAAWA,CAACC,OAAO,EAAEC,MAAM,EAAE;EAC3B,IAAA,KAAK,EAAE,CAAA;EAEPD,IAAAA,OAAO,GAAGE,mBAAU,CAACF,OAAO,CAAC,CAAA;MAC7B,IAAI,CAACA,OAAO,EAAE;EACZ,MAAA,OAAA;EACF,KAAA;MAEA,IAAI,CAACG,QAAQ,GAAGH,OAAO,CAAA;MACvB,IAAI,CAACI,OAAO,GAAG,IAAI,CAACC,UAAU,CAACJ,MAAM,CAAC,CAAA;EAEtCK,IAAAA,IAAI,CAACC,GAAG,CAAC,IAAI,CAACJ,QAAQ,EAAE,IAAI,CAACJ,WAAW,CAACS,QAAQ,EAAE,IAAI,CAAC,CAAA;EAC1D,GAAA;;EAEA;EACAC,EAAAA,OAAOA,GAAG;EACRH,IAAAA,IAAI,CAACI,MAAM,CAAC,IAAI,CAACP,QAAQ,EAAE,IAAI,CAACJ,WAAW,CAACS,QAAQ,CAAC,CAAA;EACrDG,IAAAA,YAAY,CAACC,GAAG,CAAC,IAAI,CAACT,QAAQ,EAAE,IAAI,CAACJ,WAAW,CAACc,SAAS,CAAC,CAAA;MAE3D,KAAK,MAAMC,YAAY,IAAIC,MAAM,CAACC,mBAAmB,CAAC,IAAI,CAAC,EAAE;EAC3D,MAAA,IAAI,CAACF,YAAY,CAAC,GAAG,IAAI,CAAA;EAC3B,KAAA;EACF,GAAA;IAEAG,cAAcA,CAACC,QAAQ,EAAElB,OAAO,EAAEmB,UAAU,GAAG,IAAI,EAAE;EACnDC,IAAAA,+BAAsB,CAACF,QAAQ,EAAElB,OAAO,EAAEmB,UAAU,CAAC,CAAA;EACvD,GAAA;IAEAd,UAAUA,CAACJ,MAAM,EAAE;MACjBA,MAAM,GAAG,IAAI,CAACoB,eAAe,CAACpB,MAAM,EAAE,IAAI,CAACE,QAAQ,CAAC,CAAA;EACpDF,IAAAA,MAAM,GAAG,IAAI,CAACqB,iBAAiB,CAACrB,MAAM,CAAC,CAAA;EACvC,IAAA,IAAI,CAACsB,gBAAgB,CAACtB,MAAM,CAAC,CAAA;EAC7B,IAAA,OAAOA,MAAM,CAAA;EACf,GAAA;;EAEA;IACA,OAAOuB,WAAWA,CAACxB,OAAO,EAAE;EAC1B,IAAA,OAAOM,IAAI,CAACmB,GAAG,CAACvB,mBAAU,CAACF,OAAO,CAAC,EAAE,IAAI,CAACQ,QAAQ,CAAC,CAAA;EACrD,GAAA;IAEA,OAAOkB,mBAAmBA,CAAC1B,OAAO,EAAEC,MAAM,GAAG,EAAE,EAAE;MAC/C,OAAO,IAAI,CAACuB,WAAW,CAACxB,OAAO,CAAC,IAAI,IAAI,IAAI,CAACA,OAAO,EAAE,OAAOC,MAAM,KAAK,QAAQ,GAAGA,MAAM,GAAG,IAAI,CAAC,CAAA;EACnG,GAAA;IAEA,WAAWL,OAAOA,GAAG;EACnB,IAAA,OAAOA,OAAO,CAAA;EAChB,GAAA;IAEA,WAAWY,QAAQA,GAAG;EACpB,IAAA,OAAQ,CAAK,GAAA,EAAA,IAAI,CAACmB,IAAK,CAAC,CAAA,CAAA;EAC1B,GAAA;IAEA,WAAWd,SAASA,GAAG;EACrB,IAAA,OAAQ,CAAG,CAAA,EAAA,IAAI,CAACL,QAAS,CAAC,CAAA,CAAA;EAC5B,GAAA;IAEA,OAAOoB,SAASA,CAACC,IAAI,EAAE;EACrB,IAAA,OAAQ,GAAEA,IAAK,CAAA,EAAE,IAAI,CAAChB,SAAU,CAAC,CAAA,CAAA;EACnC,GAAA;EACF;;;;;;;;"}

View File

@ -1,34 +1,29 @@
/*! /*!
* Bootstrap button.js v5.2.3 (https://getbootstrap.com/) * Bootstrap button.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./base-component') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['./util/index', './dom/event-handler', './base-component'], factory) ? define(['./base-component', './dom/event-handler', './util/index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Button = factory(global.Index, global.EventHandler, global.BaseComponent))); (global.Button = factory(global.BaseComponent, global.EventHandler, global.Index)));
})(this, function (index, EventHandler, BaseComponent) { })(this, function (BaseComponent, EventHandler, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): button.js * Bootstrap button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -40,51 +35,50 @@
const CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]';
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
/** /**
* Class definition * Class definition
*/ */
class Button extends BaseComponent__default.default { class Button extends BaseComponent {
// Getters // Getters
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
toggle() { toggle() {
// Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method // 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)); this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE));
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Button.getOrCreateInstance(this); const data = Button.getOrCreateInstance(this);
if (config === 'toggle') { if (config === 'toggle') {
data[config](); data[config]();
} }
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => {
document, event.preventDefault();
EVENT_CLICK_DATA_API, const button = event.target.closest(SELECTOR_DATA_TOGGLE);
SELECTOR_DATA_TOGGLE, const data = Button.getOrCreateInstance(button);
(event) => { data.toggle();
event.preventDefault(); });
const button = event.target.closest(SELECTOR_DATA_TOGGLE);
const data = Button.getOrCreateInstance(button);
data.toggle();
}
);
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Button); index_js.defineJQueryPlugin(Button);
return Button; return Button;
}); });

View File

@ -1 +1 @@
{"version":3,"file":"button.js","sources":["../src/button.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport EventHandler from './dom/event-handler'\nimport BaseComponent from './base-component'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n"],"names":["NAME","DATA_KEY","EVENT_KEY","DATA_API_KEY","CLASS_NAME_ACTIVE","SELECTOR_DATA_TOGGLE","EVENT_CLICK_DATA_API","Button","BaseComponent","toggle","_element","setAttribute","classList","jQueryInterface","config","each","data","getOrCreateInstance","EventHandler","on","document","event","preventDefault","button","target","closest","defineJQueryPlugin"],"mappings":";;;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAMA;EACA;EACA;;EAEA,MAAMA,IAAI,GAAG,QAAb,CAAA;EACA,MAAMC,QAAQ,GAAG,WAAjB,CAAA;EACA,MAAMC,SAAS,GAAI,CAAGD,CAAAA,EAAAA,QAAS,CAA/B,CAAA,CAAA;EACA,MAAME,YAAY,GAAG,WAArB,CAAA;EAEA,MAAMC,iBAAiB,GAAG,QAA1B,CAAA;EACA,MAAMC,oBAAoB,GAAG,2BAA7B,CAAA;EACA,MAAMC,oBAAoB,GAAI,CAAA,KAAA,EAAOJ,SAAU,CAAA,EAAEC,YAAa,CAA9D,CAAA,CAAA;EAEA;EACA;EACA;;EAEA,MAAMI,MAAN,SAAqBC,8BAArB,CAAmC;EACjC;EACe,EAAA,WAAJR,IAAI,GAAG;EAChB,IAAA,OAAOA,IAAP,CAAA;EACD,GAJgC;;;EAOjCS,EAAAA,MAAM,GAAG;EACP;EACA,IAAA,IAAA,CAAKC,QAAL,CAAcC,YAAd,CAA2B,cAA3B,EAA2C,IAAA,CAAKD,QAAL,CAAcE,SAAd,CAAwBH,MAAxB,CAA+BL,iBAA/B,CAA3C,CAAA,CAAA;EACD,GAVgC;;;IAaX,OAAfS,eAAe,CAACC,MAAD,EAAS;MAC7B,OAAO,IAAA,CAAKC,IAAL,CAAU,YAAY;EAC3B,MAAA,MAAMC,IAAI,GAAGT,MAAM,CAACU,mBAAP,CAA2B,IAA3B,CAAb,CAAA;;QAEA,IAAIH,MAAM,KAAK,QAAf,EAAyB;UACvBE,IAAI,CAACF,MAAD,CAAJ,EAAA,CAAA;EACD,OAAA;EACF,KANM,CAAP,CAAA;EAOD,GAAA;;EArBgC,CAAA;EAwBnC;EACA;EACA;;;AAEAI,+BAAY,CAACC,EAAb,CAAgBC,QAAhB,EAA0Bd,oBAA1B,EAAgDD,oBAAhD,EAAsEgB,KAAK,IAAI;EAC7EA,EAAAA,KAAK,CAACC,cAAN,EAAA,CAAA;IAEA,MAAMC,MAAM,GAAGF,KAAK,CAACG,MAAN,CAAaC,OAAb,CAAqBpB,oBAArB,CAAf,CAAA;EACA,EAAA,MAAMW,IAAI,GAAGT,MAAM,CAACU,mBAAP,CAA2BM,MAA3B,CAAb,CAAA;EAEAP,EAAAA,IAAI,CAACP,MAAL,EAAA,CAAA;EACD,CAPD,CAAA,CAAA;EASA;EACA;EACA;;AAEAiB,0BAAkB,CAACnB,MAAD,CAAlB;;;;;;;;"} {"version":3,"file":"button.js","sources":["../src/button.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n"],"names":["NAME","DATA_KEY","EVENT_KEY","DATA_API_KEY","CLASS_NAME_ACTIVE","SELECTOR_DATA_TOGGLE","EVENT_CLICK_DATA_API","Button","BaseComponent","toggle","_element","setAttribute","classList","jQueryInterface","config","each","data","getOrCreateInstance","EventHandler","on","document","event","preventDefault","button","target","closest","defineJQueryPlugin"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;;EAMA;EACA;EACA;;EAEA,MAAMA,IAAI,GAAG,QAAQ,CAAA;EACrB,MAAMC,QAAQ,GAAG,WAAW,CAAA;EAC5B,MAAMC,SAAS,GAAI,CAAGD,CAAAA,EAAAA,QAAS,CAAC,CAAA,CAAA;EAChC,MAAME,YAAY,GAAG,WAAW,CAAA;EAEhC,MAAMC,iBAAiB,GAAG,QAAQ,CAAA;EAClC,MAAMC,oBAAoB,GAAG,2BAA2B,CAAA;EACxD,MAAMC,oBAAoB,GAAI,CAAA,KAAA,EAAOJ,SAAU,CAAA,EAAEC,YAAa,CAAC,CAAA,CAAA;;EAE/D;EACA;EACA;;EAEA,MAAMI,MAAM,SAASC,aAAa,CAAC;EACjC;IACA,WAAWR,IAAIA,GAAG;EAChB,IAAA,OAAOA,IAAI,CAAA;EACb,GAAA;;EAEA;EACAS,EAAAA,MAAMA,GAAG;EACP;EACA,IAAA,IAAI,CAACC,QAAQ,CAACC,YAAY,CAAC,cAAc,EAAE,IAAI,CAACD,QAAQ,CAACE,SAAS,CAACH,MAAM,CAACL,iBAAiB,CAAC,CAAC,CAAA;EAC/F,GAAA;;EAEA;IACA,OAAOS,eAAeA,CAACC,MAAM,EAAE;EAC7B,IAAA,OAAO,IAAI,CAACC,IAAI,CAAC,YAAY;EAC3B,MAAA,MAAMC,IAAI,GAAGT,MAAM,CAACU,mBAAmB,CAAC,IAAI,CAAC,CAAA;QAE7C,IAAIH,MAAM,KAAK,QAAQ,EAAE;EACvBE,QAAAA,IAAI,CAACF,MAAM,CAAC,EAAE,CAAA;EAChB,OAAA;EACF,KAAC,CAAC,CAAA;EACJ,GAAA;EACF,CAAA;;EAEA;EACA;EACA;;EAEAI,YAAY,CAACC,EAAE,CAACC,QAAQ,EAAEd,oBAAoB,EAAED,oBAAoB,EAAEgB,KAAK,IAAI;IAC7EA,KAAK,CAACC,cAAc,EAAE,CAAA;IAEtB,MAAMC,MAAM,GAAGF,KAAK,CAACG,MAAM,CAACC,OAAO,CAACpB,oBAAoB,CAAC,CAAA;EACzD,EAAA,MAAMW,IAAI,GAAGT,MAAM,CAACU,mBAAmB,CAACM,MAAM,CAAC,CAAA;IAE/CP,IAAI,CAACP,MAAM,EAAE,CAAA;EACf,CAAC,CAAC,CAAA;;EAEF;EACA;EACA;;AAEAiB,6BAAkB,CAACnB,MAAM,CAAC;;;;;;;;"}

View File

@ -1,57 +1,49 @@
/*! /*!
* Bootstrap carousel.js v5.2.3 (https://getbootstrap.com/) * Bootstrap carousel.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./dom/manipulator'), require('./dom/manipulator.js'),
require('./dom/selector-engine'), require('./dom/selector-engine.js'),
require('./util/swipe'), require('./util/index.js'),
require('./base-component') require('./util/swipe.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
[ [
'./util/index', './base-component',
'./dom/event-handler', './dom/event-handler',
'./dom/manipulator', './dom/manipulator',
'./dom/selector-engine', './dom/selector-engine',
'./util/index',
'./util/swipe', './util/swipe',
'./base-component',
], ],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Carousel = factory( (global.Carousel = factory(
global.Index, global.BaseComponent,
global.EventHandler, global.EventHandler,
global.Manipulator, global.Manipulator,
global.SelectorEngine, global.SelectorEngine,
global.Swipe, global.Index,
global.BaseComponent global.Swipe
))); )));
})(this, function (index, EventHandler, Manipulator, SelectorEngine, Swipe, BaseComponent) { })(this, function (BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js, Swipe) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const Swipe__default = /*#__PURE__*/ _interopDefaultLegacy(Swipe);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): carousel.js * Bootstrap carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -111,11 +103,12 @@
touch: 'boolean', touch: 'boolean',
wrap: 'boolean', wrap: 'boolean',
}; };
/** /**
* Class definition * Class definition
*/ */
class Carousel extends BaseComponent__default.default { class Carousel extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); super(element, config);
this._interval = null; this._interval = null;
@ -123,140 +116,110 @@
this._isSliding = false; this._isSliding = false;
this.touchTimeout = null; this.touchTimeout = null;
this._swipeHelper = null; this._swipeHelper = null;
this._indicatorsElement = SelectorEngine__default.default.findOne( this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
SELECTOR_INDICATORS,
this._element
);
this._addEventListeners(); this._addEventListeners();
if (this._config.ride === CLASS_NAME_CAROUSEL) { if (this._config.ride === CLASS_NAME_CAROUSEL) {
this.cycle(); this.cycle();
} }
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
next() { next() {
this._slide(ORDER_NEXT); this._slide(ORDER_NEXT);
} }
nextWhenVisible() { nextWhenVisible() {
// FIXME TODO use `document.visibilityState` // FIXME TODO use `document.visibilityState`
// Don't call next when the page isn't visible // Don't call next when the page isn't visible
// or the carousel or its parent isn't visible // or the carousel or its parent isn't visible
if (!document.hidden && index.isVisible(this._element)) { if (!document.hidden && index_js.isVisible(this._element)) {
this.next(); this.next();
} }
} }
prev() { prev() {
this._slide(ORDER_PREV); this._slide(ORDER_PREV);
} }
pause() { pause() {
if (this._isSliding) { if (this._isSliding) {
index.triggerTransitionEnd(this._element); index_js.triggerTransitionEnd(this._element);
} }
this._clearInterval(); this._clearInterval();
} }
cycle() { cycle() {
this._clearInterval(); this._clearInterval();
this._updateInterval(); this._updateInterval();
this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval); this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
} }
_maybeEnableCycle() { _maybeEnableCycle() {
if (!this._config.ride) { if (!this._config.ride) {
return; return;
} }
if (this._isSliding) { if (this._isSliding) {
EventHandler__default.default.one(this._element, EVENT_SLID, () => this.cycle()); EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
return; return;
} }
this.cycle(); this.cycle();
} }
to(index) { to(index) {
const items = this._getItems(); const items = this._getItems();
if (index > items.length - 1 || index < 0) { if (index > items.length - 1 || index < 0) {
return; return;
} }
if (this._isSliding) { if (this._isSliding) {
EventHandler__default.default.one(this._element, EVENT_SLID, () => this.to(index)); EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
return; return;
} }
const activeIndex = this._getItemIndex(this._getActive()); const activeIndex = this._getItemIndex(this._getActive());
if (activeIndex === index) { if (activeIndex === index) {
return; return;
} }
const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
this._slide(order, items[index]); this._slide(order, items[index]);
} }
dispose() { dispose() {
if (this._swipeHelper) { if (this._swipeHelper) {
this._swipeHelper.dispose(); this._swipeHelper.dispose();
} }
super.dispose(); super.dispose();
} // Private }
// Private
_configAfterMerge(config) { _configAfterMerge(config) {
config.defaultInterval = config.interval; config.defaultInterval = config.interval;
return config; return config;
} }
_addEventListeners() { _addEventListeners() {
if (this._config.keyboard) { if (this._config.keyboard) {
EventHandler__default.default.on(this._element, EVENT_KEYDOWN, (event) => EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
this._keydown(event)
);
} }
if (this._config.pause === 'hover') { if (this._config.pause === 'hover') {
EventHandler__default.default.on(this._element, EVENT_MOUSEENTER, () => this.pause()); EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause());
EventHandler__default.default.on(this._element, EVENT_MOUSELEAVE, () => EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle());
this._maybeEnableCycle()
);
} }
if (this._config.touch && Swipe.isSupported()) {
if (this._config.touch && Swipe__default.default.isSupported()) {
this._addTouchEventListeners(); this._addTouchEventListeners();
} }
} }
_addTouchEventListeners() { _addTouchEventListeners() {
for (const img of SelectorEngine__default.default.find(SELECTOR_ITEM_IMG, this._element)) { for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
EventHandler__default.default.on(img, EVENT_DRAG_START, (event) => event.preventDefault()); EventHandler.on(img, EVENT_DRAG_START, (event) => event.preventDefault());
} }
const endCallBack = () => { const endCallBack = () => {
if (this._config.pause !== 'hover') { if (this._config.pause !== 'hover') {
return; return;
} // If it's a touch-enabled device, mouseenter/leave are fired as }
// If it's a touch-enabled device, mouseenter/leave are fired as
// part of the mouse compatibility events on first tap - the carousel // part of the mouse compatibility events on first tap - the carousel
// would stop cycling until user tapped out of it; // would stop cycling until user tapped out of it;
// here, we listen for touchend, explicitly pause the carousel // here, we listen for touchend, explicitly pause the carousel
@ -265,129 +228,99 @@
// events to fire) we explicitly restart cycling // events to fire) we explicitly restart cycling
this.pause(); this.pause();
if (this.touchTimeout) { if (this.touchTimeout) {
clearTimeout(this.touchTimeout); clearTimeout(this.touchTimeout);
} }
this.touchTimeout = setTimeout( this.touchTimeout = setTimeout(
() => this._maybeEnableCycle(), () => this._maybeEnableCycle(),
TOUCHEVENT_COMPAT_WAIT + this._config.interval TOUCHEVENT_COMPAT_WAIT + this._config.interval
); );
}; };
const swipeConfig = { const swipeConfig = {
leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)), leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)), rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
endCallback: endCallBack, endCallback: endCallBack,
}; };
this._swipeHelper = new Swipe__default.default(this._element, swipeConfig); this._swipeHelper = new Swipe(this._element, swipeConfig);
} }
_keydown(event) { _keydown(event) {
if (/input|textarea/i.test(event.target.tagName)) { if (/input|textarea/i.test(event.target.tagName)) {
return; return;
} }
const direction = KEY_TO_DIRECTION[event.key]; const direction = KEY_TO_DIRECTION[event.key];
if (direction) { if (direction) {
event.preventDefault(); event.preventDefault();
this._slide(this._directionToOrder(direction)); this._slide(this._directionToOrder(direction));
} }
} }
_getItemIndex(element) { _getItemIndex(element) {
return this._getItems().indexOf(element); return this._getItems().indexOf(element);
} }
_setActiveIndicatorElement(index) { _setActiveIndicatorElement(index) {
if (!this._indicatorsElement) { if (!this._indicatorsElement) {
return; return;
} }
const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
const activeIndicator = SelectorEngine__default.default.findOne(
SELECTOR_ACTIVE,
this._indicatorsElement
);
activeIndicator.classList.remove(CLASS_NAME_ACTIVE); activeIndicator.classList.remove(CLASS_NAME_ACTIVE);
activeIndicator.removeAttribute('aria-current'); activeIndicator.removeAttribute('aria-current');
const newActiveIndicator = SelectorEngine__default.default.findOne( const newActiveIndicator = SelectorEngine.findOne(
`[data-bs-slide-to="${index}"]`, `[data-bs-slide-to="${index}"]`,
this._indicatorsElement this._indicatorsElement
); );
if (newActiveIndicator) { if (newActiveIndicator) {
newActiveIndicator.classList.add(CLASS_NAME_ACTIVE); newActiveIndicator.classList.add(CLASS_NAME_ACTIVE);
newActiveIndicator.setAttribute('aria-current', 'true'); newActiveIndicator.setAttribute('aria-current', 'true');
} }
} }
_updateInterval() { _updateInterval() {
const element = this._activeElement || this._getActive(); const element = this._activeElement || this._getActive();
if (!element) { if (!element) {
return; return;
} }
const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
this._config.interval = elementInterval || this._config.defaultInterval; this._config.interval = elementInterval || this._config.defaultInterval;
} }
_slide(order, element = null) { _slide(order, element = null) {
if (this._isSliding) { if (this._isSliding) {
return; return;
} }
const activeElement = this._getActive(); const activeElement = this._getActive();
const isNext = order === ORDER_NEXT; const isNext = order === ORDER_NEXT;
const nextElement = const nextElement =
element || element ||
index.getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap); index_js.getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
if (nextElement === activeElement) { if (nextElement === activeElement) {
return; return;
} }
const nextElementIndex = this._getItemIndex(nextElement); const nextElementIndex = this._getItemIndex(nextElement);
const triggerEvent = (eventName) => { const triggerEvent = (eventName) => {
return EventHandler__default.default.trigger(this._element, eventName, { return EventHandler.trigger(this._element, eventName, {
relatedTarget: nextElement, relatedTarget: nextElement,
direction: this._orderToDirection(order), direction: this._orderToDirection(order),
from: this._getItemIndex(activeElement), from: this._getItemIndex(activeElement),
to: nextElementIndex, to: nextElementIndex,
}); });
}; };
const slideEvent = triggerEvent(EVENT_SLIDE); const slideEvent = triggerEvent(EVENT_SLIDE);
if (slideEvent.defaultPrevented) { if (slideEvent.defaultPrevented) {
return; return;
} }
if (!activeElement || !nextElement) { if (!activeElement || !nextElement) {
// Some weirdness is happening, so we bail // Some weirdness is happening, so we bail
// todo: change tests that use empty divs to avoid this check // TODO: change tests that use empty divs to avoid this check
return; return;
} }
const isCycling = Boolean(this._interval); const isCycling = Boolean(this._interval);
this.pause(); this.pause();
this._isSliding = true; this._isSliding = true;
this._setActiveIndicatorElement(nextElementIndex); this._setActiveIndicatorElement(nextElementIndex);
this._activeElement = nextElement; this._activeElement = nextElement;
const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
nextElement.classList.add(orderClassName); nextElement.classList.add(orderClassName);
index.reflow(nextElement); index_js.reflow(nextElement);
activeElement.classList.add(directionalClassName); activeElement.classList.add(directionalClassName);
nextElement.classList.add(directionalClassName); nextElement.classList.add(directionalClassName);
const completeCallBack = () => { const completeCallBack = () => {
nextElement.classList.remove(directionalClassName, orderClassName); nextElement.classList.remove(directionalClassName, orderClassName);
nextElement.classList.add(CLASS_NAME_ACTIVE); nextElement.classList.add(CLASS_NAME_ACTIVE);
@ -395,120 +328,94 @@
this._isSliding = false; this._isSliding = false;
triggerEvent(EVENT_SLID); triggerEvent(EVENT_SLID);
}; };
this._queueCallback(completeCallBack, activeElement, this._isAnimated()); this._queueCallback(completeCallBack, activeElement, this._isAnimated());
if (isCycling) { if (isCycling) {
this.cycle(); this.cycle();
} }
} }
_isAnimated() { _isAnimated() {
return this._element.classList.contains(CLASS_NAME_SLIDE); return this._element.classList.contains(CLASS_NAME_SLIDE);
} }
_getActive() { _getActive() {
return SelectorEngine__default.default.findOne(SELECTOR_ACTIVE_ITEM, this._element); return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
} }
_getItems() { _getItems() {
return SelectorEngine__default.default.find(SELECTOR_ITEM, this._element); return SelectorEngine.find(SELECTOR_ITEM, this._element);
} }
_clearInterval() { _clearInterval() {
if (this._interval) { if (this._interval) {
clearInterval(this._interval); clearInterval(this._interval);
this._interval = null; this._interval = null;
} }
} }
_directionToOrder(direction) { _directionToOrder(direction) {
if (index.isRTL()) { if (index_js.isRTL()) {
return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
} }
return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
} }
_orderToDirection(order) { _orderToDirection(order) {
if (index.isRTL()) { if (index_js.isRTL()) {
return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
} }
return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Carousel.getOrCreateInstance(this, config); const data = Carousel.getOrCreateInstance(this, config);
if (typeof config === 'number') { if (typeof config === 'number') {
data.to(config); data.to(config);
return; return;
} }
if (typeof config === 'string') { if (typeof config === 'string') {
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
} }
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {
document, const target = SelectorEngine.getElementFromSelector(this);
EVENT_CLICK_DATA_API, if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
SELECTOR_DATA_SLIDE, return;
function (event) {
const target = index.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__default.default.getDataAttribute(this, 'slide') === 'next') {
carousel.next();
carousel._maybeEnableCycle();
return;
}
carousel.prev();
carousel._maybeEnableCycle();
} }
); event.preventDefault();
EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => { const carousel = Carousel.getOrCreateInstance(target);
const carousels = SelectorEngine__default.default.find(SELECTOR_DATA_RIDE); 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) { for (const carousel of carousels) {
Carousel.getOrCreateInstance(carousel); Carousel.getOrCreateInstance(carousel);
} }
}); });
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Carousel); index_js.defineJQueryPlugin(Carousel);
return Carousel; return Carousel;
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,44 +1,38 @@
/*! /*!
* Bootstrap collapse.js v5.2.3 (https://getbootstrap.com/) * Bootstrap collapse.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./dom/selector-engine'), require('./dom/selector-engine.js'),
require('./base-component') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
['./util/index', './dom/event-handler', './dom/selector-engine', './base-component'], ['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Collapse = factory( (global.Collapse = factory(
global.Index, global.BaseComponent,
global.EventHandler, global.EventHandler,
global.SelectorEngine, global.SelectorEngine,
global.BaseComponent global.Index
))); )));
})(this, function (index, EventHandler, SelectorEngine, BaseComponent) { })(this, function (BaseComponent, EventHandler, SelectorEngine, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): collapse.js * Bootstrap collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -70,51 +64,47 @@
parent: '(null|element)', parent: '(null|element)',
toggle: 'boolean', toggle: 'boolean',
}; };
/** /**
* Class definition * Class definition
*/ */
class Collapse extends BaseComponent__default.default { class Collapse extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); super(element, config);
this._isTransitioning = false; this._isTransitioning = false;
this._triggerArray = []; this._triggerArray = [];
const toggleList = SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE); const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
for (const elem of toggleList) { for (const elem of toggleList) {
const selector = index.getSelectorFromElement(elem); const selector = SelectorEngine.getSelectorFromElement(elem);
const filterElement = SelectorEngine__default.default const filterElement = SelectorEngine.find(selector).filter(
.find(selector) (foundElement) => foundElement === this._element
.filter((foundElement) => foundElement === this._element); );
if (selector !== null && filterElement.length) { if (selector !== null && filterElement.length) {
this._triggerArray.push(elem); this._triggerArray.push(elem);
} }
} }
this._initializeChildren(); this._initializeChildren();
if (!this._config.parent) { if (!this._config.parent) {
this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()); this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
} }
if (this._config.toggle) { if (this._config.toggle) {
this.toggle(); this.toggle();
} }
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
toggle() { toggle() {
if (this._isShown()) { if (this._isShown()) {
this.hide(); this.hide();
@ -122,14 +112,13 @@
this.show(); this.show();
} }
} }
show() { show() {
if (this._isTransitioning || this._isShown()) { if (this._isTransitioning || this._isShown()) {
return; return;
} }
let activeChildren = [];
let activeChildren = []; // find active children // find active children
if (this._config.parent) { if (this._config.parent) {
activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES) activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)
.filter((element) => element !== this._element) .filter((element) => element !== this._element)
@ -139,202 +128,147 @@
}) })
); );
} }
if (activeChildren.length && activeChildren[0]._isTransitioning) { if (activeChildren.length && activeChildren[0]._isTransitioning) {
return; return;
} }
const startEvent = EventHandler.trigger(this._element, EVENT_SHOW);
const startEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW);
if (startEvent.defaultPrevented) { if (startEvent.defaultPrevented) {
return; return;
} }
for (const activeInstance of activeChildren) { for (const activeInstance of activeChildren) {
activeInstance.hide(); activeInstance.hide();
} }
const dimension = this._getDimension(); const dimension = this._getDimension();
this._element.classList.remove(CLASS_NAME_COLLAPSE); this._element.classList.remove(CLASS_NAME_COLLAPSE);
this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.classList.add(CLASS_NAME_COLLAPSING);
this._element.style[dimension] = 0; this._element.style[dimension] = 0;
this._addAriaAndCollapsedClass(this._triggerArray, true); this._addAriaAndCollapsedClass(this._triggerArray, true);
this._isTransitioning = true; this._isTransitioning = true;
const complete = () => { const complete = () => {
this._isTransitioning = false; this._isTransitioning = false;
this._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSING);
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
this._element.style[dimension] = ''; this._element.style[dimension] = '';
EventHandler__default.default.trigger(this._element, EVENT_SHOWN); EventHandler.trigger(this._element, EVENT_SHOWN);
}; };
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
const scrollSize = `scroll${capitalizedDimension}`; const scrollSize = `scroll${capitalizedDimension}`;
this._queueCallback(complete, this._element, true); this._queueCallback(complete, this._element, true);
this._element.style[dimension] = `${this._element[scrollSize]}px`; this._element.style[dimension] = `${this._element[scrollSize]}px`;
} }
hide() { hide() {
if (this._isTransitioning || !this._isShown()) { if (this._isTransitioning || !this._isShown()) {
return; return;
} }
const startEvent = EventHandler.trigger(this._element, EVENT_HIDE);
const startEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
if (startEvent.defaultPrevented) { if (startEvent.defaultPrevented) {
return; return;
} }
const dimension = this._getDimension(); const dimension = this._getDimension();
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
index.reflow(this._element); index_js.reflow(this._element);
this._element.classList.add(CLASS_NAME_COLLAPSING); this._element.classList.add(CLASS_NAME_COLLAPSING);
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
for (const trigger of this._triggerArray) { for (const trigger of this._triggerArray) {
const element = index.getElementFromSelector(trigger); const element = SelectorEngine.getElementFromSelector(trigger);
if (element && !this._isShown(element)) { if (element && !this._isShown(element)) {
this._addAriaAndCollapsedClass([trigger], false); this._addAriaAndCollapsedClass([trigger], false);
} }
} }
this._isTransitioning = true; this._isTransitioning = true;
const complete = () => { const complete = () => {
this._isTransitioning = false; this._isTransitioning = false;
this._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSING);
this._element.classList.add(CLASS_NAME_COLLAPSE); this._element.classList.add(CLASS_NAME_COLLAPSE);
EventHandler.trigger(this._element, EVENT_HIDDEN);
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
}; };
this._element.style[dimension] = ''; this._element.style[dimension] = '';
this._queueCallback(complete, this._element, true); this._queueCallback(complete, this._element, true);
} }
_isShown(element = this._element) { _isShown(element = this._element) {
return element.classList.contains(CLASS_NAME_SHOW); return element.classList.contains(CLASS_NAME_SHOW);
} // Private
_configAfterMerge(config) {
config.toggle = Boolean(config.toggle); // Coerce string values
config.parent = index.getElement(config.parent);
return config;
} }
// Private
_configAfterMerge(config) {
config.toggle = Boolean(config.toggle); // Coerce string values
config.parent = index_js.getElement(config.parent);
return config;
}
_getDimension() { _getDimension() {
return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT; return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
} }
_initializeChildren() { _initializeChildren() {
if (!this._config.parent) { if (!this._config.parent) {
return; return;
} }
const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE); const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);
for (const element of children) { for (const element of children) {
const selected = index.getElementFromSelector(element); const selected = SelectorEngine.getElementFromSelector(element);
if (selected) { if (selected) {
this._addAriaAndCollapsedClass([element], this._isShown(selected)); this._addAriaAndCollapsedClass([element], this._isShown(selected));
} }
} }
} }
_getFirstLevelChildren(selector) { _getFirstLevelChildren(selector) {
const children = SelectorEngine__default.default.find( const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
CLASS_NAME_DEEPER_CHILDREN, // remove children if greater depth
this._config.parent return SelectorEngine.find(selector, this._config.parent).filter(
); // remove children if greater depth (element) => !children.includes(element)
);
return SelectorEngine__default.default
.find(selector, this._config.parent)
.filter((element) => !children.includes(element));
} }
_addAriaAndCollapsedClass(triggerArray, isOpen) { _addAriaAndCollapsedClass(triggerArray, isOpen) {
if (!triggerArray.length) { if (!triggerArray.length) {
return; return;
} }
for (const element of triggerArray) { for (const element of triggerArray) {
element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen); element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
element.setAttribute('aria-expanded', isOpen); element.setAttribute('aria-expanded', isOpen);
} }
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
const _config = {}; const _config = {};
if (typeof config === 'string' && /show|hide/.test(config)) { if (typeof config === 'string' && /show|hide/.test(config)) {
_config.toggle = false; _config.toggle = false;
} }
return this.each(function () { return this.each(function () {
const data = Collapse.getOrCreateInstance(this, _config); const data = Collapse.getOrCreateInstance(this, _config);
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
} }
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
document, // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
EVENT_CLICK_DATA_API, if (
SELECTOR_DATA_TOGGLE, event.target.tagName === 'A' ||
function (event) { (event.delegateTarget && event.delegateTarget.tagName === 'A')
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element ) {
if ( event.preventDefault();
event.target.tagName === 'A' ||
(event.delegateTarget && event.delegateTarget.tagName === 'A')
) {
event.preventDefault();
}
const selector = index.getSelectorFromElement(this);
const selectorElements = SelectorEngine__default.default.find(selector);
for (const element of selectorElements) {
Collapse.getOrCreateInstance(element, {
toggle: false,
}).toggle();
}
} }
); for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
Collapse.getOrCreateInstance(element, {
toggle: false,
}).toggle();
}
});
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Collapse); index_js.defineJQueryPlugin(Collapse);
return Collapse; return Collapse;
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
/*! /*!
* Bootstrap data.js v5.2.3 (https://getbootstrap.com/) * Bootstrap data.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
@ -15,7 +15,7 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/data.js * Bootstrap dom/data.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -23,16 +23,17 @@
/** /**
* Constants * Constants
*/ */
const elementMap = new Map(); const elementMap = new Map();
const data = { const data = {
set(element, key, instance) { set(element, key, instance) {
if (!elementMap.has(element)) { if (!elementMap.has(element)) {
elementMap.set(element, new Map()); elementMap.set(element, new Map());
} }
const instanceMap = elementMap.get(element);
const instanceMap = elementMap.get(element); // make it clear we only want one instance per element // make it clear we only want one instance per element
// can be removed later when multiple key/instances are fine to be used // can be removed later when multiple key/instances are fine to be used
if (!instanceMap.has(key) && instanceMap.size !== 0) { if (!instanceMap.has(key) && instanceMap.size !== 0) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.error( console.error(
@ -42,26 +43,22 @@
); );
return; return;
} }
instanceMap.set(key, instance); instanceMap.set(key, instance);
}, },
get(element, key) { get(element, key) {
if (elementMap.has(element)) { if (elementMap.has(element)) {
return elementMap.get(element).get(key) || null; return elementMap.get(element).get(key) || null;
} }
return null; return null;
}, },
remove(element, key) { remove(element, key) {
if (!elementMap.has(element)) { if (!elementMap.has(element)) {
return; return;
} }
const instanceMap = elementMap.get(element); const instanceMap = elementMap.get(element);
instanceMap.delete(key); // free up element references if there are no instances left for an element instanceMap.delete(key);
// free up element references if there are no instances left for an element
if (instanceMap.size === 0) { if (instanceMap.size === 0) {
elementMap.delete(element); elementMap.delete(element);
} }

View File

@ -1 +1 @@
{"version":3,"file":"data.js","sources":["../../src/dom/data.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n"],"names":["elementMap","Map","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EAEA,MAAMA,UAAU,GAAG,IAAIC,GAAJ,EAAnB,CAAA;AAEA,eAAe;EACbC,EAAAA,GAAG,CAACC,OAAD,EAAUC,GAAV,EAAeC,QAAf,EAAyB;EAC1B,IAAA,IAAI,CAACL,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAL,EAA8B;EAC5BH,MAAAA,UAAU,CAACE,GAAX,CAAeC,OAAf,EAAwB,IAAIF,GAAJ,EAAxB,CAAA,CAAA;EACD,KAAA;;MAED,MAAMM,WAAW,GAAGP,UAAU,CAACQ,GAAX,CAAeL,OAAf,CAApB,CAL0B;EAQ1B;;EACA,IAAA,IAAI,CAACI,WAAW,CAACD,GAAZ,CAAgBF,GAAhB,CAAD,IAAyBG,WAAW,CAACE,IAAZ,KAAqB,CAAlD,EAAqD;EACnD;EACAC,MAAAA,OAAO,CAACC,KAAR,CAAe,CAAA,4EAAA,EAA8EC,KAAK,CAACC,IAAN,CAAWN,WAAW,CAACO,IAAZ,EAAX,CAA+B,CAAA,CAA/B,CAAkC,CAA/H,CAAA,CAAA,CAAA,CAAA;EACA,MAAA,OAAA;EACD,KAAA;;EAEDP,IAAAA,WAAW,CAACL,GAAZ,CAAgBE,GAAhB,EAAqBC,QAArB,CAAA,CAAA;KAhBW;;EAmBbG,EAAAA,GAAG,CAACL,OAAD,EAAUC,GAAV,EAAe;EAChB,IAAA,IAAIJ,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAJ,EAA6B;QAC3B,OAAOH,UAAU,CAACQ,GAAX,CAAeL,OAAf,EAAwBK,GAAxB,CAA4BJ,GAA5B,CAAA,IAAoC,IAA3C,CAAA;EACD,KAAA;;EAED,IAAA,OAAO,IAAP,CAAA;KAxBW;;EA2BbW,EAAAA,MAAM,CAACZ,OAAD,EAAUC,GAAV,EAAe;EACnB,IAAA,IAAI,CAACJ,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAL,EAA8B;EAC5B,MAAA,OAAA;EACD,KAAA;;EAED,IAAA,MAAMI,WAAW,GAAGP,UAAU,CAACQ,GAAX,CAAeL,OAAf,CAApB,CAAA;EAEAI,IAAAA,WAAW,CAACS,MAAZ,CAAmBZ,GAAnB,EAPmB;;EAUnB,IAAA,IAAIG,WAAW,CAACE,IAAZ,KAAqB,CAAzB,EAA4B;QAC1BT,UAAU,CAACgB,MAAX,CAAkBb,OAAlB,CAAA,CAAA;EACD,KAAA;EACF,GAAA;;EAxCY,CAAf;;;;;;;;"} {"version":3,"file":"data.js","sources":["../../src/dom/data.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n"],"names":["elementMap","Map","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;;EAEA,MAAMA,UAAU,GAAG,IAAIC,GAAG,EAAE,CAAA;AAE5B,eAAe;EACbC,EAAAA,GAAGA,CAACC,OAAO,EAAEC,GAAG,EAAEC,QAAQ,EAAE;EAC1B,IAAA,IAAI,CAACL,UAAU,CAACM,GAAG,CAACH,OAAO,CAAC,EAAE;QAC5BH,UAAU,CAACE,GAAG,CAACC,OAAO,EAAE,IAAIF,GAAG,EAAE,CAAC,CAAA;EACpC,KAAA;EAEA,IAAA,MAAMM,WAAW,GAAGP,UAAU,CAACQ,GAAG,CAACL,OAAO,CAAC,CAAA;;EAE3C;EACA;EACA,IAAA,IAAI,CAACI,WAAW,CAACD,GAAG,CAACF,GAAG,CAAC,IAAIG,WAAW,CAACE,IAAI,KAAK,CAAC,EAAE;EACnD;EACAC,MAAAA,OAAO,CAACC,KAAK,CAAE,+EAA8EC,KAAK,CAACC,IAAI,CAACN,WAAW,CAACO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,GAAE,CAAC,CAAA;EAClI,MAAA,OAAA;EACF,KAAA;EAEAP,IAAAA,WAAW,CAACL,GAAG,CAACE,GAAG,EAAEC,QAAQ,CAAC,CAAA;KAC/B;EAEDG,EAAAA,GAAGA,CAACL,OAAO,EAAEC,GAAG,EAAE;EAChB,IAAA,IAAIJ,UAAU,CAACM,GAAG,CAACH,OAAO,CAAC,EAAE;EAC3B,MAAA,OAAOH,UAAU,CAACQ,GAAG,CAACL,OAAO,CAAC,CAACK,GAAG,CAACJ,GAAG,CAAC,IAAI,IAAI,CAAA;EACjD,KAAA;EAEA,IAAA,OAAO,IAAI,CAAA;KACZ;EAEDW,EAAAA,MAAMA,CAACZ,OAAO,EAAEC,GAAG,EAAE;EACnB,IAAA,IAAI,CAACJ,UAAU,CAACM,GAAG,CAACH,OAAO,CAAC,EAAE;EAC5B,MAAA,OAAA;EACF,KAAA;EAEA,IAAA,MAAMI,WAAW,GAAGP,UAAU,CAACQ,GAAG,CAACL,OAAO,CAAC,CAAA;EAE3CI,IAAAA,WAAW,CAACS,MAAM,CAACZ,GAAG,CAAC,CAAA;;EAEvB;EACA,IAAA,IAAIG,WAAW,CAACE,IAAI,KAAK,CAAC,EAAE;EAC1BT,MAAAA,UAAU,CAACgB,MAAM,CAACb,OAAO,CAAC,CAAA;EAC5B,KAAA;EACF,GAAA;EACF,CAAC;;;;;;;;"}

View File

@ -1,24 +1,25 @@
/*! /*!
* Bootstrap event-handler.js v5.2.3 (https://getbootstrap.com/) * Bootstrap event-handler.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory(require('../util/index'))) ? (module.exports = factory(require('../util/index.js')))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['../util/index'], factory) ? define(['../util/index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.EventHandler = factory(global.Index))); (global.EventHandler = factory(global.Index)));
})(this, function (index) { })(this, function (index_js) {
'use strict'; 'use strict';
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/event-handler.js * Bootstrap dom/event-handler.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -27,7 +28,6 @@
const stripNameRegex = /\..*/; const stripNameRegex = /\..*/;
const stripUidRegex = /::\d+$/; const stripUidRegex = /::\d+$/;
const eventRegistry = {}; // Events storage const eventRegistry = {}; // Events storage
let uidEvent = 1; let uidEvent = 1;
const customEvents = { const customEvents = {
mouseenter: 'mouseover', mouseenter: 'mouseover',
@ -81,6 +81,7 @@
'abort', 'abort',
'scroll', 'scroll',
]); ]);
/** /**
* Private methods * Private methods
*/ */
@ -88,83 +89,69 @@
function makeEventUid(element, uid) { function makeEventUid(element, uid) {
return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++; return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++;
} }
function getElementEvents(element) { function getElementEvents(element) {
const uid = makeEventUid(element); const uid = makeEventUid(element);
element.uidEvent = uid; element.uidEvent = uid;
eventRegistry[uid] = eventRegistry[uid] || {}; eventRegistry[uid] = eventRegistry[uid] || {};
return eventRegistry[uid]; return eventRegistry[uid];
} }
function bootstrapHandler(element, fn) { function bootstrapHandler(element, fn) {
return function handler(event) { return function handler(event) {
hydrateObj(event, { hydrateObj(event, {
delegateTarget: element, delegateTarget: element,
}); });
if (handler.oneOff) { if (handler.oneOff) {
EventHandler.off(element, event.type, fn); EventHandler.off(element, event.type, fn);
} }
return fn.apply(element, [event]); return fn.apply(element, [event]);
}; };
} }
function bootstrapDelegationHandler(element, selector, fn) { function bootstrapDelegationHandler(element, selector, fn) {
return function handler(event) { return function handler(event) {
const domElements = element.querySelectorAll(selector); const domElements = element.querySelectorAll(selector);
for (let { target } = event; target && target !== this; target = target.parentNode) { for (let { target } = event; target && target !== this; target = target.parentNode) {
for (const domElement of domElements) { for (const domElement of domElements) {
if (domElement !== target) { if (domElement !== target) {
continue; continue;
} }
hydrateObj(event, { hydrateObj(event, {
delegateTarget: target, delegateTarget: target,
}); });
if (handler.oneOff) { if (handler.oneOff) {
EventHandler.off(element, event.type, selector, fn); EventHandler.off(element, event.type, selector, fn);
} }
return fn.apply(target, [event]); return fn.apply(target, [event]);
} }
} }
}; };
} }
function findHandler(events, callable, delegationSelector = null) { function findHandler(events, callable, delegationSelector = null) {
return Object.values(events).find( return Object.values(events).find(
(event) => event.callable === callable && event.delegationSelector === delegationSelector (event) => event.callable === callable && event.delegationSelector === delegationSelector
); );
} }
function normalizeParameters(originalTypeEvent, handler, delegationFunction) { function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check const isDelegated = typeof handler === 'string';
// TODO: tooltip passes `false` instead of selector, so we need to check
const callable = isDelegated ? delegationFunction : handler || delegationFunction; const callable = isDelegated ? delegationFunction : handler || delegationFunction;
let typeEvent = getTypeEvent(originalTypeEvent); let typeEvent = getTypeEvent(originalTypeEvent);
if (!nativeEvents.has(typeEvent)) { if (!nativeEvents.has(typeEvent)) {
typeEvent = originalTypeEvent; typeEvent = originalTypeEvent;
} }
return [isDelegated, callable, typeEvent]; return [isDelegated, callable, typeEvent];
} }
function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) { function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
if (typeof originalTypeEvent !== 'string' || !element) { if (typeof originalTypeEvent !== 'string' || !element) {
return; return;
} }
let [isDelegated, callable, typeEvent] = normalizeParameters( let [isDelegated, callable, typeEvent] = normalizeParameters(
originalTypeEvent, originalTypeEvent,
handler, handler,
delegationFunction 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
// 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) { if (originalTypeEvent in customEvents) {
const wrapFunction = (fn) => { const wrapFunction = (fn) => {
return function (event) { return function (event) {
@ -177,19 +164,15 @@
} }
}; };
}; };
callable = wrapFunction(callable); callable = wrapFunction(callable);
} }
const events = getElementEvents(element); const events = getElementEvents(element);
const handlers = events[typeEvent] || (events[typeEvent] = {}); const handlers = events[typeEvent] || (events[typeEvent] = {});
const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null); const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
if (previousFunction) { if (previousFunction) {
previousFunction.oneOff = previousFunction.oneOff && oneOff; previousFunction.oneOff = previousFunction.oneOff && oneOff;
return; return;
} }
const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, '')); const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));
const fn = isDelegated const fn = isDelegated
? bootstrapDelegationHandler(element, handler, callable) ? bootstrapDelegationHandler(element, handler, callable)
@ -201,49 +184,38 @@
handlers[uid] = fn; handlers[uid] = fn;
element.addEventListener(typeEvent, fn, isDelegated); element.addEventListener(typeEvent, fn, isDelegated);
} }
function removeHandler(element, events, typeEvent, handler, delegationSelector) { function removeHandler(element, events, typeEvent, handler, delegationSelector) {
const fn = findHandler(events[typeEvent], handler, delegationSelector); const fn = findHandler(events[typeEvent], handler, delegationSelector);
if (!fn) { if (!fn) {
return; return;
} }
element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
delete events[typeEvent][fn.uidEvent]; delete events[typeEvent][fn.uidEvent];
} }
function removeNamespacedHandlers(element, events, typeEvent, namespace) { function removeNamespacedHandlers(element, events, typeEvent, namespace) {
const storeElementEvent = events[typeEvent] || {}; const storeElementEvent = events[typeEvent] || {};
for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
for (const handlerKey of Object.keys(storeElementEvent)) {
if (handlerKey.includes(namespace)) { if (handlerKey.includes(namespace)) {
const event = storeElementEvent[handlerKey];
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
} }
} }
} }
function getTypeEvent(event) { function getTypeEvent(event) {
// allow to get the native events from namespaced events ('click.bs.button' --> 'click') // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
event = event.replace(stripNameRegex, ''); event = event.replace(stripNameRegex, '');
return customEvents[event] || event; return customEvents[event] || event;
} }
const EventHandler = { const EventHandler = {
on(element, event, handler, delegationFunction) { on(element, event, handler, delegationFunction) {
addHandler(element, event, handler, delegationFunction, false); addHandler(element, event, handler, delegationFunction, false);
}, },
one(element, event, handler, delegationFunction) { one(element, event, handler, delegationFunction) {
addHandler(element, event, handler, delegationFunction, true); addHandler(element, event, handler, delegationFunction, true);
}, },
off(element, originalTypeEvent, handler, delegationFunction) { off(element, originalTypeEvent, handler, delegationFunction) {
if (typeof originalTypeEvent !== 'string' || !element) { if (typeof originalTypeEvent !== 'string' || !element) {
return; return;
} }
const [isDelegated, callable, typeEvent] = normalizeParameters( const [isDelegated, callable, typeEvent] = normalizeParameters(
originalTypeEvent, originalTypeEvent,
handler, handler,
@ -253,46 +225,37 @@
const events = getElementEvents(element); const events = getElementEvents(element);
const storeElementEvent = events[typeEvent] || {}; const storeElementEvent = events[typeEvent] || {};
const isNamespace = originalTypeEvent.startsWith('.'); const isNamespace = originalTypeEvent.startsWith('.');
if (typeof callable !== 'undefined') { if (typeof callable !== 'undefined') {
// Simplest case: handler is passed, remove that listener ONLY. // Simplest case: handler is passed, remove that listener ONLY.
if (!Object.keys(storeElementEvent).length) { if (!Object.keys(storeElementEvent).length) {
return; return;
} }
removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null); removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
return; return;
} }
if (isNamespace) { if (isNamespace) {
for (const elementEvent of Object.keys(events)) { for (const elementEvent of Object.keys(events)) {
removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
} }
} }
for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
for (const keyHandlers of Object.keys(storeElementEvent)) {
const handlerKey = keyHandlers.replace(stripUidRegex, ''); const handlerKey = keyHandlers.replace(stripUidRegex, '');
if (!inNamespace || originalTypeEvent.includes(handlerKey)) { if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
const event = storeElementEvent[keyHandlers];
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
} }
} }
}, },
trigger(element, event, args) { trigger(element, event, args) {
if (typeof event !== 'string' || !element) { if (typeof event !== 'string' || !element) {
return null; return null;
} }
const $ = index_js.getjQuery();
const $ = index.getjQuery();
const typeEvent = getTypeEvent(event); const typeEvent = getTypeEvent(event);
const inNamespace = event !== typeEvent; const inNamespace = event !== typeEvent;
let jQueryEvent = null; let jQueryEvent = null;
let bubbles = true; let bubbles = true;
let nativeDispatch = true; let nativeDispatch = true;
let defaultPrevented = false; let defaultPrevented = false;
if (inNamespace && $) { if (inNamespace && $) {
jQueryEvent = $.Event(event, args); jQueryEvent = $.Event(event, args);
$(element).trigger(jQueryEvent); $(element).trigger(jQueryEvent);
@ -300,44 +263,38 @@
nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
defaultPrevented = jQueryEvent.isDefaultPrevented(); defaultPrevented = jQueryEvent.isDefaultPrevented();
} }
const evt = hydrateObj(
let evt = new Event(event, { new Event(event, {
bubbles, bubbles,
cancelable: true, cancelable: true,
}); }),
evt = hydrateObj(evt, args); args
);
if (defaultPrevented) { if (defaultPrevented) {
evt.preventDefault(); evt.preventDefault();
} }
if (nativeDispatch) { if (nativeDispatch) {
element.dispatchEvent(evt); element.dispatchEvent(evt);
} }
if (evt.defaultPrevented && jQueryEvent) { if (evt.defaultPrevented && jQueryEvent) {
jQueryEvent.preventDefault(); jQueryEvent.preventDefault();
} }
return evt; return evt;
}, },
}; };
function hydrateObj(obj, meta = {}) {
function hydrateObj(obj, meta) { for (const [key, value] of Object.entries(meta)) {
for (const [key, value] of Object.entries(meta || {})) {
try { try {
obj[key] = value; obj[key] = value;
} catch (_unused) { } catch (_unused) {
Object.defineProperty(obj, key, { Object.defineProperty(obj, key, {
configurable: true, configurable: true,
get() { get() {
return value; return value;
}, },
}); });
} }
} }
return obj; return obj;
} }

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
/*! /*!
* Bootstrap manipulator.js v5.2.3 (https://getbootstrap.com/) * Bootstrap manipulator.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
@ -15,70 +15,58 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/manipulator.js * Bootstrap dom/manipulator.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
function normalizeData(value) { function normalizeData(value) {
if (value === 'true') { if (value === 'true') {
return true; return true;
} }
if (value === 'false') { if (value === 'false') {
return false; return false;
} }
if (value === Number(value).toString()) { if (value === Number(value).toString()) {
return Number(value); return Number(value);
} }
if (value === '' || value === 'null') { if (value === '' || value === 'null') {
return null; return null;
} }
if (typeof value !== 'string') { if (typeof value !== 'string') {
return value; return value;
} }
try { try {
return JSON.parse(decodeURIComponent(value)); return JSON.parse(decodeURIComponent(value));
} catch (_unused) { } catch (_unused) {
return value; return value;
} }
} }
function normalizeDataKey(key) { function normalizeDataKey(key) {
return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`); return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
} }
const Manipulator = { const Manipulator = {
setDataAttribute(element, key, value) { setDataAttribute(element, key, value) {
element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
}, },
removeDataAttribute(element, key) { removeDataAttribute(element, key) {
element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
}, },
getDataAttributes(element) { getDataAttributes(element) {
if (!element) { if (!element) {
return {}; return {};
} }
const attributes = {}; const attributes = {};
const bsKeys = Object.keys(element.dataset).filter( const bsKeys = Object.keys(element.dataset).filter(
(key) => key.startsWith('bs') && !key.startsWith('bsConfig') (key) => key.startsWith('bs') && !key.startsWith('bsConfig')
); );
for (const key of bsKeys) { for (const key of bsKeys) {
let pureKey = key.replace(/^bs/, ''); let pureKey = key.replace(/^bs/, '');
pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
attributes[pureKey] = normalizeData(element.dataset[key]); attributes[pureKey] = normalizeData(element.dataset[key]);
} }
return attributes; return attributes;
}, },
getDataAttribute(element, key) { getDataAttribute(element, key) {
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
}, },

View File

@ -1 +1 @@
{"version":3,"file":"manipulator.js","sources":["../../src/dom/manipulator.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n"],"names":["normalizeData","value","Number","toString","JSON","parse","decodeURIComponent","normalizeDataKey","key","replace","chr","toLowerCase","Manipulator","setDataAttribute","element","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","Object","keys","dataset","filter","startsWith","pureKey","charAt","slice","length","getDataAttribute","getAttribute"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAEA,SAASA,aAAT,CAAuBC,KAAvB,EAA8B;IAC5B,IAAIA,KAAK,KAAK,MAAd,EAAsB;EACpB,IAAA,OAAO,IAAP,CAAA;EACD,GAAA;;IAED,IAAIA,KAAK,KAAK,OAAd,EAAuB;EACrB,IAAA,OAAO,KAAP,CAAA;EACD,GAAA;;IAED,IAAIA,KAAK,KAAKC,MAAM,CAACD,KAAD,CAAN,CAAcE,QAAd,EAAd,EAAwC;MACtC,OAAOD,MAAM,CAACD,KAAD,CAAb,CAAA;EACD,GAAA;;EAED,EAAA,IAAIA,KAAK,KAAK,EAAV,IAAgBA,KAAK,KAAK,MAA9B,EAAsC;EACpC,IAAA,OAAO,IAAP,CAAA;EACD,GAAA;;EAED,EAAA,IAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;EAC7B,IAAA,OAAOA,KAAP,CAAA;EACD,GAAA;;IAED,IAAI;MACF,OAAOG,IAAI,CAACC,KAAL,CAAWC,kBAAkB,CAACL,KAAD,CAA7B,CAAP,CAAA;EACD,GAFD,CAEE,OAAM,OAAA,EAAA;EACN,IAAA,OAAOA,KAAP,CAAA;EACD,GAAA;EACF,CAAA;;EAED,SAASM,gBAAT,CAA0BC,GAA1B,EAA+B;EAC7B,EAAA,OAAOA,GAAG,CAACC,OAAJ,CAAY,QAAZ,EAAsBC,GAAG,IAAK,CAAA,CAAA,EAAGA,GAAG,CAACC,WAAJ,EAAkB,EAAnD,CAAP,CAAA;EACD,CAAA;;AAED,QAAMC,WAAW,GAAG;EAClBC,EAAAA,gBAAgB,CAACC,OAAD,EAAUN,GAAV,EAAeP,KAAf,EAAsB;MACpCa,OAAO,CAACC,YAAR,CAAsB,CAAUR,QAAAA,EAAAA,gBAAgB,CAACC,GAAD,CAAM,CAAtD,CAAA,EAAyDP,KAAzD,CAAA,CAAA;KAFgB;;EAKlBe,EAAAA,mBAAmB,CAACF,OAAD,EAAUN,GAAV,EAAe;MAChCM,OAAO,CAACG,eAAR,CAAyB,CAAA,QAAA,EAAUV,gBAAgB,CAACC,GAAD,CAAM,CAAzD,CAAA,CAAA,CAAA;KANgB;;IASlBU,iBAAiB,CAACJ,OAAD,EAAU;MACzB,IAAI,CAACA,OAAL,EAAc;EACZ,MAAA,OAAO,EAAP,CAAA;EACD,KAAA;;MAED,MAAMK,UAAU,GAAG,EAAnB,CAAA;MACA,MAAMC,MAAM,GAAGC,MAAM,CAACC,IAAP,CAAYR,OAAO,CAACS,OAApB,CAA6BC,CAAAA,MAA7B,CAAoChB,GAAG,IAAIA,GAAG,CAACiB,UAAJ,CAAe,IAAf,CAAwB,IAAA,CAACjB,GAAG,CAACiB,UAAJ,CAAe,UAAf,CAApE,CAAf,CAAA;;EAEA,IAAA,KAAK,MAAMjB,GAAX,IAAkBY,MAAlB,EAA0B;QACxB,IAAIM,OAAO,GAAGlB,GAAG,CAACC,OAAJ,CAAY,KAAZ,EAAmB,EAAnB,CAAd,CAAA;EACAiB,MAAAA,OAAO,GAAGA,OAAO,CAACC,MAAR,CAAe,CAAf,EAAkBhB,WAAlB,EAAA,GAAkCe,OAAO,CAACE,KAAR,CAAc,CAAd,EAAiBF,OAAO,CAACG,MAAzB,CAA5C,CAAA;EACAV,MAAAA,UAAU,CAACO,OAAD,CAAV,GAAsB1B,aAAa,CAACc,OAAO,CAACS,OAAR,CAAgBf,GAAhB,CAAD,CAAnC,CAAA;EACD,KAAA;;EAED,IAAA,OAAOW,UAAP,CAAA;KAvBgB;;EA0BlBW,EAAAA,gBAAgB,CAAChB,OAAD,EAAUN,GAAV,EAAe;EAC7B,IAAA,OAAOR,aAAa,CAACc,OAAO,CAACiB,YAAR,CAAsB,CAAUxB,QAAAA,EAAAA,gBAAgB,CAACC,GAAD,CAAM,CAAA,CAAtD,CAAD,CAApB,CAAA;EACD,GAAA;;EA5BiB;;;;;;;;"} {"version":3,"file":"manipulator.js","sources":["../../src/dom/manipulator.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n"],"names":["normalizeData","value","Number","toString","JSON","parse","decodeURIComponent","_unused","normalizeDataKey","key","replace","chr","toLowerCase","Manipulator","setDataAttribute","element","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","Object","keys","dataset","filter","startsWith","pureKey","charAt","slice","length","getDataAttribute","getAttribute"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA,SAASA,aAAaA,CAACC,KAAK,EAAE;IAC5B,IAAIA,KAAK,KAAK,MAAM,EAAE;EACpB,IAAA,OAAO,IAAI,CAAA;EACb,GAAA;IAEA,IAAIA,KAAK,KAAK,OAAO,EAAE;EACrB,IAAA,OAAO,KAAK,CAAA;EACd,GAAA;IAEA,IAAIA,KAAK,KAAKC,MAAM,CAACD,KAAK,CAAC,CAACE,QAAQ,EAAE,EAAE;MACtC,OAAOD,MAAM,CAACD,KAAK,CAAC,CAAA;EACtB,GAAA;EAEA,EAAA,IAAIA,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAK,MAAM,EAAE;EACpC,IAAA,OAAO,IAAI,CAAA;EACb,GAAA;EAEA,EAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;EAC7B,IAAA,OAAOA,KAAK,CAAA;EACd,GAAA;IAEA,IAAI;MACF,OAAOG,IAAI,CAACC,KAAK,CAACC,kBAAkB,CAACL,KAAK,CAAC,CAAC,CAAA;KAC7C,CAAC,OAAAM,OAAA,EAAM;EACN,IAAA,OAAON,KAAK,CAAA;EACd,GAAA;EACF,CAAA;EAEA,SAASO,gBAAgBA,CAACC,GAAG,EAAE;EAC7B,EAAA,OAAOA,GAAG,CAACC,OAAO,CAAC,QAAQ,EAAEC,GAAG,IAAK,CAAA,CAAA,EAAGA,GAAG,CAACC,WAAW,EAAG,EAAC,CAAC,CAAA;EAC9D,CAAA;AAEA,QAAMC,WAAW,GAAG;EAClBC,EAAAA,gBAAgBA,CAACC,OAAO,EAAEN,GAAG,EAAER,KAAK,EAAE;MACpCc,OAAO,CAACC,YAAY,CAAE,CAAUR,QAAAA,EAAAA,gBAAgB,CAACC,GAAG,CAAE,CAAA,CAAC,EAAER,KAAK,CAAC,CAAA;KAChE;EAEDgB,EAAAA,mBAAmBA,CAACF,OAAO,EAAEN,GAAG,EAAE;MAChCM,OAAO,CAACG,eAAe,CAAE,CAAA,QAAA,EAAUV,gBAAgB,CAACC,GAAG,CAAE,CAAA,CAAC,CAAC,CAAA;KAC5D;IAEDU,iBAAiBA,CAACJ,OAAO,EAAE;MACzB,IAAI,CAACA,OAAO,EAAE;EACZ,MAAA,OAAO,EAAE,CAAA;EACX,KAAA;MAEA,MAAMK,UAAU,GAAG,EAAE,CAAA;EACrB,IAAA,MAAMC,MAAM,GAAGC,MAAM,CAACC,IAAI,CAACR,OAAO,CAACS,OAAO,CAAC,CAACC,MAAM,CAAChB,GAAG,IAAIA,GAAG,CAACiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAACjB,GAAG,CAACiB,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;EAE9G,IAAA,KAAK,MAAMjB,GAAG,IAAIY,MAAM,EAAE;QACxB,IAAIM,OAAO,GAAGlB,GAAG,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACpCiB,OAAO,GAAGA,OAAO,CAACC,MAAM,CAAC,CAAC,CAAC,CAAChB,WAAW,EAAE,GAAGe,OAAO,CAACE,KAAK,CAAC,CAAC,EAAEF,OAAO,CAACG,MAAM,CAAC,CAAA;EAC5EV,MAAAA,UAAU,CAACO,OAAO,CAAC,GAAG3B,aAAa,CAACe,OAAO,CAACS,OAAO,CAACf,GAAG,CAAC,CAAC,CAAA;EAC3D,KAAA;EAEA,IAAA,OAAOW,UAAU,CAAA;KAClB;EAEDW,EAAAA,gBAAgBA,CAAChB,OAAO,EAAEN,GAAG,EAAE;EAC7B,IAAA,OAAOT,aAAa,CAACe,OAAO,CAACiB,YAAY,CAAE,CAAUxB,QAAAA,EAAAA,gBAAgB,CAACC,GAAG,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA;EAChF,GAAA;EACF;;;;;;;;"}

View File

@ -1,82 +1,89 @@
/*! /*!
* Bootstrap selector-engine.js v5.2.3 (https://getbootstrap.com/) * Bootstrap selector-engine.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory(require('../util/index'))) ? (module.exports = factory(require('../util/index.js')))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['../util/index'], factory) ? define(['../util/index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.SelectorEngine = factory(global.Index))); (global.SelectorEngine = factory(global.Index)));
})(this, function (index) { })(this, function (index_js) {
'use strict'; 'use strict';
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/selector-engine.js * Bootstrap dom/selector-engine.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/**
* Constants
*/
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 !== '#'
? index_js.parseSelector(hrefAttribute.trim())
: null;
}
return selector;
};
const SelectorEngine = { const SelectorEngine = {
find(selector, element = document.documentElement) { find(selector, element = document.documentElement) {
return [].concat(...Element.prototype.querySelectorAll.call(element, selector)); return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
}, },
findOne(selector, element = document.documentElement) { findOne(selector, element = document.documentElement) {
return Element.prototype.querySelector.call(element, selector); return Element.prototype.querySelector.call(element, selector);
}, },
children(element, selector) { children(element, selector) {
return [].concat(...element.children).filter((child) => child.matches(selector)); return [].concat(...element.children).filter((child) => child.matches(selector));
}, },
parents(element, selector) { parents(element, selector) {
const parents = []; const parents = [];
let ancestor = element.parentNode.closest(selector); let ancestor = element.parentNode.closest(selector);
while (ancestor) { while (ancestor) {
parents.push(ancestor); parents.push(ancestor);
ancestor = ancestor.parentNode.closest(selector); ancestor = ancestor.parentNode.closest(selector);
} }
return parents; return parents;
}, },
prev(element, selector) { prev(element, selector) {
let previous = element.previousElementSibling; let previous = element.previousElementSibling;
while (previous) { while (previous) {
if (previous.matches(selector)) { if (previous.matches(selector)) {
return [previous]; return [previous];
} }
previous = previous.previousElementSibling; previous = previous.previousElementSibling;
} }
return []; return [];
}, },
// TODO: this is now unused; remove later along with prev() // TODO: this is now unused; remove later along with prev()
next(element, selector) { next(element, selector) {
let next = element.nextElementSibling; let next = element.nextElementSibling;
while (next) { while (next) {
if (next.matches(selector)) { if (next.matches(selector)) {
return [next]; return [next];
} }
next = next.nextElementSibling; next = next.nextElementSibling;
} }
return []; return [];
}, },
focusableChildren(element) { focusableChildren(element) {
const focusables = [ const focusables = [
'a', 'a',
@ -91,9 +98,24 @@
.map((selector) => `${selector}:not([tabindex^="-"])`) .map((selector) => `${selector}:not([tabindex^="-"])`)
.join(','); .join(',');
return this.find(focusables, element).filter( return this.find(focusables, element).filter(
(el) => !index.isDisabled(el) && index.isVisible(el) (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; return SelectorEngine;

File diff suppressed because one or more lines are too long

View File

@ -1,47 +1,43 @@
/*! /*!
* Bootstrap dropdown.js v5.2.3 (https://getbootstrap.com/) * Bootstrap dropdown.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('@popperjs/core'), require('@popperjs/core'),
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./dom/manipulator'), require('./dom/manipulator.js'),
require('./dom/selector-engine'), require('./dom/selector-engine.js'),
require('./base-component') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
[ [
'@popperjs/core', '@popperjs/core',
'./util/index', './base-component',
'./dom/event-handler', './dom/event-handler',
'./dom/manipulator', './dom/manipulator',
'./dom/selector-engine', './dom/selector-engine',
'./base-component', './util/index',
], ],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Dropdown = factory( (global.Dropdown = factory(
global['@popperjs/core'], global['@popperjs/core'],
global.Index, global.BaseComponent,
global.EventHandler, global.EventHandler,
global.Manipulator, global.Manipulator,
global.SelectorEngine, global.SelectorEngine,
global.BaseComponent global.Index
))); )));
})(this, function (Popper, index, EventHandler, Manipulator, SelectorEngine, BaseComponent) { })(this, function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) => function _interopNamespaceDefault(e) {
e && typeof e === 'object' && 'default' in e ? e : { default: e };
function _interopNamespace(e) {
if (e && e.__esModule) return e;
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
if (e) { if (e) {
for (const k in e) { for (const k in e) {
@ -64,18 +60,15 @@
return Object.freeze(n); return Object.freeze(n);
} }
const Popper__namespace = /*#__PURE__*/ _interopNamespace(Popper); const Popper__namespace = /*#__PURE__*/ _interopNamespaceDefault(Popper);
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dropdown.js * Bootstrap dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -109,12 +102,12 @@
const SELECTOR_NAVBAR = '.navbar'; const SELECTOR_NAVBAR = '.navbar';
const SELECTOR_NAVBAR_NAV = '.navbar-nav'; const SELECTOR_NAVBAR_NAV = '.navbar-nav';
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
const PLACEMENT_TOP = index.isRTL() ? 'top-end' : 'top-start'; const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start';
const PLACEMENT_TOPEND = index.isRTL() ? 'top-start' : 'top-end'; const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end';
const PLACEMENT_BOTTOM = index.isRTL() ? 'bottom-end' : 'bottom-start'; const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start';
const PLACEMENT_BOTTOMEND = index.isRTL() ? 'bottom-start' : 'bottom-end'; const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end';
const PLACEMENT_RIGHT = index.isRTL() ? 'left-start' : 'right-start'; const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start';
const PLACEMENT_LEFT = index.isRTL() ? 'right-start' : 'left-start'; const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start';
const PLACEMENT_TOPCENTER = 'top'; const PLACEMENT_TOPCENTER = 'top';
const PLACEMENT_BOTTOMCENTER = 'bottom'; const PLACEMENT_BOTTOMCENTER = 'bottom';
const Default = { const Default = {
@ -133,149 +126,120 @@
popperConfig: '(null|object|function)', popperConfig: '(null|object|function)',
reference: '(string|element|object)', reference: '(string|element|object)',
}; };
/** /**
* Class definition * Class definition
*/ */
class Dropdown extends BaseComponent__default.default { class Dropdown extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); super(element, config);
this._popper = null; this._popper = null;
this._parent = this._element.parentNode; // dropdown wrapper this._parent = this._element.parentNode; // dropdown wrapper
// todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
this._menu = this._menu =
SelectorEngine__default.default.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||
SelectorEngine__default.default.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||
SelectorEngine__default.default.findOne(SELECTOR_MENU, this._parent); SelectorEngine.findOne(SELECTOR_MENU, this._parent);
this._inNavbar = this._detectNavbar(); this._inNavbar = this._detectNavbar();
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
toggle() { toggle() {
return this._isShown() ? this.hide() : this.show(); return this._isShown() ? this.hide() : this.show();
} }
show() { show() {
if (index.isDisabled(this._element) || this._isShown()) { if (index_js.isDisabled(this._element) || this._isShown()) {
return; return;
} }
const relatedTarget = { const relatedTarget = {
relatedTarget: this._element, relatedTarget: this._element,
}; };
const showEvent = EventHandler__default.default.trigger( const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
this._element,
EVENT_SHOW,
relatedTarget
);
if (showEvent.defaultPrevented) { if (showEvent.defaultPrevented) {
return; return;
} }
this._createPopper();
this._createPopper(); // If this is a touch-enabled device we add extra // If this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children; // empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS // only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
if ( if (
'ontouchstart' in document.documentElement && 'ontouchstart' in document.documentElement &&
!this._parent.closest(SELECTOR_NAVBAR_NAV) !this._parent.closest(SELECTOR_NAVBAR_NAV)
) { ) {
for (const element of [].concat(...document.body.children)) { for (const element of [].concat(...document.body.children)) {
EventHandler__default.default.on(element, 'mouseover', index.noop); EventHandler.on(element, 'mouseover', index_js.noop);
} }
} }
this._element.focus(); this._element.focus();
this._element.setAttribute('aria-expanded', true); this._element.setAttribute('aria-expanded', true);
this._menu.classList.add(CLASS_NAME_SHOW); this._menu.classList.add(CLASS_NAME_SHOW);
this._element.classList.add(CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_SHOW);
EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget);
EventHandler__default.default.trigger(this._element, EVENT_SHOWN, relatedTarget);
} }
hide() { hide() {
if (index.isDisabled(this._element) || !this._isShown()) { if (index_js.isDisabled(this._element) || !this._isShown()) {
return; return;
} }
const relatedTarget = { const relatedTarget = {
relatedTarget: this._element, relatedTarget: this._element,
}; };
this._completeHide(relatedTarget); this._completeHide(relatedTarget);
} }
dispose() { dispose() {
if (this._popper) { if (this._popper) {
this._popper.destroy(); this._popper.destroy();
} }
super.dispose(); super.dispose();
} }
update() { update() {
this._inNavbar = this._detectNavbar(); this._inNavbar = this._detectNavbar();
if (this._popper) { if (this._popper) {
this._popper.update(); this._popper.update();
} }
} // Private }
// Private
_completeHide(relatedTarget) { _completeHide(relatedTarget) {
const hideEvent = EventHandler__default.default.trigger( const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget);
this._element,
EVENT_HIDE,
relatedTarget
);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; 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__default.default.off(element, 'mouseover', index.noop);
}
} }
// 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) { if (this._popper) {
this._popper.destroy(); this._popper.destroy();
} }
this._menu.classList.remove(CLASS_NAME_SHOW); this._menu.classList.remove(CLASS_NAME_SHOW);
this._element.classList.remove(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOW);
this._element.setAttribute('aria-expanded', 'false'); this._element.setAttribute('aria-expanded', 'false');
Manipulator.removeDataAttribute(this._menu, 'popper');
Manipulator__default.default.removeDataAttribute(this._menu, 'popper'); EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget);
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN, relatedTarget);
} }
_getConfig(config) { _getConfig(config) {
config = super._getConfig(config); config = super._getConfig(config);
if ( if (
typeof config.reference === 'object' && typeof config.reference === 'object' &&
!index.isElement(config.reference) && !index_js.isElement(config.reference) &&
typeof config.reference.getBoundingClientRect !== 'function' typeof config.reference.getBoundingClientRect !== 'function'
) { ) {
// Popper virtual elements require a getBoundingClientRect method // Popper virtual elements require a getBoundingClientRect method
@ -283,80 +247,61 @@
`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.` `${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`
); );
} }
return config; return config;
} }
_createPopper() { _createPopper() {
if (typeof Popper__namespace === 'undefined') { if (typeof Popper__namespace === 'undefined') {
throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
} }
let referenceElement = this._element; let referenceElement = this._element;
if (this._config.reference === 'parent') { if (this._config.reference === 'parent') {
referenceElement = this._parent; referenceElement = this._parent;
} else if (index.isElement(this._config.reference)) { } else if (index_js.isElement(this._config.reference)) {
referenceElement = index.getElement(this._config.reference); referenceElement = index_js.getElement(this._config.reference);
} else if (typeof this._config.reference === 'object') { } else if (typeof this._config.reference === 'object') {
referenceElement = this._config.reference; referenceElement = this._config.reference;
} }
const popperConfig = this._getPopperConfig(); const popperConfig = this._getPopperConfig();
this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig); this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
} }
_isShown() { _isShown() {
return this._menu.classList.contains(CLASS_NAME_SHOW); return this._menu.classList.contains(CLASS_NAME_SHOW);
} }
_getPlacement() { _getPlacement() {
const parentDropdown = this._parent; const parentDropdown = this._parent;
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
return PLACEMENT_RIGHT; return PLACEMENT_RIGHT;
} }
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
return PLACEMENT_LEFT; return PLACEMENT_LEFT;
} }
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) { if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
return PLACEMENT_TOPCENTER; return PLACEMENT_TOPCENTER;
} }
if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) { if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
return PLACEMENT_BOTTOMCENTER; return PLACEMENT_BOTTOMCENTER;
} // We need to trim the value because custom properties can also include spaces }
// We need to trim the value because custom properties can also include spaces
const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
} }
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
} }
_detectNavbar() { _detectNavbar() {
return this._element.closest(SELECTOR_NAVBAR) !== null; return this._element.closest(SELECTOR_NAVBAR) !== null;
} }
_getOffset() { _getOffset() {
const { offset } = this._config; const { offset } = this._config;
if (typeof offset === 'string') { if (typeof offset === 'string') {
return offset.split(',').map((value) => Number.parseInt(value, 10)); return offset.split(',').map((value) => Number.parseInt(value, 10));
} }
if (typeof offset === 'function') { if (typeof offset === 'function') {
return (popperData) => offset(popperData, this._element); return (popperData) => offset(popperData, this._element);
} }
return offset; return offset;
} }
_getPopperConfig() { _getPopperConfig() {
const defaultBsPopperConfig = { const defaultBsPopperConfig = {
placement: this._getPlacement(), placement: this._getPlacement(),
@ -374,11 +319,11 @@
}, },
}, },
], ],
}; // Disable Popper if we have a static display or Dropdown is in Navbar };
// Disable Popper if we have a static display or Dropdown is in Navbar
if (this._inNavbar || this._config.display === 'static') { if (this._inNavbar || this._config.display === 'static') {
Manipulator__default.default.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
defaultBsPopperConfig.modifiers = [ defaultBsPopperConfig.modifiers = [
{ {
name: 'applyStyles', name: 'applyStyles',
@ -386,46 +331,39 @@
}, },
]; ];
} }
return { return {
...defaultBsPopperConfig, ...defaultBsPopperConfig,
...(typeof this._config.popperConfig === 'function' ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig]),
? this._config.popperConfig(defaultBsPopperConfig)
: this._config.popperConfig),
}; };
} }
_selectMenuItem({ key, target }) { _selectMenuItem({ key, target }) {
const items = SelectorEngine__default.default const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) =>
.find(SELECTOR_VISIBLE_ITEMS, this._menu) index_js.isVisible(element)
.filter((element) => index.isVisible(element)); );
if (!items.length) { if (!items.length) {
return; 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 // 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)) .getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target))
.focus(); .focus();
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Dropdown.getOrCreateInstance(this, config); const data = Dropdown.getOrCreateInstance(this, config);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
}); });
} }
static clearMenus(event) { static clearMenus(event) {
if ( if (
event.button === RIGHT_MOUSE_BUTTON || event.button === RIGHT_MOUSE_BUTTON ||
@ -433,27 +371,23 @@
) { ) {
return; return;
} }
const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
const openToggles = SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE_SHOWN);
for (const toggle of openToggles) { for (const toggle of openToggles) {
const context = Dropdown.getInstance(toggle); const context = Dropdown.getInstance(toggle);
if (!context || context._config.autoClose === false) { if (!context || context._config.autoClose === false) {
continue; continue;
} }
const composedPath = event.composedPath(); const composedPath = event.composedPath();
const isMenuTarget = composedPath.includes(context._menu); const isMenuTarget = composedPath.includes(context._menu);
if ( if (
composedPath.includes(context._element) || composedPath.includes(context._element) ||
(context._config.autoClose === 'inside' && !isMenuTarget) || (context._config.autoClose === 'inside' && !isMenuTarget) ||
(context._config.autoClose === 'outside' && isMenuTarget) (context._config.autoClose === 'outside' && isMenuTarget)
) { ) {
continue; continue;
} // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu }
// Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
if ( if (
context._menu.contains(event.target) && context._menu.contains(event.target) &&
((event.type === 'keyup' && event.key === TAB_KEY) || ((event.type === 'keyup' && event.key === TAB_KEY) ||
@ -461,55 +395,43 @@
) { ) {
continue; continue;
} }
const relatedTarget = { const relatedTarget = {
relatedTarget: context._element, relatedTarget: context._element,
}; };
if (event.type === 'click') { if (event.type === 'click') {
relatedTarget.clickEvent = event; relatedTarget.clickEvent = event;
} }
context._completeHide(relatedTarget); context._completeHide(relatedTarget);
} }
} }
static dataApiKeydownHandler(event) { static dataApiKeydownHandler(event) {
// If not an UP | DOWN | ESCAPE key => not a dropdown command // If not an UP | DOWN | ESCAPE key => not a dropdown command
// If input/textarea && if key is other than ESCAPE => 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 isInput = /input|textarea/i.test(event.target.tagName);
const isEscapeEvent = event.key === ESCAPE_KEY; const isEscapeEvent = event.key === ESCAPE_KEY;
const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key); const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key);
if (!isUpOrDownEvent && !isEscapeEvent) { if (!isUpOrDownEvent && !isEscapeEvent) {
return; return;
} }
if (isInput && !isEscapeEvent) { if (isInput && !isEscapeEvent) {
return; return;
} }
event.preventDefault();
event.preventDefault(); // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE)
? this ? this
: SelectorEngine__default.default.prev(this, SELECTOR_DATA_TOGGLE)[0] || : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||
SelectorEngine__default.default.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||
SelectorEngine__default.default.findOne( SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode);
SELECTOR_DATA_TOGGLE,
event.delegateTarget.parentNode
);
const instance = Dropdown.getOrCreateInstance(getToggleButton); const instance = Dropdown.getOrCreateInstance(getToggleButton);
if (isUpOrDownEvent) { if (isUpOrDownEvent) {
event.stopPropagation(); event.stopPropagation();
instance.show(); instance.show();
instance._selectMenuItem(event); instance._selectMenuItem(event);
return; return;
} }
if (instance._isShown()) { if (instance._isShown()) {
// else is escape and we check if it is shown // else is escape and we check if it is shown
event.stopPropagation(); event.stopPropagation();
@ -518,38 +440,30 @@
} }
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(
document, document,
EVENT_KEYDOWN_DATA_API, EVENT_KEYDOWN_DATA_API,
SELECTOR_DATA_TOGGLE, SELECTOR_DATA_TOGGLE,
Dropdown.dataApiKeydownHandler Dropdown.dataApiKeydownHandler
); );
EventHandler__default.default.on( EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
document, EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
EVENT_KEYDOWN_DATA_API, EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
SELECTOR_MENU, EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
Dropdown.dataApiKeydownHandler event.preventDefault();
); Dropdown.getOrCreateInstance(this).toggle();
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus); });
EventHandler__default.default.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
EventHandler__default.default.on(
document,
EVENT_CLICK_DATA_API,
SELECTOR_DATA_TOGGLE,
function (event) {
event.preventDefault();
Dropdown.getOrCreateInstance(this).toggle();
}
);
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Dropdown); index_js.defineJQueryPlugin(Dropdown);
return Dropdown; return Dropdown;
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,75 +1,66 @@
/*! /*!
* Bootstrap modal.js v5.2.3 (https://getbootstrap.com/) * Bootstrap modal.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./dom/selector-engine'), require('./dom/selector-engine.js'),
require('./util/scrollbar'), require('./util/backdrop.js'),
require('./base-component'), require('./util/component-functions.js'),
require('./util/backdrop'), require('./util/focustrap.js'),
require('./util/focustrap'), require('./util/index.js'),
require('./util/component-functions') require('./util/scrollbar.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
[ [
'./util/index', './base-component',
'./dom/event-handler', './dom/event-handler',
'./dom/selector-engine', './dom/selector-engine',
'./util/scrollbar',
'./base-component',
'./util/backdrop', './util/backdrop',
'./util/focustrap',
'./util/component-functions', './util/component-functions',
'./util/focustrap',
'./util/index',
'./util/scrollbar',
], ],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Modal = factory( (global.Modal = factory(
global.Index, global.BaseComponent,
global.EventHandler, global.EventHandler,
global.SelectorEngine, global.SelectorEngine,
global.Scrollbar,
global.BaseComponent,
global.Backdrop, global.Backdrop,
global.ComponentFunctions,
global.Focustrap, global.Focustrap,
global.ComponentFunctions global.Index,
global.Scrollbar
))); )));
})( })(
this, this,
function ( function (
index, BaseComponent,
EventHandler, EventHandler,
SelectorEngine, SelectorEngine,
ScrollBarHelper,
BaseComponent,
Backdrop, Backdrop,
componentFunctions_js,
FocusTrap, FocusTrap,
componentFunctions index_js,
ScrollBarHelper
) { ) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const ScrollBarHelper__default = /*#__PURE__*/ _interopDefaultLegacy(ScrollBarHelper);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
const Backdrop__default = /*#__PURE__*/ _interopDefaultLegacy(Backdrop);
const FocusTrap__default = /*#__PURE__*/ _interopDefaultLegacy(FocusTrap);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): modal.js * Bootstrap modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -107,256 +98,193 @@
focus: 'boolean', focus: 'boolean',
keyboard: 'boolean', keyboard: 'boolean',
}; };
/** /**
* Class definition * Class definition
*/ */
class Modal extends BaseComponent__default.default { class Modal extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); super(element, config);
this._dialog = SelectorEngine__default.default.findOne(SELECTOR_DIALOG, this._element); this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
this._backdrop = this._initializeBackDrop(); this._backdrop = this._initializeBackDrop();
this._focustrap = this._initializeFocusTrap(); this._focustrap = this._initializeFocusTrap();
this._isShown = false; this._isShown = false;
this._isTransitioning = false; this._isTransitioning = false;
this._scrollBar = new ScrollBarHelper__default.default(); this._scrollBar = new ScrollBarHelper();
this._addEventListeners(); this._addEventListeners();
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
toggle(relatedTarget) { toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget); return this._isShown ? this.hide() : this.show(relatedTarget);
} }
show(relatedTarget) { show(relatedTarget) {
if (this._isShown || this._isTransitioning) { if (this._isShown || this._isTransitioning) {
return; return;
} }
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
relatedTarget, relatedTarget,
}); });
if (showEvent.defaultPrevented) { if (showEvent.defaultPrevented) {
return; return;
} }
this._isShown = true; this._isShown = true;
this._isTransitioning = true; this._isTransitioning = true;
this._scrollBar.hide(); this._scrollBar.hide();
document.body.classList.add(CLASS_NAME_OPEN); document.body.classList.add(CLASS_NAME_OPEN);
this._adjustDialog(); this._adjustDialog();
this._backdrop.show(() => this._showElement(relatedTarget)); this._backdrop.show(() => this._showElement(relatedTarget));
} }
hide() { hide() {
if (!this._isShown || this._isTransitioning) { if (!this._isShown || this._isTransitioning) {
return; return;
} }
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; return;
} }
this._isShown = false; this._isShown = false;
this._isTransitioning = true; this._isTransitioning = true;
this._focustrap.deactivate(); this._focustrap.deactivate();
this._element.classList.remove(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOW);
this._queueCallback(() => this._hideModal(), this._element, this._isAnimated()); this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
} }
dispose() { dispose() {
for (const htmlElement of [window, this._dialog]) { EventHandler.off(window, EVENT_KEY);
EventHandler__default.default.off(htmlElement, EVENT_KEY); EventHandler.off(this._dialog, EVENT_KEY);
}
this._backdrop.dispose(); this._backdrop.dispose();
this._focustrap.deactivate(); this._focustrap.deactivate();
super.dispose(); super.dispose();
} }
handleUpdate() { handleUpdate() {
this._adjustDialog(); this._adjustDialog();
} // Private }
// Private
_initializeBackDrop() { _initializeBackDrop() {
return new Backdrop__default.default({ return new Backdrop({
isVisible: Boolean(this._config.backdrop), isVisible: Boolean(this._config.backdrop),
// 'static' option will be translated to true, and booleans will keep their value, // 'static' option will be translated to true, and booleans will keep their value,
isAnimated: this._isAnimated(), isAnimated: this._isAnimated(),
}); });
} }
_initializeFocusTrap() { _initializeFocusTrap() {
return new FocusTrap__default.default({ return new FocusTrap({
trapElement: this._element, trapElement: this._element,
}); });
} }
_showElement(relatedTarget) { _showElement(relatedTarget) {
// try to append dynamic modal // try to append dynamic modal
if (!document.body.contains(this._element)) { if (!document.body.contains(this._element)) {
document.body.append(this._element); document.body.append(this._element);
} }
this._element.style.display = 'block'; this._element.style.display = 'block';
this._element.removeAttribute('aria-hidden'); this._element.removeAttribute('aria-hidden');
this._element.setAttribute('aria-modal', true); this._element.setAttribute('aria-modal', true);
this._element.setAttribute('role', 'dialog'); this._element.setAttribute('role', 'dialog');
this._element.scrollTop = 0; this._element.scrollTop = 0;
const modalBody = SelectorEngine__default.default.findOne( const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
SELECTOR_MODAL_BODY,
this._dialog
);
if (modalBody) { if (modalBody) {
modalBody.scrollTop = 0; modalBody.scrollTop = 0;
} }
index_js.reflow(this._element);
index.reflow(this._element);
this._element.classList.add(CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_SHOW);
const transitionComplete = () => { const transitionComplete = () => {
if (this._config.focus) { if (this._config.focus) {
this._focustrap.activate(); this._focustrap.activate();
} }
this._isTransitioning = false; this._isTransitioning = false;
EventHandler__default.default.trigger(this._element, EVENT_SHOWN, { EventHandler.trigger(this._element, EVENT_SHOWN, {
relatedTarget, relatedTarget,
}); });
}; };
this._queueCallback(transitionComplete, this._dialog, this._isAnimated()); this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
} }
_addEventListeners() { _addEventListeners() {
EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => { EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
if (event.key !== ESCAPE_KEY) { if (event.key !== ESCAPE_KEY) {
return; return;
} }
if (this._config.keyboard) { if (this._config.keyboard) {
event.preventDefault();
this.hide(); this.hide();
return; return;
} }
this._triggerBackdropTransition(); this._triggerBackdropTransition();
}); });
EventHandler__default.default.on(window, EVENT_RESIZE, () => { EventHandler.on(window, EVENT_RESIZE, () => {
if (this._isShown && !this._isTransitioning) { if (this._isShown && !this._isTransitioning) {
this._adjustDialog(); this._adjustDialog();
} }
}); });
EventHandler__default.default.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event) => { 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 // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
EventHandler__default.default.one(this._element, EVENT_CLICK_DISMISS, (event2) => { EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event2) => {
if (this._element !== event.target || this._element !== event2.target) { if (this._element !== event.target || this._element !== event2.target) {
return; return;
} }
if (this._config.backdrop === 'static') { if (this._config.backdrop === 'static') {
this._triggerBackdropTransition(); this._triggerBackdropTransition();
return; return;
} }
if (this._config.backdrop) { if (this._config.backdrop) {
this.hide(); this.hide();
} }
}); });
}); });
} }
_hideModal() { _hideModal() {
this._element.style.display = 'none'; this._element.style.display = 'none';
this._element.setAttribute('aria-hidden', true); this._element.setAttribute('aria-hidden', true);
this._element.removeAttribute('aria-modal'); this._element.removeAttribute('aria-modal');
this._element.removeAttribute('role'); this._element.removeAttribute('role');
this._isTransitioning = false; this._isTransitioning = false;
this._backdrop.hide(() => { this._backdrop.hide(() => {
document.body.classList.remove(CLASS_NAME_OPEN); document.body.classList.remove(CLASS_NAME_OPEN);
this._resetAdjustments(); this._resetAdjustments();
this._scrollBar.reset(); this._scrollBar.reset();
EventHandler.trigger(this._element, EVENT_HIDDEN);
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
}); });
} }
_isAnimated() { _isAnimated() {
return this._element.classList.contains(CLASS_NAME_FADE); return this._element.classList.contains(CLASS_NAME_FADE);
} }
_triggerBackdropTransition() { _triggerBackdropTransition() {
const hideEvent = EventHandler__default.default.trigger( const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
this._element,
EVENT_HIDE_PREVENTED
);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; return;
} }
const isModalOverflowing = const isModalOverflowing =
this._element.scrollHeight > document.documentElement.clientHeight; this._element.scrollHeight > document.documentElement.clientHeight;
const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed 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)) { if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
return; return;
} }
if (!isModalOverflowing) { if (!isModalOverflowing) {
this._element.style.overflowY = 'hidden'; this._element.style.overflowY = 'hidden';
} }
this._element.classList.add(CLASS_NAME_STATIC); this._element.classList.add(CLASS_NAME_STATIC);
this._queueCallback(() => { this._queueCallback(() => {
this._element.classList.remove(CLASS_NAME_STATIC); this._element.classList.remove(CLASS_NAME_STATIC);
this._queueCallback(() => { this._queueCallback(() => {
this._element.style.overflowY = initialOverflowY; this._element.style.overflowY = initialOverflowY;
}, this._dialog); }, this._dialog);
}, this._dialog); }, this._dialog);
this._element.focus(); this._element.focus();
} }
/** /**
* The following methods are used to handle overflowing modals * The following methods are used to handle overflowing modals
*/ */
@ -364,87 +292,73 @@
_adjustDialog() { _adjustDialog() {
const isModalOverflowing = const isModalOverflowing =
this._element.scrollHeight > document.documentElement.clientHeight; this._element.scrollHeight > document.documentElement.clientHeight;
const scrollbarWidth = this._scrollBar.getWidth(); const scrollbarWidth = this._scrollBar.getWidth();
const isBodyOverflowing = scrollbarWidth > 0; const isBodyOverflowing = scrollbarWidth > 0;
if (isBodyOverflowing && !isModalOverflowing) { if (isBodyOverflowing && !isModalOverflowing) {
const property = index.isRTL() ? 'paddingLeft' : 'paddingRight'; const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight';
this._element.style[property] = `${scrollbarWidth}px`; this._element.style[property] = `${scrollbarWidth}px`;
} }
if (!isBodyOverflowing && isModalOverflowing) { if (!isBodyOverflowing && isModalOverflowing) {
const property = index.isRTL() ? 'paddingRight' : 'paddingLeft'; const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';
this._element.style[property] = `${scrollbarWidth}px`; this._element.style[property] = `${scrollbarWidth}px`;
} }
} }
_resetAdjustments() { _resetAdjustments() {
this._element.style.paddingLeft = ''; this._element.style.paddingLeft = '';
this._element.style.paddingRight = ''; this._element.style.paddingRight = '';
} // Static }
// Static
static jQueryInterface(config, relatedTarget) { static jQueryInterface(config, relatedTarget) {
return this.each(function () { return this.each(function () {
const data = Modal.getOrCreateInstance(this, config); const data = Modal.getOrCreateInstance(this, config);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](relatedTarget); data[config](relatedTarget);
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
document, const target = SelectorEngine.getElementFromSelector(this);
EVENT_CLICK_DATA_API, if (['A', 'AREA'].includes(this.tagName)) {
SELECTOR_DATA_TOGGLE, event.preventDefault();
function (event) {
const target = index.getElementFromSelector(this);
if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault();
}
EventHandler__default.default.one(target, EVENT_SHOW, (showEvent) => {
if (showEvent.defaultPrevented) {
// only register focus restorer if modal will actually get shown
return;
}
EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
if (index.isVisible(this)) {
this.focus();
}
});
}); // avoid conflict when clicking modal toggler while another one is open
const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
if (alreadyOpen) {
Modal.getInstance(alreadyOpen).hide();
}
const data = Modal.getOrCreateInstance(target);
data.toggle(this);
} }
); EventHandler.one(target, EVENT_SHOW, (showEvent) => {
componentFunctions.enableDismissTrigger(Modal); 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 * jQuery
*/ */
index.defineJQueryPlugin(Modal); index_js.defineJQueryPlugin(Modal);
return Modal; return Modal;
} }

File diff suppressed because one or more lines are too long

View File

@ -1,75 +1,66 @@
/*! /*!
* Bootstrap offcanvas.js v5.2.3 (https://getbootstrap.com/) * Bootstrap offcanvas.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./util/scrollbar'), require('./dom/event-handler.js'),
require('./dom/event-handler'), require('./dom/selector-engine.js'),
require('./base-component'), require('./util/backdrop.js'),
require('./dom/selector-engine'), require('./util/component-functions.js'),
require('./util/backdrop'), require('./util/focustrap.js'),
require('./util/focustrap'), require('./util/index.js'),
require('./util/component-functions') require('./util/scrollbar.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
[ [
'./util/index',
'./util/scrollbar',
'./dom/event-handler',
'./base-component', './base-component',
'./dom/event-handler',
'./dom/selector-engine', './dom/selector-engine',
'./util/backdrop', './util/backdrop',
'./util/focustrap',
'./util/component-functions', './util/component-functions',
'./util/focustrap',
'./util/index',
'./util/scrollbar',
], ],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Offcanvas = factory( (global.Offcanvas = factory(
global.Index,
global.Scrollbar,
global.EventHandler,
global.BaseComponent, global.BaseComponent,
global.EventHandler,
global.SelectorEngine, global.SelectorEngine,
global.Backdrop, global.Backdrop,
global.ComponentFunctions,
global.Focustrap, global.Focustrap,
global.ComponentFunctions global.Index,
global.Scrollbar
))); )));
})( })(
this, this,
function ( function (
index,
ScrollBarHelper,
EventHandler,
BaseComponent, BaseComponent,
EventHandler,
SelectorEngine, SelectorEngine,
Backdrop, Backdrop,
componentFunctions_js,
FocusTrap, FocusTrap,
componentFunctions index_js,
ScrollBarHelper
) { ) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const ScrollBarHelper__default = /*#__PURE__*/ _interopDefaultLegacy(ScrollBarHelper);
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const Backdrop__default = /*#__PURE__*/ _interopDefaultLegacy(Backdrop);
const FocusTrap__default = /*#__PURE__*/ _interopDefaultLegacy(FocusTrap);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): offcanvas.js * Bootstrap offcanvas.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -104,138 +95,108 @@
keyboard: 'boolean', keyboard: 'boolean',
scroll: 'boolean', scroll: 'boolean',
}; };
/** /**
* Class definition * Class definition
*/ */
class Offcanvas extends BaseComponent__default.default { class Offcanvas extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); super(element, config);
this._isShown = false; this._isShown = false;
this._backdrop = this._initializeBackDrop(); this._backdrop = this._initializeBackDrop();
this._focustrap = this._initializeFocusTrap(); this._focustrap = this._initializeFocusTrap();
this._addEventListeners(); this._addEventListeners();
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
toggle(relatedTarget) { toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget); return this._isShown ? this.hide() : this.show(relatedTarget);
} }
show(relatedTarget) { show(relatedTarget) {
if (this._isShown) { if (this._isShown) {
return; return;
} }
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
relatedTarget, relatedTarget,
}); });
if (showEvent.defaultPrevented) { if (showEvent.defaultPrevented) {
return; return;
} }
this._isShown = true; this._isShown = true;
this._backdrop.show(); this._backdrop.show();
if (!this._config.scroll) { if (!this._config.scroll) {
new ScrollBarHelper__default.default().hide(); new ScrollBarHelper().hide();
} }
this._element.setAttribute('aria-modal', true); this._element.setAttribute('aria-modal', true);
this._element.setAttribute('role', 'dialog'); this._element.setAttribute('role', 'dialog');
this._element.classList.add(CLASS_NAME_SHOWING); this._element.classList.add(CLASS_NAME_SHOWING);
const completeCallBack = () => { const completeCallBack = () => {
if (!this._config.scroll || this._config.backdrop) { if (!this._config.scroll || this._config.backdrop) {
this._focustrap.activate(); this._focustrap.activate();
} }
this._element.classList.add(CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_SHOW);
this._element.classList.remove(CLASS_NAME_SHOWING); this._element.classList.remove(CLASS_NAME_SHOWING);
EventHandler.trigger(this._element, EVENT_SHOWN, {
EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
relatedTarget, relatedTarget,
}); });
}; };
this._queueCallback(completeCallBack, this._element, true); this._queueCallback(completeCallBack, this._element, true);
} }
hide() { hide() {
if (!this._isShown) { if (!this._isShown) {
return; return;
} }
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; return;
} }
this._focustrap.deactivate(); this._focustrap.deactivate();
this._element.blur(); this._element.blur();
this._isShown = false; this._isShown = false;
this._element.classList.add(CLASS_NAME_HIDING); this._element.classList.add(CLASS_NAME_HIDING);
this._backdrop.hide(); this._backdrop.hide();
const completeCallback = () => { const completeCallback = () => {
this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING); this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING);
this._element.removeAttribute('aria-modal'); this._element.removeAttribute('aria-modal');
this._element.removeAttribute('role'); this._element.removeAttribute('role');
if (!this._config.scroll) { if (!this._config.scroll) {
new ScrollBarHelper__default.default().reset(); new ScrollBarHelper().reset();
} }
EventHandler.trigger(this._element, EVENT_HIDDEN);
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
}; };
this._queueCallback(completeCallback, this._element, true); this._queueCallback(completeCallback, this._element, true);
} }
dispose() { dispose() {
this._backdrop.dispose(); this._backdrop.dispose();
this._focustrap.deactivate(); this._focustrap.deactivate();
super.dispose(); super.dispose();
} // Private }
// Private
_initializeBackDrop() { _initializeBackDrop() {
const clickCallback = () => { const clickCallback = () => {
if (this._config.backdrop === 'static') { if (this._config.backdrop === 'static') {
EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED); EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
return; return;
} }
this.hide(); this.hide();
}; // 'static' option will be translated to true, and booleans will keep their value };
// 'static' option will be translated to true, and booleans will keep their value
const isVisible = Boolean(this._config.backdrop); const isVisible = Boolean(this._config.backdrop);
return new Backdrop__default.default({ return new Backdrop({
className: CLASS_NAME_BACKDROP, className: CLASS_NAME_BACKDROP,
isVisible, isVisible,
isAnimated: true, isAnimated: true,
@ -243,100 +204,85 @@
clickCallback: isVisible ? clickCallback : null, clickCallback: isVisible ? clickCallback : null,
}); });
} }
_initializeFocusTrap() { _initializeFocusTrap() {
return new FocusTrap__default.default({ return new FocusTrap({
trapElement: this._element, trapElement: this._element,
}); });
} }
_addEventListeners() { _addEventListeners() {
EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => { EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
if (event.key !== ESCAPE_KEY) { if (event.key !== ESCAPE_KEY) {
return; return;
} }
if (this._config.keyboard) {
if (!this._config.keyboard) { this.hide();
EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
return; return;
} }
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
this.hide();
}); });
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Offcanvas.getOrCreateInstance(this, config); const data = Offcanvas.getOrCreateInstance(this, config);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](this); data[config](this);
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
document, const target = SelectorEngine.getElementFromSelector(this);
EVENT_CLICK_DATA_API, if (['A', 'AREA'].includes(this.tagName)) {
SELECTOR_DATA_TOGGLE, event.preventDefault();
function (event) {
const target = index.getElementFromSelector(this);
if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault();
}
if (index.isDisabled(this)) {
return;
}
EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
// focus on trigger when it is closed
if (index.isVisible(this)) {
this.focus();
}
}); // avoid conflict when clicking a toggler of an offcanvas, while another is open
const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
if (alreadyOpen && alreadyOpen !== target) {
Offcanvas.getInstance(alreadyOpen).hide();
}
const data = Offcanvas.getOrCreateInstance(target);
data.toggle(this);
} }
); if (index_js.isDisabled(this)) {
EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => { return;
for (const selector of SelectorEngine__default.default.find(OPEN_SELECTOR)) { }
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(); Offcanvas.getOrCreateInstance(selector).show();
} }
}); });
EventHandler__default.default.on(window, EVENT_RESIZE, () => { EventHandler.on(window, EVENT_RESIZE, () => {
for (const element of SelectorEngine__default.default.find( for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
'[aria-modal][class*=show][class*=offcanvas-]'
)) {
if (getComputedStyle(element).position !== 'fixed') { if (getComputedStyle(element).position !== 'fixed') {
Offcanvas.getOrCreateInstance(element).hide(); Offcanvas.getOrCreateInstance(element).hide();
} }
} }
}); });
componentFunctions.enableDismissTrigger(Offcanvas); componentFunctions_js.enableDismissTrigger(Offcanvas);
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Offcanvas); index_js.defineJQueryPlugin(Offcanvas);
return Offcanvas; return Offcanvas;
} }

File diff suppressed because one or more lines are too long

View File

@ -1,29 +1,25 @@
/*! /*!
* Bootstrap popover.js v5.2.3 (https://getbootstrap.com/) * Bootstrap popover.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory(require('./util/index'), require('./tooltip'))) ? (module.exports = factory(require('./tooltip.js'), require('./util/index.js')))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['./util/index', './tooltip'], factory) ? define(['./tooltip', './util/index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Popover = factory(global.Index, global.Tooltip))); (global.Popover = factory(global.Tooltip, global.Index)));
})(this, function (index, Tooltip) { })(this, function (Tooltip, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const Tooltip__default = /*#__PURE__*/ _interopDefaultLegacy(Tooltip);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): popover.js * Bootstrap popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -32,7 +28,7 @@
const SELECTOR_TITLE = '.popover-header'; const SELECTOR_TITLE = '.popover-header';
const SELECTOR_CONTENT = '.popover-body'; const SELECTOR_CONTENT = '.popover-body';
const Default = { const Default = {
...Tooltip__default.default.Default, ...Tooltip.Default,
content: '', content: '',
offset: [0, 8], offset: [0, 8],
placement: 'right', placement: 'right',
@ -45,63 +41,62 @@
trigger: 'click', trigger: 'click',
}; };
const DefaultType = { const DefaultType = {
...Tooltip__default.default.DefaultType, ...Tooltip.DefaultType,
content: '(null|string|element|function)', content: '(null|string|element|function)',
}; };
/** /**
* Class definition * Class definition
*/ */
class Popover extends Tooltip__default.default { class Popover extends Tooltip {
// Getters // Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Overrides }
// Overrides
_isWithContent() { _isWithContent() {
return this._getTitle() || this._getContent(); return this._getTitle() || this._getContent();
} // Private }
// Private
_getContentForTemplate() { _getContentForTemplate() {
return { return {
[SELECTOR_TITLE]: this._getTitle(), [SELECTOR_TITLE]: this._getTitle(),
[SELECTOR_CONTENT]: this._getContent(), [SELECTOR_CONTENT]: this._getContent(),
}; };
} }
_getContent() { _getContent() {
return this._resolvePossibleFunction(this._config.content); return this._resolvePossibleFunction(this._config.content);
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Popover.getOrCreateInstance(this, config); const data = Popover.getOrCreateInstance(this, config);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
}); });
} }
} }
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Popover); index_js.defineJQueryPlugin(Popover);
return Popover; return Popover;
}); });

View File

@ -1 +1 @@
{"version":3,"file":"popover.js","sources":["../src/popover.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { defineJQueryPlugin } from './util/index'\nimport Tooltip from './tooltip'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n"],"names":["NAME","SELECTOR_TITLE","SELECTOR_CONTENT","Default","Tooltip","content","offset","placement","template","trigger","DefaultType","Popover","_isWithContent","_getTitle","_getContent","_getContentForTemplate","_resolvePossibleFunction","_config","jQueryInterface","config","each","data","getOrCreateInstance","TypeError","defineJQueryPlugin"],"mappings":";;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAKA;EACA;EACA;;EAEA,MAAMA,IAAI,GAAG,SAAb,CAAA;EAEA,MAAMC,cAAc,GAAG,iBAAvB,CAAA;EACA,MAAMC,gBAAgB,GAAG,eAAzB,CAAA;EAEA,MAAMC,OAAO,GAAG,EACd,GAAGC,wBAAO,CAACD,OADG;EAEdE,EAAAA,OAAO,EAAE,EAFK;EAGdC,EAAAA,MAAM,EAAE,CAAC,CAAD,EAAI,CAAJ,CAHM;EAIdC,EAAAA,SAAS,EAAE,OAJG;IAKdC,QAAQ,EAAE,yCACR,mCADQ,GAER,kCAFQ,GAGR,kCAHQ,GAIR,QATY;EAUdC,EAAAA,OAAO,EAAE,OAAA;EAVK,CAAhB,CAAA;EAaA,MAAMC,WAAW,GAAG,EAClB,GAAGN,wBAAO,CAACM,WADO;EAElBL,EAAAA,OAAO,EAAE,gCAAA;EAFS,CAApB,CAAA;EAKA;EACA;EACA;;EAEA,MAAMM,OAAN,SAAsBP,wBAAtB,CAA8B;EAC5B;EACkB,EAAA,WAAPD,OAAO,GAAG;EACnB,IAAA,OAAOA,OAAP,CAAA;EACD,GAAA;;EAEqB,EAAA,WAAXO,WAAW,GAAG;EACvB,IAAA,OAAOA,WAAP,CAAA;EACD,GAAA;;EAEc,EAAA,WAAJV,IAAI,GAAG;EAChB,IAAA,OAAOA,IAAP,CAAA;EACD,GAZ2B;;;EAe5BY,EAAAA,cAAc,GAAG;EACf,IAAA,OAAO,IAAKC,CAAAA,SAAL,EAAoB,IAAA,IAAA,CAAKC,WAAL,EAA3B,CAAA;EACD,GAjB2B;;;EAoB5BC,EAAAA,sBAAsB,GAAG;MACvB,OAAO;EACL,MAAA,CAACd,cAAD,GAAkB,IAAKY,CAAAA,SAAL,EADb;QAEL,CAACX,gBAAD,GAAoB,IAAA,CAAKY,WAAL,EAAA;OAFtB,CAAA;EAID,GAAA;;EAEDA,EAAAA,WAAW,GAAG;EACZ,IAAA,OAAO,KAAKE,wBAAL,CAA8B,KAAKC,OAAL,CAAaZ,OAA3C,CAAP,CAAA;EACD,GA7B2B;;;IAgCN,OAAfa,eAAe,CAACC,MAAD,EAAS;MAC7B,OAAO,IAAA,CAAKC,IAAL,CAAU,YAAY;QAC3B,MAAMC,IAAI,GAAGV,OAAO,CAACW,mBAAR,CAA4B,IAA5B,EAAkCH,MAAlC,CAAb,CAAA;;EAEA,MAAA,IAAI,OAAOA,MAAP,KAAkB,QAAtB,EAAgC;EAC9B,QAAA,OAAA;EACD,OAAA;;EAED,MAAA,IAAI,OAAOE,IAAI,CAACF,MAAD,CAAX,KAAwB,WAA5B,EAAyC;EACvC,QAAA,MAAM,IAAII,SAAJ,CAAe,CAAmBJ,iBAAAA,EAAAA,MAAO,GAAzC,CAAN,CAAA;EACD,OAAA;;QAEDE,IAAI,CAACF,MAAD,CAAJ,EAAA,CAAA;EACD,KAZM,CAAP,CAAA;EAaD,GAAA;;EA9C2B,CAAA;EAiD9B;EACA;EACA;;;AAEAK,0BAAkB,CAACb,OAAD,CAAlB;;;;;;;;"} {"version":3,"file":"popover.js","sources":["../src/popover.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '<div class=\"popover\" role=\"tooltip\">' +\n '<div class=\"popover-arrow\"></div>' +\n '<h3 class=\"popover-header\"></h3>' +\n '<div class=\"popover-body\"></div>' +\n '</div>',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n"],"names":["NAME","SELECTOR_TITLE","SELECTOR_CONTENT","Default","Tooltip","content","offset","placement","template","trigger","DefaultType","Popover","_isWithContent","_getTitle","_getContent","_getContentForTemplate","_resolvePossibleFunction","_config","jQueryInterface","config","each","data","getOrCreateInstance","TypeError","defineJQueryPlugin"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;;EAKA;EACA;EACA;;EAEA,MAAMA,IAAI,GAAG,SAAS,CAAA;EAEtB,MAAMC,cAAc,GAAG,iBAAiB,CAAA;EACxC,MAAMC,gBAAgB,GAAG,eAAe,CAAA;EAExC,MAAMC,OAAO,GAAG;IACd,GAAGC,OAAO,CAACD,OAAO;EAClBE,EAAAA,OAAO,EAAE,EAAE;EACXC,EAAAA,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;EACdC,EAAAA,SAAS,EAAE,OAAO;IAClBC,QAAQ,EAAE,sCAAsC,GAC9C,mCAAmC,GACnC,kCAAkC,GAClC,kCAAkC,GAClC,QAAQ;EACVC,EAAAA,OAAO,EAAE,OAAA;EACX,CAAC,CAAA;EAED,MAAMC,WAAW,GAAG;IAClB,GAAGN,OAAO,CAACM,WAAW;EACtBL,EAAAA,OAAO,EAAE,gCAAA;EACX,CAAC,CAAA;;EAED;EACA;EACA;;EAEA,MAAMM,OAAO,SAASP,OAAO,CAAC;EAC5B;IACA,WAAWD,OAAOA,GAAG;EACnB,IAAA,OAAOA,OAAO,CAAA;EAChB,GAAA;IAEA,WAAWO,WAAWA,GAAG;EACvB,IAAA,OAAOA,WAAW,CAAA;EACpB,GAAA;IAEA,WAAWV,IAAIA,GAAG;EAChB,IAAA,OAAOA,IAAI,CAAA;EACb,GAAA;;EAEA;EACAY,EAAAA,cAAcA,GAAG;MACf,OAAO,IAAI,CAACC,SAAS,EAAE,IAAI,IAAI,CAACC,WAAW,EAAE,CAAA;EAC/C,GAAA;;EAEA;EACAC,EAAAA,sBAAsBA,GAAG;MACvB,OAAO;EACL,MAAA,CAACd,cAAc,GAAG,IAAI,CAACY,SAAS,EAAE;EAClC,MAAA,CAACX,gBAAgB,GAAG,IAAI,CAACY,WAAW,EAAC;OACtC,CAAA;EACH,GAAA;EAEAA,EAAAA,WAAWA,GAAG;MACZ,OAAO,IAAI,CAACE,wBAAwB,CAAC,IAAI,CAACC,OAAO,CAACZ,OAAO,CAAC,CAAA;EAC5D,GAAA;;EAEA;IACA,OAAOa,eAAeA,CAACC,MAAM,EAAE;EAC7B,IAAA,OAAO,IAAI,CAACC,IAAI,CAAC,YAAY;QAC3B,MAAMC,IAAI,GAAGV,OAAO,CAACW,mBAAmB,CAAC,IAAI,EAAEH,MAAM,CAAC,CAAA;EAEtD,MAAA,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;EAC9B,QAAA,OAAA;EACF,OAAA;EAEA,MAAA,IAAI,OAAOE,IAAI,CAACF,MAAM,CAAC,KAAK,WAAW,EAAE;EACvC,QAAA,MAAM,IAAII,SAAS,CAAE,CAAmBJ,iBAAAA,EAAAA,MAAO,GAAE,CAAC,CAAA;EACpD,OAAA;EAEAE,MAAAA,IAAI,CAACF,MAAM,CAAC,EAAE,CAAA;EAChB,KAAC,CAAC,CAAA;EACJ,GAAA;EACF,CAAA;;EAEA;EACA;EACA;;AAEAK,6BAAkB,CAACb,OAAO,CAAC;;;;;;;;"}

View File

@ -1,44 +1,38 @@
/*! /*!
* Bootstrap scrollspy.js v5.2.3 (https://getbootstrap.com/) * Bootstrap scrollspy.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./dom/selector-engine'), require('./dom/selector-engine.js'),
require('./base-component') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
['./util/index', './dom/event-handler', './dom/selector-engine', './base-component'], ['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Scrollspy = factory( (global.Scrollspy = factory(
global.Index, global.BaseComponent,
global.EventHandler, global.EventHandler,
global.SelectorEngine, global.SelectorEngine,
global.BaseComponent global.Index
))); )));
})(this, function (index, EventHandler, SelectorEngine, BaseComponent) { })(this, function (BaseComponent, EventHandler, SelectorEngine, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): scrollspy.js * Bootstrap scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -77,14 +71,16 @@
target: 'element', target: 'element',
threshold: 'array', threshold: 'array',
}; };
/** /**
* Class definition * Class definition
*/ */
class ScrollSpy extends BaseComponent__default.default { class ScrollSpy extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper super(element, config);
// this._element is the observablesContainer and config.target the menu links wrapper
this._targetLinks = new Map(); this._targetLinks = new Map();
this._observableSections = new Map(); this._observableSections = new Map();
this._rootElement = this._rootElement =
@ -96,87 +92,75 @@
parentScrollTop: 0, parentScrollTop: 0,
}; };
this.refresh(); // initialize this.refresh(); // initialize
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
refresh() { refresh() {
this._initializeTargetsAndObservables(); this._initializeTargetsAndObservables();
this._maybeEnableSmoothScroll(); this._maybeEnableSmoothScroll();
if (this._observer) { if (this._observer) {
this._observer.disconnect(); this._observer.disconnect();
} else { } else {
this._observer = this._getNewObserver(); this._observer = this._getNewObserver();
} }
for (const section of this._observableSections.values()) { for (const section of this._observableSections.values()) {
this._observer.observe(section); this._observer.observe(section);
} }
} }
dispose() { dispose() {
this._observer.disconnect(); this._observer.disconnect();
super.dispose(); super.dispose();
} // Private }
// Private
_configAfterMerge(config) { _configAfterMerge(config) {
// TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
config.target = index.getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only 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; config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
if (typeof config.threshold === 'string') { if (typeof config.threshold === 'string') {
config.threshold = config.threshold.split(',').map((value) => Number.parseFloat(value)); config.threshold = config.threshold.split(',').map((value) => Number.parseFloat(value));
} }
return config; return config;
} }
_maybeEnableSmoothScroll() { _maybeEnableSmoothScroll() {
if (!this._config.smoothScroll) { if (!this._config.smoothScroll) {
return; return;
} // unregister any previous listeners }
EventHandler__default.default.off(this._config.target, EVENT_CLICK); // unregister any previous listeners
EventHandler__default.default.on( EventHandler.off(this._config.target, EVENT_CLICK);
this._config.target, EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => {
EVENT_CLICK, const observableSection = this._observableSections.get(event.target.hash);
SELECTOR_TARGET_LINKS, if (observableSection) {
(event) => { event.preventDefault();
const observableSection = this._observableSections.get(event.target.hash); const root = this._rootElement || window;
const height = observableSection.offsetTop - this._element.offsetTop;
if (observableSection) { if (root.scrollTo) {
event.preventDefault(); root.scrollTo({
const root = this._rootElement || window; top: height,
const height = observableSection.offsetTop - this._element.offsetTop; behavior: 'smooth',
});
if (root.scrollTo) { return;
root.scrollTo({
top: height,
behavior: 'smooth',
});
return;
} // Chrome 60 doesn't support `scrollTo`
root.scrollTop = height;
} }
}
);
}
// Chrome 60 doesn't support `scrollTo`
root.scrollTop = height;
}
});
}
_getNewObserver() { _getNewObserver() {
const options = { const options = {
root: this._rootElement, root: this._rootElement,
@ -184,156 +168,130 @@
rootMargin: this._config.rootMargin, rootMargin: this._config.rootMargin,
}; };
return new IntersectionObserver((entries) => this._observerCallback(entries), options); return new IntersectionObserver((entries) => this._observerCallback(entries), options);
} // The logic of selection }
// The logic of selection
_observerCallback(entries) { _observerCallback(entries) {
const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`); const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`);
const activate = (entry) => { const activate = (entry) => {
this._previousScrollData.visibleEntryTop = entry.target.offsetTop; this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
this._process(targetElement(entry)); this._process(targetElement(entry));
}; };
const parentScrollTop = (this._rootElement || document.documentElement).scrollTop; const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop; const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
this._previousScrollData.parentScrollTop = parentScrollTop; this._previousScrollData.parentScrollTop = parentScrollTop;
for (const entry of entries) { for (const entry of entries) {
if (!entry.isIntersecting) { if (!entry.isIntersecting) {
this._activeTarget = null; this._activeTarget = null;
this._clearActiveClass(targetElement(entry)); this._clearActiveClass(targetElement(entry));
continue; continue;
} }
const entryIsLowerThanPrevious = const entryIsLowerThanPrevious =
entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
// if we are scrolling down, pick the bigger offsetTop
if (userScrollsDown && entryIsLowerThanPrevious) { if (userScrollsDown && entryIsLowerThanPrevious) {
activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration activate(entry);
// if parent isn't scrolled, let's keep the first visible item, breaking the iteration
if (!parentScrollTop) { if (!parentScrollTop) {
return; return;
} }
continue; continue;
} // if we are scrolling up, pick the smallest offsetTop }
// if we are scrolling up, pick the smallest offsetTop
if (!userScrollsDown && !entryIsLowerThanPrevious) { if (!userScrollsDown && !entryIsLowerThanPrevious) {
activate(entry); activate(entry);
} }
} }
} }
_initializeTargetsAndObservables() { _initializeTargetsAndObservables() {
this._targetLinks = new Map(); this._targetLinks = new Map();
this._observableSections = new Map(); this._observableSections = new Map();
const targetLinks = SelectorEngine__default.default.find( const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
SELECTOR_TARGET_LINKS,
this._config.target
);
for (const anchor of targetLinks) { for (const anchor of targetLinks) {
// ensure that the anchor has an id and is not disabled // ensure that the anchor has an id and is not disabled
if (!anchor.hash || index.isDisabled(anchor)) { if (!anchor.hash || index_js.isDisabled(anchor)) {
continue; continue;
} }
const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
const observableSection = SelectorEngine__default.default.findOne( // ensure that the observableSection exists & is visible
anchor.hash, if (index_js.isVisible(observableSection)) {
this._element this._targetLinks.set(decodeURI(anchor.hash), anchor);
); // ensure that the observableSection exists & is visible
if (index.isVisible(observableSection)) {
this._targetLinks.set(anchor.hash, anchor);
this._observableSections.set(anchor.hash, observableSection); this._observableSections.set(anchor.hash, observableSection);
} }
} }
} }
_process(target) { _process(target) {
if (this._activeTarget === target) { if (this._activeTarget === target) {
return; return;
} }
this._clearActiveClass(this._config.target); this._clearActiveClass(this._config.target);
this._activeTarget = target; this._activeTarget = target;
target.classList.add(CLASS_NAME_ACTIVE); target.classList.add(CLASS_NAME_ACTIVE);
this._activateParents(target); this._activateParents(target);
EventHandler.trigger(this._element, EVENT_ACTIVATE, {
EventHandler__default.default.trigger(this._element, EVENT_ACTIVATE, {
relatedTarget: target, relatedTarget: target,
}); });
} }
_activateParents(target) { _activateParents(target) {
// Activate dropdown parents // Activate dropdown parents
if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
SelectorEngine__default.default SelectorEngine.findOne(
.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)) SELECTOR_DROPDOWN_TOGGLE,
.classList.add(CLASS_NAME_ACTIVE); target.closest(SELECTOR_DROPDOWN)
).classList.add(CLASS_NAME_ACTIVE);
return; return;
} }
for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
for (const listGroup of SelectorEngine__default.default.parents(
target,
SELECTOR_NAV_LIST_GROUP
)) {
// Set triggered links parents as active // Set triggered links parents as active
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
for (const item of SelectorEngine__default.default.prev(listGroup, SELECTOR_LINK_ITEMS)) { for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
item.classList.add(CLASS_NAME_ACTIVE); item.classList.add(CLASS_NAME_ACTIVE);
} }
} }
} }
_clearActiveClass(parent) { _clearActiveClass(parent) {
parent.classList.remove(CLASS_NAME_ACTIVE); parent.classList.remove(CLASS_NAME_ACTIVE);
const activeNodes = SelectorEngine__default.default.find( const activeNodes = SelectorEngine.find(
`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, `${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`,
parent parent
); );
for (const node of activeNodes) { for (const node of activeNodes) {
node.classList.remove(CLASS_NAME_ACTIVE); node.classList.remove(CLASS_NAME_ACTIVE);
} }
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = ScrollSpy.getOrCreateInstance(this, config); const data = ScrollSpy.getOrCreateInstance(this, config);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => { EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
for (const spy of SelectorEngine__default.default.find(SELECTOR_DATA_SPY)) { for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
ScrollSpy.getOrCreateInstance(spy); ScrollSpy.getOrCreateInstance(spy);
} }
}); });
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(ScrollSpy); index_js.defineJQueryPlugin(ScrollSpy);
return ScrollSpy; return ScrollSpy;
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,44 +1,38 @@
/*! /*!
* Bootstrap tab.js v5.2.3 (https://getbootstrap.com/) * Bootstrap tab.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./dom/selector-engine'), require('./dom/selector-engine.js'),
require('./base-component') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
['./util/index', './dom/event-handler', './dom/selector-engine', './base-component'], ['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Tab = factory( (global.Tab = factory(
global.Index, global.BaseComponent,
global.EventHandler, global.EventHandler,
global.SelectorEngine, global.SelectorEngine,
global.BaseComponent global.Index
))); )));
})(this, function (index, EventHandler, SelectorEngine, BaseComponent) { })(this, function (BaseComponent, EventHandler, SelectorEngine, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): tab.js * Bootstrap tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -57,147 +51,139 @@
const ARROW_RIGHT_KEY = 'ArrowRight'; const ARROW_RIGHT_KEY = 'ArrowRight';
const ARROW_UP_KEY = 'ArrowUp'; const ARROW_UP_KEY = 'ArrowUp';
const ARROW_DOWN_KEY = 'ArrowDown'; const ARROW_DOWN_KEY = 'ArrowDown';
const HOME_KEY = 'Home';
const END_KEY = 'End';
const CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
const CLASS_DROPDOWN = 'dropdown'; const CLASS_DROPDOWN = 'dropdown';
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'; const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)'; const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
const SELECTOR_OUTER = '.nav-item, .list-group-item'; const SELECTOR_OUTER = '.nav-item, .list-group-item';
const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
const SELECTOR_DATA_TOGGLE = const SELECTOR_DATA_TOGGLE =
'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // todo:v6: could be only `tab` '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6
const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`; const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
/** /**
* Class definition * Class definition
*/ */
class Tab extends BaseComponent__default.default { class Tab extends BaseComponent {
constructor(element) { constructor(element) {
super(element); super(element);
this._parent = this._element.closest(SELECTOR_TAB_PANEL); this._parent = this._element.closest(SELECTOR_TAB_PANEL);
if (!this._parent) { if (!this._parent) {
return; // todo: should Throw exception on v6 return;
// TODO: should throw exception in v6
// throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`) // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
} // Set up initial aria attributes }
// Set up initial aria attributes
this._setInitialAttributes(this._parent, this._getChildren()); this._setInitialAttributes(this._parent, this._getChildren());
EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
}
EventHandler__default.default.on(this._element, EVENT_KEYDOWN, (event) => // Getters
this._keydown(event)
);
} // Getters
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
show() { show() {
// Shows this elem and deactivate the active sibling if exists // Shows this elem and deactivate the active sibling if exists
const innerElem = this._element; const innerElem = this._element;
if (this._elemIsActive(innerElem)) { if (this._elemIsActive(innerElem)) {
return; return;
} // Search for active tab on same parent to deactivate it
const active = this._getActiveElem();
const hideEvent = active
? EventHandler__default.default.trigger(active, EVENT_HIDE, {
relatedTarget: innerElem,
})
: null;
const showEvent = EventHandler__default.default.trigger(innerElem, EVENT_SHOW, {
relatedTarget: active,
});
if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {
return;
} }
// Search for active tab on same parent to deactivate it
const active = this._getActiveElem();
const hideEvent = active
? EventHandler.trigger(active, EVENT_HIDE, {
relatedTarget: innerElem,
})
: null;
const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, {
relatedTarget: active,
});
if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {
return;
}
this._deactivate(active, innerElem); this._deactivate(active, innerElem);
this._activate(innerElem, active); this._activate(innerElem, active);
} // Private }
// Private
_activate(element, relatedElem) { _activate(element, relatedElem) {
if (!element) { if (!element) {
return; return;
} }
element.classList.add(CLASS_NAME_ACTIVE); element.classList.add(CLASS_NAME_ACTIVE);
this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
this._activate(index.getElementFromSelector(element)); // Search and activate/show the proper section
const complete = () => { const complete = () => {
if (element.getAttribute('role') !== 'tab') { if (element.getAttribute('role') !== 'tab') {
element.classList.add(CLASS_NAME_SHOW); element.classList.add(CLASS_NAME_SHOW);
return; return;
} }
element.removeAttribute('tabindex'); element.removeAttribute('tabindex');
element.setAttribute('aria-selected', true); element.setAttribute('aria-selected', true);
this._toggleDropDown(element, true); this._toggleDropDown(element, true);
EventHandler.trigger(element, EVENT_SHOWN, {
EventHandler__default.default.trigger(element, EVENT_SHOWN, {
relatedTarget: relatedElem, relatedTarget: relatedElem,
}); });
}; };
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
} }
_deactivate(element, relatedElem) { _deactivate(element, relatedElem) {
if (!element) { if (!element) {
return; return;
} }
element.classList.remove(CLASS_NAME_ACTIVE); element.classList.remove(CLASS_NAME_ACTIVE);
element.blur(); element.blur();
this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too
this._deactivate(index.getElementFromSelector(element)); // Search and deactivate the shown section too
const complete = () => { const complete = () => {
if (element.getAttribute('role') !== 'tab') { if (element.getAttribute('role') !== 'tab') {
element.classList.remove(CLASS_NAME_SHOW); element.classList.remove(CLASS_NAME_SHOW);
return; return;
} }
element.setAttribute('aria-selected', false); element.setAttribute('aria-selected', false);
element.setAttribute('tabindex', '-1'); element.setAttribute('tabindex', '-1');
this._toggleDropDown(element, false); this._toggleDropDown(element, false);
EventHandler.trigger(element, EVENT_HIDDEN, {
EventHandler__default.default.trigger(element, EVENT_HIDDEN, {
relatedTarget: relatedElem, relatedTarget: relatedElem,
}); });
}; };
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE)); this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));
} }
_keydown(event) { _keydown(event) {
if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) { if (
![
ARROW_LEFT_KEY,
ARROW_RIGHT_KEY,
ARROW_UP_KEY,
ARROW_DOWN_KEY,
HOME_KEY,
END_KEY,
].includes(event.key)
) {
return; return;
} }
event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
event.preventDefault(); event.preventDefault();
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key); const children = this._getChildren().filter((element) => !index_js.isDisabled(element));
const nextActiveElement = index.getNextActiveElement( let nextActiveElement;
this._getChildren().filter((element) => !index.isDisabled(element)), if ([HOME_KEY, END_KEY].includes(event.key)) {
event.target, nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
isNext, } else {
true const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
); nextActiveElement = index_js.getNextActiveElement(children, event.target, isNext, true);
}
if (nextActiveElement) { if (nextActiveElement) {
nextActiveElement.focus({ nextActiveElement.focus({
preventScroll: true, preventScroll: true,
@ -205,142 +191,115 @@
Tab.getOrCreateInstance(nextActiveElement).show(); Tab.getOrCreateInstance(nextActiveElement).show();
} }
} }
_getChildren() { _getChildren() {
// collection of inner elements // collection of inner elements
return SelectorEngine__default.default.find(SELECTOR_INNER_ELEM, this._parent); return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
} }
_getActiveElem() { _getActiveElem() {
return this._getChildren().find((child) => this._elemIsActive(child)) || null; return this._getChildren().find((child) => this._elemIsActive(child)) || null;
} }
_setInitialAttributes(parent, children) { _setInitialAttributes(parent, children) {
this._setAttributeIfNotExists(parent, 'role', 'tablist'); this._setAttributeIfNotExists(parent, 'role', 'tablist');
for (const child of children) { for (const child of children) {
this._setInitialAttributesOnChild(child); this._setInitialAttributesOnChild(child);
} }
} }
_setInitialAttributesOnChild(child) { _setInitialAttributesOnChild(child) {
child = this._getInnerElement(child); child = this._getInnerElement(child);
const isActive = this._elemIsActive(child); const isActive = this._elemIsActive(child);
const outerElem = this._getOuterElement(child); const outerElem = this._getOuterElement(child);
child.setAttribute('aria-selected', isActive); child.setAttribute('aria-selected', isActive);
if (outerElem !== child) { if (outerElem !== child) {
this._setAttributeIfNotExists(outerElem, 'role', 'presentation'); this._setAttributeIfNotExists(outerElem, 'role', 'presentation');
} }
if (!isActive) { if (!isActive) {
child.setAttribute('tabindex', '-1'); child.setAttribute('tabindex', '-1');
} }
this._setAttributeIfNotExists(child, 'role', 'tab');
this._setAttributeIfNotExists(child, 'role', 'tab'); // set attributes to the related panel too // set attributes to the related panel too
this._setInitialAttributesOnTargetPanel(child); this._setInitialAttributesOnTargetPanel(child);
} }
_setInitialAttributesOnTargetPanel(child) { _setInitialAttributesOnTargetPanel(child) {
const target = index.getElementFromSelector(child); const target = SelectorEngine.getElementFromSelector(child);
if (!target) { if (!target) {
return; return;
} }
this._setAttributeIfNotExists(target, 'role', 'tabpanel'); this._setAttributeIfNotExists(target, 'role', 'tabpanel');
if (child.id) { if (child.id) {
this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`); this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);
} }
} }
_toggleDropDown(element, open) { _toggleDropDown(element, open) {
const outerElem = this._getOuterElement(element); const outerElem = this._getOuterElement(element);
if (!outerElem.classList.contains(CLASS_DROPDOWN)) { if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
return; return;
} }
const toggle = (selector, className) => { const toggle = (selector, className) => {
const element = SelectorEngine__default.default.findOne(selector, outerElem); const element = SelectorEngine.findOne(selector, outerElem);
if (element) { if (element) {
element.classList.toggle(className, open); element.classList.toggle(className, open);
} }
}; };
toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE); toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW); toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW);
outerElem.setAttribute('aria-expanded', open); outerElem.setAttribute('aria-expanded', open);
} }
_setAttributeIfNotExists(element, attribute, value) { _setAttributeIfNotExists(element, attribute, value) {
if (!element.hasAttribute(attribute)) { if (!element.hasAttribute(attribute)) {
element.setAttribute(attribute, value); element.setAttribute(attribute, value);
} }
} }
_elemIsActive(elem) { _elemIsActive(elem) {
return elem.classList.contains(CLASS_NAME_ACTIVE); return elem.classList.contains(CLASS_NAME_ACTIVE);
} // Try to get the inner element (usually the .nav-link) }
// Try to get the inner element (usually the .nav-link)
_getInnerElement(elem) { _getInnerElement(elem) {
return elem.matches(SELECTOR_INNER_ELEM) return elem.matches(SELECTOR_INNER_ELEM)
? elem ? elem
: SelectorEngine__default.default.findOne(SELECTOR_INNER_ELEM, elem); : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
} // Try to get the outer element (usually the .nav-item) }
// Try to get the outer element (usually the .nav-item)
_getOuterElement(elem) { _getOuterElement(elem) {
return elem.closest(SELECTOR_OUTER) || elem; return elem.closest(SELECTOR_OUTER) || elem;
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Tab.getOrCreateInstance(this); const data = Tab.getOrCreateInstance(this);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
EventHandler__default.default.on( EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
document, if (['A', 'AREA'].includes(this.tagName)) {
EVENT_CLICK_DATA_API, event.preventDefault();
SELECTOR_DATA_TOGGLE,
function (event) {
if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault();
}
if (index.isDisabled(this)) {
return;
}
Tab.getOrCreateInstance(this).show();
} }
); if (index_js.isDisabled(this)) {
return;
}
Tab.getOrCreateInstance(this).show();
});
/** /**
* Initialize on focus * Initialize on focus
*/ */
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => { for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
for (const element of SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
Tab.getOrCreateInstance(element); Tab.getOrCreateInstance(element);
} }
}); });
@ -348,7 +307,7 @@
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Tab); index_js.defineJQueryPlugin(Tab);
return Tab; return Tab;
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,43 +1,38 @@
/*! /*!
* Bootstrap toast.js v5.2.3 (https://getbootstrap.com/) * Bootstrap toast.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./util/index'), require('./base-component.js'),
require('./dom/event-handler'), require('./dom/event-handler.js'),
require('./base-component'), require('./util/component-functions.js'),
require('./util/component-functions') require('./util/index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
['./util/index', './dom/event-handler', './base-component', './util/component-functions'], ['./base-component', './dom/event-handler', './util/component-functions', './util/index'],
factory factory
) )
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Toast = factory( (global.Toast = factory(
global.Index,
global.EventHandler,
global.BaseComponent, global.BaseComponent,
global.ComponentFunctions global.EventHandler,
global.ComponentFunctions,
global.Index
))); )));
})(this, function (index, EventHandler, BaseComponent, componentFunctions) { })(this, function (BaseComponent, EventHandler, componentFunctions_js, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): toast.js * Bootstrap toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -55,7 +50,6 @@
const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`;
const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
const CLASS_NAME_SHOWING = 'showing'; const CLASS_NAME_SHOWING = 'showing';
const DefaultType = { const DefaultType = {
@ -68,114 +62,91 @@
autohide: true, autohide: true,
delay: 5000, delay: 5000,
}; };
/** /**
* Class definition * Class definition
*/ */
class Toast extends BaseComponent__default.default { class Toast extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element, config); super(element, config);
this._timeout = null; this._timeout = null;
this._hasMouseInteraction = false; this._hasMouseInteraction = false;
this._hasKeyboardInteraction = false; this._hasKeyboardInteraction = false;
this._setListeners(); this._setListeners();
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
show() { show() {
const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW); const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
if (showEvent.defaultPrevented) { if (showEvent.defaultPrevented) {
return; return;
} }
this._clearTimeout(); this._clearTimeout();
if (this._config.animation) { if (this._config.animation) {
this._element.classList.add(CLASS_NAME_FADE); this._element.classList.add(CLASS_NAME_FADE);
} }
const complete = () => { const complete = () => {
this._element.classList.remove(CLASS_NAME_SHOWING); this._element.classList.remove(CLASS_NAME_SHOWING);
EventHandler.trigger(this._element, EVENT_SHOWN);
EventHandler__default.default.trigger(this._element, EVENT_SHOWN);
this._maybeScheduleHide(); this._maybeScheduleHide();
}; };
this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
index_js.reflow(this._element);
index.reflow(this._element);
this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING); this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
this._queueCallback(complete, this._element, this._config.animation); this._queueCallback(complete, this._element, this._config.animation);
} }
hide() { hide() {
if (!this.isShown()) { if (!this.isShown()) {
return; return;
} }
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; return;
} }
const complete = () => { const complete = () => {
this._element.classList.add(CLASS_NAME_HIDE); // @deprecated this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
EventHandler.trigger(this._element, EVENT_HIDDEN);
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
}; };
this._element.classList.add(CLASS_NAME_SHOWING); this._element.classList.add(CLASS_NAME_SHOWING);
this._queueCallback(complete, this._element, this._config.animation); this._queueCallback(complete, this._element, this._config.animation);
} }
dispose() { dispose() {
this._clearTimeout(); this._clearTimeout();
if (this.isShown()) { if (this.isShown()) {
this._element.classList.remove(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOW);
} }
super.dispose(); super.dispose();
} }
isShown() { isShown() {
return this._element.classList.contains(CLASS_NAME_SHOW); return this._element.classList.contains(CLASS_NAME_SHOW);
} // Private }
// Private
_maybeScheduleHide() { _maybeScheduleHide() {
if (!this._config.autohide) { if (!this._config.autohide) {
return; return;
} }
if (this._hasMouseInteraction || this._hasKeyboardInteraction) { if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
return; return;
} }
this._timeout = setTimeout(() => { this._timeout = setTimeout(() => {
this.hide(); this.hide();
}, this._config.delay); }, this._config.delay);
} }
_onInteraction(event, isInteracting) { _onInteraction(event, isInteracting) {
switch (event.type) { switch (event.type) {
case 'mouseover': case 'mouseover':
@ -183,73 +154,58 @@
this._hasMouseInteraction = isInteracting; this._hasMouseInteraction = isInteracting;
break; break;
} }
case 'focusin': case 'focusin':
case 'focusout': { case 'focusout': {
this._hasKeyboardInteraction = isInteracting; this._hasKeyboardInteraction = isInteracting;
break; break;
} }
} }
if (isInteracting) { if (isInteracting) {
this._clearTimeout(); this._clearTimeout();
return; return;
} }
const nextElement = event.relatedTarget; const nextElement = event.relatedTarget;
if (this._element === nextElement || this._element.contains(nextElement)) { if (this._element === nextElement || this._element.contains(nextElement)) {
return; return;
} }
this._maybeScheduleHide(); this._maybeScheduleHide();
} }
_setListeners() { _setListeners() {
EventHandler__default.default.on(this._element, EVENT_MOUSEOVER, (event) => EventHandler.on(this._element, EVENT_MOUSEOVER, (event) => this._onInteraction(event, true));
this._onInteraction(event, true) EventHandler.on(this._element, EVENT_MOUSEOUT, (event) => this._onInteraction(event, false));
); EventHandler.on(this._element, EVENT_FOCUSIN, (event) => this._onInteraction(event, true));
EventHandler__default.default.on(this._element, EVENT_MOUSEOUT, (event) => EventHandler.on(this._element, EVENT_FOCUSOUT, (event) => this._onInteraction(event, false));
this._onInteraction(event, false)
);
EventHandler__default.default.on(this._element, EVENT_FOCUSIN, (event) =>
this._onInteraction(event, true)
);
EventHandler__default.default.on(this._element, EVENT_FOCUSOUT, (event) =>
this._onInteraction(event, false)
);
} }
_clearTimeout() { _clearTimeout() {
clearTimeout(this._timeout); clearTimeout(this._timeout);
this._timeout = null; this._timeout = null;
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Toast.getOrCreateInstance(this, config); const data = Toast.getOrCreateInstance(this, config);
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](this); data[config](this);
} }
}); });
} }
} }
/** /**
* Data API implementation * Data API implementation
*/ */
componentFunctions.enableDismissTrigger(Toast); componentFunctions_js.enableDismissTrigger(Toast);
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Toast); index_js.defineJQueryPlugin(Toast);
return Toast; return Toast;
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,28 +1,28 @@
/*! /*!
* Bootstrap tooltip.js v5.2.3 (https://getbootstrap.com/) * Bootstrap tooltip.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('@popperjs/core'), require('@popperjs/core'),
require('./util/index'), require('./base-component.js'),
require('./util/sanitizer'), require('./dom/event-handler.js'),
require('./dom/event-handler'), require('./dom/manipulator.js'),
require('./dom/manipulator'), require('./util/index.js'),
require('./base-component'), require('./util/sanitizer.js'),
require('./util/template-factory') require('./util/template-factory.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define( ? define(
[ [
'@popperjs/core', '@popperjs/core',
'./util/index', './base-component',
'./util/sanitizer',
'./dom/event-handler', './dom/event-handler',
'./dom/manipulator', './dom/manipulator',
'./base-component', './util/index',
'./util/sanitizer',
'./util/template-factory', './util/template-factory',
], ],
factory factory
@ -30,23 +30,27 @@
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Tooltip = factory( (global.Tooltip = factory(
global['@popperjs/core'], global['@popperjs/core'],
global.Index, global.BaseComponent,
global.Sanitizer,
global.EventHandler, global.EventHandler,
global.Manipulator, global.Manipulator,
global.BaseComponent, global.Index,
global.Sanitizer,
global.TemplateFactory global.TemplateFactory
))); )));
})( })(
this, this,
function (Popper, index, sanitizer, EventHandler, Manipulator, BaseComponent, TemplateFactory) { function (
Popper,
BaseComponent,
EventHandler,
Manipulator,
index_js,
sanitizer_js,
TemplateFactory
) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) => function _interopNamespaceDefault(e) {
e && typeof e === 'object' && 'default' in e ? e : { default: e };
function _interopNamespace(e) {
if (e && e.__esModule) return e;
const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
if (e) { if (e) {
for (const k in e) { for (const k in e) {
@ -69,18 +73,15 @@
return Object.freeze(n); return Object.freeze(n);
} }
const Popper__namespace = /*#__PURE__*/ _interopNamespace(Popper); const Popper__namespace = /*#__PURE__*/ _interopNamespaceDefault(Popper);
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
const BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
const TemplateFactory__default = /*#__PURE__*/ _interopDefaultLegacy(TemplateFactory);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): tooltip.js * Bootstrap tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -110,12 +111,12 @@
const AttachmentMap = { const AttachmentMap = {
AUTO: 'auto', AUTO: 'auto',
TOP: 'top', TOP: 'top',
RIGHT: index.isRTL() ? 'left' : 'right', RIGHT: index_js.isRTL() ? 'left' : 'right',
BOTTOM: 'bottom', BOTTOM: 'bottom',
LEFT: index.isRTL() ? 'right' : 'left', LEFT: index_js.isRTL() ? 'right' : 'left',
}; };
const Default = { const Default = {
allowList: sanitizer.DefaultAllowlist, allowList: sanitizer_js.DefaultAllowlist,
animation: true, animation: true,
boundary: 'clippingParents', boundary: 'clippingParents',
container: false, container: false,
@ -123,7 +124,7 @@
delay: 0, delay: 0,
fallbackPlacements: ['top', 'right', 'bottom', 'left'], fallbackPlacements: ['top', 'right', 'bottom', 'left'],
html: false, html: false,
offset: [0, 0], offset: [0, 6],
placement: 'top', placement: 'top',
popperConfig: null, popperConfig: null,
sanitize: true, sanitize: true,
@ -156,184 +157,150 @@
title: '(string|element|function)', title: '(string|element|function)',
trigger: 'string', trigger: 'string',
}; };
/** /**
* Class definition * Class definition
*/ */
class Tooltip extends BaseComponent__default.default { class Tooltip extends BaseComponent {
constructor(element, config) { constructor(element, config) {
if (typeof Popper__namespace === 'undefined') { if (typeof Popper__namespace === 'undefined') {
throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
} }
super(element, config);
super(element, config); // Private // Private
this._isEnabled = true; this._isEnabled = true;
this._timeout = 0; this._timeout = 0;
this._isHovered = null; this._isHovered = null;
this._activeTrigger = {}; this._activeTrigger = {};
this._popper = null; this._popper = null;
this._templateFactory = null; this._templateFactory = null;
this._newContent = null; // Protected this._newContent = null;
// Protected
this.tip = null; this.tip = null;
this._setListeners(); this._setListeners();
if (!this._config.selector) { if (!this._config.selector) {
this._fixTitle(); this._fixTitle();
} }
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
enable() { enable() {
this._isEnabled = true; this._isEnabled = true;
} }
disable() { disable() {
this._isEnabled = false; this._isEnabled = false;
} }
toggleEnabled() { toggleEnabled() {
this._isEnabled = !this._isEnabled; this._isEnabled = !this._isEnabled;
} }
toggle() { toggle() {
if (!this._isEnabled) { if (!this._isEnabled) {
return; return;
} }
this._activeTrigger.click = !this._activeTrigger.click; this._activeTrigger.click = !this._activeTrigger.click;
if (this._isShown()) { if (this._isShown()) {
this._leave(); this._leave();
return; return;
} }
this._enter(); this._enter();
} }
dispose() { dispose() {
clearTimeout(this._timeout); clearTimeout(this._timeout);
EventHandler__default.default.off( EventHandler.off(
this._element.closest(SELECTOR_MODAL), this._element.closest(SELECTOR_MODAL),
EVENT_MODAL_HIDE, EVENT_MODAL_HIDE,
this._hideModalHandler this._hideModalHandler
); );
if (this._element.getAttribute('data-bs-original-title')) { if (this._element.getAttribute('data-bs-original-title')) {
this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title')); this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
} }
this._disposePopper(); this._disposePopper();
super.dispose(); super.dispose();
} }
show() { show() {
if (this._element.style.display === 'none') { if (this._element.style.display === 'none') {
throw new Error('Please use show on visible elements'); throw new Error('Please use show on visible elements');
} }
if (!(this._isWithContent() && this._isEnabled)) { if (!(this._isWithContent() && this._isEnabled)) {
return; return;
} }
const showEvent = EventHandler.trigger(
const showEvent = EventHandler__default.default.trigger(
this._element, this._element,
this.constructor.eventName(EVENT_SHOW) this.constructor.eventName(EVENT_SHOW)
); );
const shadowRoot = index.findShadowRoot(this._element); const shadowRoot = index_js.findShadowRoot(this._element);
const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains( const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(
this._element this._element
); );
if (showEvent.defaultPrevented || !isInTheDom) { if (showEvent.defaultPrevented || !isInTheDom) {
return; return;
} // todo v6 remove this OR make it optional
this._disposePopper();
const tip = this._getTipElement();
this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
const { container } = this._config;
if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
container.append(tip);
EventHandler__default.default.trigger(
this._element,
this.constructor.eventName(EVENT_INSERTED)
);
} }
// TODO: v6 remove this or make it optional
this._disposePopper();
const tip = this._getTipElement();
this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
const { container } = this._config;
if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
container.append(tip);
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
}
this._popper = this._createPopper(tip); this._popper = this._createPopper(tip);
tip.classList.add(CLASS_NAME_SHOW); // If this is a touch-enabled device we add extra tip.classList.add(CLASS_NAME_SHOW);
// If this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children; // empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS // only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
if ('ontouchstart' in document.documentElement) { if ('ontouchstart' in document.documentElement) {
for (const element of [].concat(...document.body.children)) { for (const element of [].concat(...document.body.children)) {
EventHandler__default.default.on(element, 'mouseover', index.noop); EventHandler.on(element, 'mouseover', index_js.noop);
} }
} }
const complete = () => { const complete = () => {
EventHandler__default.default.trigger( EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN));
this._element,
this.constructor.eventName(EVENT_SHOWN)
);
if (this._isHovered === false) { if (this._isHovered === false) {
this._leave(); this._leave();
} }
this._isHovered = false; this._isHovered = false;
}; };
this._queueCallback(complete, this.tip, this._isAnimated()); this._queueCallback(complete, this.tip, this._isAnimated());
} }
hide() { hide() {
if (!this._isShown()) { if (!this._isShown()) {
return; return;
} }
const hideEvent = EventHandler.trigger(
const hideEvent = EventHandler__default.default.trigger(
this._element, this._element,
this.constructor.eventName(EVENT_HIDE) this.constructor.eventName(EVENT_HIDE)
); );
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; return;
} }
const tip = this._getTipElement(); const tip = this._getTipElement();
tip.classList.remove(CLASS_NAME_SHOW);
tip.classList.remove(CLASS_NAME_SHOW); // If this is a touch-enabled device we remove the extra // If this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support // empty mouseover listeners we added for iOS support
if ('ontouchstart' in document.documentElement) { if ('ontouchstart' in document.documentElement) {
for (const element of [].concat(...document.body.children)) { for (const element of [].concat(...document.body.children)) {
EventHandler__default.default.off(element, 'mouseover', index.noop); EventHandler.off(element, 'mouseover', index_js.noop);
} }
} }
this._activeTrigger[TRIGGER_CLICK] = false; this._activeTrigger[TRIGGER_CLICK] = false;
this._activeTrigger[TRIGGER_FOCUS] = false; this._activeTrigger[TRIGGER_FOCUS] = false;
this._activeTrigger[TRIGGER_HOVER] = false; this._activeTrigger[TRIGGER_HOVER] = false;
@ -343,75 +310,59 @@
if (this._isWithActiveTrigger()) { if (this._isWithActiveTrigger()) {
return; return;
} }
if (!this._isHovered) { if (!this._isHovered) {
this._disposePopper(); this._disposePopper();
} }
this._element.removeAttribute('aria-describedby'); this._element.removeAttribute('aria-describedby');
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN));
EventHandler__default.default.trigger(
this._element,
this.constructor.eventName(EVENT_HIDDEN)
);
}; };
this._queueCallback(complete, this.tip, this._isAnimated()); this._queueCallback(complete, this.tip, this._isAnimated());
} }
update() { update() {
if (this._popper) { if (this._popper) {
this._popper.update(); this._popper.update();
} }
} // Protected }
// Protected
_isWithContent() { _isWithContent() {
return Boolean(this._getTitle()); return Boolean(this._getTitle());
} }
_getTipElement() { _getTipElement() {
if (!this.tip) { if (!this.tip) {
this.tip = this._createTipElement(this._newContent || this._getContentForTemplate()); this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
} }
return this.tip; return this.tip;
} }
_createTipElement(content) { _createTipElement(content) {
const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6 const tip = this._getTemplateFactory(content).toHtml();
// TODO: remove this check in v6
if (!tip) { if (!tip) {
return null; return null;
} }
tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); // todo: on v6 the following can be achieved with CSS only // TODO: v6 the following can be achieved with CSS only
tip.classList.add(`bs-${this.constructor.NAME}-auto`); tip.classList.add(`bs-${this.constructor.NAME}-auto`);
const tipId = index.getUID(this.constructor.NAME).toString(); const tipId = index_js.getUID(this.constructor.NAME).toString();
tip.setAttribute('id', tipId); tip.setAttribute('id', tipId);
if (this._isAnimated()) { if (this._isAnimated()) {
tip.classList.add(CLASS_NAME_FADE); tip.classList.add(CLASS_NAME_FADE);
} }
return tip; return tip;
} }
setContent(content) { setContent(content) {
this._newContent = content; this._newContent = content;
if (this._isShown()) { if (this._isShown()) {
this._disposePopper(); this._disposePopper();
this.show(); this.show();
} }
} }
_getTemplateFactory(content) { _getTemplateFactory(content) {
if (this._templateFactory) { if (this._templateFactory) {
this._templateFactory.changeContent(content); this._templateFactory.changeContent(content);
} else { } else {
this._templateFactory = new TemplateFactory__default.default({ this._templateFactory = new TemplateFactory({
...this._config, ...this._config,
// the `content` var has to be after `this._config` // the `content` var has to be after `this._config`
// to override config.content in case of popover // to override config.content in case of popover
@ -419,43 +370,35 @@
extraClass: this._resolvePossibleFunction(this._config.customClass), extraClass: this._resolvePossibleFunction(this._config.customClass),
}); });
} }
return this._templateFactory; return this._templateFactory;
} }
_getContentForTemplate() { _getContentForTemplate() {
return { return {
[SELECTOR_TOOLTIP_INNER]: this._getTitle(), [SELECTOR_TOOLTIP_INNER]: this._getTitle(),
}; };
} }
_getTitle() { _getTitle() {
return ( return (
this._resolvePossibleFunction(this._config.title) || this._resolvePossibleFunction(this._config.title) ||
this._element.getAttribute('data-bs-original-title') this._element.getAttribute('data-bs-original-title')
); );
} // Private }
// Private
_initializeOnDelegatedTarget(event) { _initializeOnDelegatedTarget(event) {
return this.constructor.getOrCreateInstance( return this.constructor.getOrCreateInstance(
event.delegateTarget, event.delegateTarget,
this._getDelegateConfig() this._getDelegateConfig()
); );
} }
_isAnimated() { _isAnimated() {
return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE)); return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE));
} }
_isShown() { _isShown() {
return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW); return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW);
} }
_createPopper(tip) { _createPopper(tip) {
const placement = const placement = index_js.execute(this._config.placement, [this, tip, this._element]);
typeof this._config.placement === 'function'
? this._config.placement.call(this, tip, this._element)
: this._config.placement;
const attachment = AttachmentMap[placement.toUpperCase()]; const attachment = AttachmentMap[placement.toUpperCase()];
return Popper__namespace.createPopper( return Popper__namespace.createPopper(
this._element, this._element,
@ -463,25 +406,19 @@
this._getPopperConfig(attachment) this._getPopperConfig(attachment)
); );
} }
_getOffset() { _getOffset() {
const { offset } = this._config; const { offset } = this._config;
if (typeof offset === 'string') { if (typeof offset === 'string') {
return offset.split(',').map((value) => Number.parseInt(value, 10)); return offset.split(',').map((value) => Number.parseInt(value, 10));
} }
if (typeof offset === 'function') { if (typeof offset === 'function') {
return (popperData) => offset(popperData, this._element); return (popperData) => offset(popperData, this._element);
} }
return offset; return offset;
} }
_resolvePossibleFunction(arg) { _resolvePossibleFunction(arg) {
return typeof arg === 'function' ? arg.call(this._element) : arg; return index_js.execute(arg, [this._element]);
} }
_getPopperConfig(attachment) { _getPopperConfig(attachment) {
const defaultBsPopperConfig = { const defaultBsPopperConfig = {
placement: attachment, placement: attachment,
@ -524,24 +461,19 @@
}; };
return { return {
...defaultBsPopperConfig, ...defaultBsPopperConfig,
...(typeof this._config.popperConfig === 'function' ...index_js.execute(this._config.popperConfig, [defaultBsPopperConfig]),
? this._config.popperConfig(defaultBsPopperConfig)
: this._config.popperConfig),
}; };
} }
_setListeners() { _setListeners() {
const triggers = this._config.trigger.split(' '); const triggers = this._config.trigger.split(' ');
for (const trigger of triggers) { for (const trigger of triggers) {
if (trigger === 'click') { if (trigger === 'click') {
EventHandler__default.default.on( EventHandler.on(
this._element, this._element,
this.constructor.eventName(EVENT_CLICK), this.constructor.eventName(EVENT_CLICK),
this._config.selector, this._config.selector,
(event) => { (event) => {
const context = this._initializeOnDelegatedTarget(event); const context = this._initializeOnDelegatedTarget(event);
context.toggle(); context.toggle();
} }
); );
@ -554,194 +486,152 @@
trigger === TRIGGER_HOVER trigger === TRIGGER_HOVER
? this.constructor.eventName(EVENT_MOUSELEAVE) ? this.constructor.eventName(EVENT_MOUSELEAVE)
: this.constructor.eventName(EVENT_FOCUSOUT); : this.constructor.eventName(EVENT_FOCUSOUT);
EventHandler__default.default.on( EventHandler.on(this._element, eventIn, this._config.selector, (event) => {
this._element, const context = this._initializeOnDelegatedTarget(event);
eventIn, context._activeTrigger[
this._config.selector, event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER
(event) => { ] = true;
const context = this._initializeOnDelegatedTarget(event); context._enter();
});
context._activeTrigger[ EventHandler.on(this._element, eventOut, this._config.selector, (event) => {
event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER const context = this._initializeOnDelegatedTarget(event);
] = true; context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =
context._element.contains(event.relatedTarget);
context._enter(); context._leave();
} });
);
EventHandler__default.default.on(
this._element,
eventOut,
this._config.selector,
(event) => {
const context = this._initializeOnDelegatedTarget(event);
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =
context._element.contains(event.relatedTarget);
context._leave();
}
);
} }
} }
this._hideModalHandler = () => { this._hideModalHandler = () => {
if (this._element) { if (this._element) {
this.hide(); this.hide();
} }
}; };
EventHandler.on(
EventHandler__default.default.on(
this._element.closest(SELECTOR_MODAL), this._element.closest(SELECTOR_MODAL),
EVENT_MODAL_HIDE, EVENT_MODAL_HIDE,
this._hideModalHandler this._hideModalHandler
); );
} }
_fixTitle() { _fixTitle() {
const title = this._element.getAttribute('title'); const title = this._element.getAttribute('title');
if (!title) { if (!title) {
return; return;
} }
if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) { if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {
this._element.setAttribute('aria-label', title); this._element.setAttribute('aria-label', title);
} }
this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility
this._element.removeAttribute('title'); this._element.removeAttribute('title');
} }
_enter() { _enter() {
if (this._isShown() || this._isHovered) { if (this._isShown() || this._isHovered) {
this._isHovered = true; this._isHovered = true;
return; return;
} }
this._isHovered = true; this._isHovered = true;
this._setTimeout(() => { this._setTimeout(() => {
if (this._isHovered) { if (this._isHovered) {
this.show(); this.show();
} }
}, this._config.delay.show); }, this._config.delay.show);
} }
_leave() { _leave() {
if (this._isWithActiveTrigger()) { if (this._isWithActiveTrigger()) {
return; return;
} }
this._isHovered = false; this._isHovered = false;
this._setTimeout(() => { this._setTimeout(() => {
if (!this._isHovered) { if (!this._isHovered) {
this.hide(); this.hide();
} }
}, this._config.delay.hide); }, this._config.delay.hide);
} }
_setTimeout(handler, timeout) { _setTimeout(handler, timeout) {
clearTimeout(this._timeout); clearTimeout(this._timeout);
this._timeout = setTimeout(handler, timeout); this._timeout = setTimeout(handler, timeout);
} }
_isWithActiveTrigger() { _isWithActiveTrigger() {
return Object.values(this._activeTrigger).includes(true); return Object.values(this._activeTrigger).includes(true);
} }
_getConfig(config) { _getConfig(config) {
const dataAttributes = Manipulator__default.default.getDataAttributes(this._element); const dataAttributes = Manipulator.getDataAttributes(this._element);
for (const dataAttribute of Object.keys(dataAttributes)) { for (const dataAttribute of Object.keys(dataAttributes)) {
if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) { if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
delete dataAttributes[dataAttribute]; delete dataAttributes[dataAttribute];
} }
} }
config = {
config = { ...dataAttributes, ...(typeof config === 'object' && config ? config : {}) }; ...dataAttributes,
...(typeof config === 'object' && config ? config : {}),
};
config = this._mergeConfigObj(config); config = this._mergeConfigObj(config);
config = this._configAfterMerge(config); config = this._configAfterMerge(config);
this._typeCheckConfig(config); this._typeCheckConfig(config);
return config; return config;
} }
_configAfterMerge(config) { _configAfterMerge(config) {
config.container = config.container =
config.container === false ? document.body : index.getElement(config.container); config.container === false ? document.body : index_js.getElement(config.container);
if (typeof config.delay === 'number') { if (typeof config.delay === 'number') {
config.delay = { config.delay = {
show: config.delay, show: config.delay,
hide: config.delay, hide: config.delay,
}; };
} }
if (typeof config.title === 'number') { if (typeof config.title === 'number') {
config.title = config.title.toString(); config.title = config.title.toString();
} }
if (typeof config.content === 'number') { if (typeof config.content === 'number') {
config.content = config.content.toString(); config.content = config.content.toString();
} }
return config; return config;
} }
_getDelegateConfig() { _getDelegateConfig() {
const config = {}; const config = {};
for (const [key, value] of Object.entries(this._config)) {
for (const key in this._config) { if (this.constructor.Default[key] !== value) {
if (this.constructor.Default[key] !== this._config[key]) { config[key] = value;
config[key] = this._config[key];
} }
} }
config.selector = false; config.selector = false;
config.trigger = 'manual'; // In the future can be replaced with: config.trigger = 'manual';
// In the future can be replaced with:
// const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
// `Object.fromEntries(keysWithDifferentValues)` // `Object.fromEntries(keysWithDifferentValues)`
return config; return config;
} }
_disposePopper() { _disposePopper() {
if (this._popper) { if (this._popper) {
this._popper.destroy(); this._popper.destroy();
this._popper = null; this._popper = null;
} }
if (this.tip) { if (this.tip) {
this.tip.remove(); this.tip.remove();
this.tip = null; this.tip = null;
} }
} // Static }
// Static
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Tooltip.getOrCreateInstance(this, config); const data = Tooltip.getOrCreateInstance(this, config);
if (typeof config !== 'string') { if (typeof config !== 'string') {
return; return;
} }
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`); throw new TypeError(`No method named "${config}"`);
} }
data[config](); data[config]();
}); });
} }
} }
/** /**
* jQuery * jQuery
*/ */
index.defineJQueryPlugin(Tooltip); index_js.defineJQueryPlugin(Tooltip);
return Tooltip; return Tooltip;
} }

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,29 @@
/*! /*!
* Bootstrap backdrop.js v5.2.3 (https://getbootstrap.com/) * Bootstrap backdrop.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('../dom/event-handler'), require('../dom/event-handler.js'),
require('./index'), require('./config.js'),
require('./config') require('./index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['../dom/event-handler', './index', './config'], factory) ? define(['../dom/event-handler', './config', './index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Backdrop = factory(global.EventHandler, global.Index, global.Config))); (global.Backdrop = factory(global.EventHandler, global.Config, global.Index)));
})(this, function (EventHandler, index, Config) { })(this, function (EventHandler, Config, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const Config__default = /*#__PURE__*/ _interopDefaultLegacy(Config);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/backdrop.js * Bootstrap util/backdrop.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -45,6 +40,7 @@
// if false, we use the backdrop helper without adding any element to the dom // if false, we use the backdrop helper without adding any element to the dom
rootElement: 'body', // give the choice to place backdrop under different elements rootElement: 'body', // give the choice to place backdrop under different elements
}; };
const DefaultType = { const DefaultType = {
className: 'string', className: 'string',
clickCallback: '(function|null)', clickCallback: '(function|null)',
@ -52,115 +48,96 @@
isVisible: 'boolean', isVisible: 'boolean',
rootElement: '(element|string)', rootElement: '(element|string)',
}; };
/** /**
* Class definition * Class definition
*/ */
class Backdrop extends Config__default.default { class Backdrop extends Config {
constructor(config) { constructor(config) {
super(); super();
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._isAppended = false; this._isAppended = false;
this._element = null; this._element = null;
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
show(callback) { show(callback) {
if (!this._config.isVisible) { if (!this._config.isVisible) {
index.execute(callback); index_js.execute(callback);
return; return;
} }
this._append(); this._append();
const element = this._getElement(); const element = this._getElement();
if (this._config.isAnimated) { if (this._config.isAnimated) {
index.reflow(element); index_js.reflow(element);
} }
element.classList.add(CLASS_NAME_SHOW); element.classList.add(CLASS_NAME_SHOW);
this._emulateAnimation(() => { this._emulateAnimation(() => {
index.execute(callback); index_js.execute(callback);
}); });
} }
hide(callback) { hide(callback) {
if (!this._config.isVisible) { if (!this._config.isVisible) {
index.execute(callback); index_js.execute(callback);
return; return;
} }
this._getElement().classList.remove(CLASS_NAME_SHOW); this._getElement().classList.remove(CLASS_NAME_SHOW);
this._emulateAnimation(() => { this._emulateAnimation(() => {
this.dispose(); this.dispose();
index.execute(callback); index_js.execute(callback);
}); });
} }
dispose() { dispose() {
if (!this._isAppended) { if (!this._isAppended) {
return; return;
} }
EventHandler.off(this._element, EVENT_MOUSEDOWN);
EventHandler__default.default.off(this._element, EVENT_MOUSEDOWN);
this._element.remove(); this._element.remove();
this._isAppended = false; this._isAppended = false;
} // Private }
// Private
_getElement() { _getElement() {
if (!this._element) { if (!this._element) {
const backdrop = document.createElement('div'); const backdrop = document.createElement('div');
backdrop.className = this._config.className; backdrop.className = this._config.className;
if (this._config.isAnimated) { if (this._config.isAnimated) {
backdrop.classList.add(CLASS_NAME_FADE); backdrop.classList.add(CLASS_NAME_FADE);
} }
this._element = backdrop; this._element = backdrop;
} }
return this._element; return this._element;
} }
_configAfterMerge(config) { _configAfterMerge(config) {
// use getElement() with the default "body" to get a fresh Element on each instantiation // use getElement() with the default "body" to get a fresh Element on each instantiation
config.rootElement = index.getElement(config.rootElement); config.rootElement = index_js.getElement(config.rootElement);
return config; return config;
} }
_append() { _append() {
if (this._isAppended) { if (this._isAppended) {
return; return;
} }
const element = this._getElement(); const element = this._getElement();
this._config.rootElement.append(element); this._config.rootElement.append(element);
EventHandler.on(element, EVENT_MOUSEDOWN, () => {
EventHandler__default.default.on(element, EVENT_MOUSEDOWN, () => { index_js.execute(this._config.clickCallback);
index.execute(this._config.clickCallback);
}); });
this._isAppended = true; this._isAppended = true;
} }
_emulateAnimation(callback) { _emulateAnimation(callback) {
index.executeAfterTransition(callback, this._getElement(), this._config.isAnimated); index_js.executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,26 +1,31 @@
/*! /*!
* Bootstrap component-functions.js v5.2.3 (https://getbootstrap.com/) * Bootstrap component-functions.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? factory(exports, require('../dom/event-handler'), require('./index')) ? factory(
exports,
require('../dom/event-handler.js'),
require('../dom/selector-engine.js'),
require('./index.js')
)
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['exports', '../dom/event-handler', './index'], factory) ? define(['exports', '../dom/event-handler', '../dom/selector-engine', './index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
factory((global.ComponentFunctions = {}), global.EventHandler, global.Index)); factory(
})(this, function (exports, EventHandler, index) { (global.ComponentFunctions = {}),
global.EventHandler,
global.SelectorEngine,
global.Index
));
})(this, function (exports, EventHandler, SelectorEngine, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/component-functions.js * Bootstrap util/component-functions.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -28,32 +33,23 @@
const enableDismissTrigger = (component, method = 'hide') => { const enableDismissTrigger = (component, method = 'hide') => {
const clickEvent = `click.dismiss${component.EVENT_KEY}`; const clickEvent = `click.dismiss${component.EVENT_KEY}`;
const name = component.NAME; const name = component.NAME;
EventHandler__default.default.on( EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
document, if (['A', 'AREA'].includes(this.tagName)) {
clickEvent, event.preventDefault();
`[data-bs-dismiss="${name}"]`,
function (event) {
if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault();
}
if (index.isDisabled(this)) {
return;
}
const target = index.getElementFromSelector(this) || this.closest(`.${name}`);
const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
instance[method]();
} }
); if (index_js.isDisabled(this)) {
return;
}
const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
const instance = component.getOrCreateInstance(target);
// Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
instance[method]();
});
}; };
exports.enableDismissTrigger = enableDismissTrigger; exports.enableDismissTrigger = enableDismissTrigger;
Object.defineProperties(exports, { Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
__esModule: { value: true },
[Symbol.toStringTag]: { value: 'Module' },
});
}); });
//# sourceMappingURL=component-functions.js.map //# sourceMappingURL=component-functions.js.map

View File

@ -1 +1 @@
{"version":3,"file":"component-functions.js","sources":["../../src/util/component-functions.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler'\nimport { getElementFromSelector, isDisabled } from './index'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n"],"names":["enableDismissTrigger","component","method","clickEvent","EVENT_KEY","name","NAME","EventHandler","on","document","event","includes","tagName","preventDefault","isDisabled","target","getElementFromSelector","closest","instance","getOrCreateInstance"],"mappings":";;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;AAKMA,QAAAA,oBAAoB,GAAG,CAACC,SAAD,EAAYC,MAAM,GAAG,MAArB,KAAgC;EAC3D,EAAA,MAAMC,UAAU,GAAI,CAAA,aAAA,EAAeF,SAAS,CAACG,SAAU,CAAvD,CAAA,CAAA;EACA,EAAA,MAAMC,IAAI,GAAGJ,SAAS,CAACK,IAAvB,CAAA;EAEAC,EAAAA,6BAAY,CAACC,EAAb,CAAgBC,QAAhB,EAA0BN,UAA1B,EAAuC,CAAA,kBAAA,EAAoBE,IAAK,CAAA,EAAA,CAAhE,EAAqE,UAAUK,KAAV,EAAiB;MACpF,IAAI,CAAC,GAAD,EAAM,MAAN,CAAA,CAAcC,QAAd,CAAuB,IAAA,CAAKC,OAA5B,CAAJ,EAA0C;EACxCF,MAAAA,KAAK,CAACG,cAAN,EAAA,CAAA;EACD,KAAA;;EAED,IAAA,IAAIC,gBAAU,CAAC,IAAD,CAAd,EAAsB;EACpB,MAAA,OAAA;EACD,KAAA;;EAED,IAAA,MAAMC,MAAM,GAAGC,4BAAsB,CAAC,IAAD,CAAtB,IAAgC,IAAA,CAAKC,OAAL,CAAc,CAAGZ,CAAAA,EAAAA,IAAK,EAAtB,CAA/C,CAAA;MACA,MAAMa,QAAQ,GAAGjB,SAAS,CAACkB,mBAAV,CAA8BJ,MAA9B,CAAjB,CAVoF;;MAapFG,QAAQ,CAAChB,MAAD,CAAR,EAAA,CAAA;KAbF,CAAA,CAAA;EAeD;;;;;;;;;;"} {"version":3,"file":"component-functions.js","sources":["../../src/util/component-functions.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n"],"names":["enableDismissTrigger","component","method","clickEvent","EVENT_KEY","name","NAME","EventHandler","on","document","event","includes","tagName","preventDefault","isDisabled","target","SelectorEngine","getElementFromSelector","closest","instance","getOrCreateInstance"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;AAMMA,QAAAA,oBAAoB,GAAGA,CAACC,SAAS,EAAEC,MAAM,GAAG,MAAM,KAAK;EAC3D,EAAA,MAAMC,UAAU,GAAI,CAAA,aAAA,EAAeF,SAAS,CAACG,SAAU,CAAC,CAAA,CAAA;EACxD,EAAA,MAAMC,IAAI,GAAGJ,SAAS,CAACK,IAAI,CAAA;EAE3BC,EAAAA,YAAY,CAACC,EAAE,CAACC,QAAQ,EAAEN,UAAU,EAAG,CAAA,kBAAA,EAAoBE,IAAK,CAAA,EAAA,CAAG,EAAE,UAAUK,KAAK,EAAE;EACpF,IAAA,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAACC,QAAQ,CAAC,IAAI,CAACC,OAAO,CAAC,EAAE;QACxCF,KAAK,CAACG,cAAc,EAAE,CAAA;EACxB,KAAA;EAEA,IAAA,IAAIC,mBAAU,CAAC,IAAI,CAAC,EAAE;EACpB,MAAA,OAAA;EACF,KAAA;EAEA,IAAA,MAAMC,MAAM,GAAGC,cAAc,CAACC,sBAAsB,CAAC,IAAI,CAAC,IAAI,IAAI,CAACC,OAAO,CAAE,CAAGb,CAAAA,EAAAA,IAAK,EAAC,CAAC,CAAA;EACtF,IAAA,MAAMc,QAAQ,GAAGlB,SAAS,CAACmB,mBAAmB,CAACL,MAAM,CAAC,CAAA;;EAEtD;EACAI,IAAAA,QAAQ,CAACjB,MAAM,CAAC,EAAE,CAAA;EACpB,GAAC,CAAC,CAAA;EACJ;;;;;;;;;;"}

View File

@ -1,29 +1,25 @@
/*! /*!
* Bootstrap config.js v5.2.3 (https://getbootstrap.com/) * Bootstrap config.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory(require('./index'), require('../dom/manipulator'))) ? (module.exports = factory(require('../dom/manipulator.js'), require('./index.js')))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['./index', '../dom/manipulator'], factory) ? define(['../dom/manipulator', './index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Config = factory(global.Index, global.Manipulator))); (global.Config = factory(global.Manipulator, global.Index)));
})(this, function (index, Manipulator) { })(this, function (Manipulator, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/config.js * Bootstrap util/config.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Class definition * Class definition
*/ */
@ -33,49 +29,37 @@
static get Default() { static get Default() {
return {}; return {};
} }
static get DefaultType() { static get DefaultType() {
return {}; return {};
} }
static get NAME() { static get NAME() {
throw new Error('You have to implement the static method "NAME", for each component!'); throw new Error('You have to implement the static method "NAME", for each component!');
} }
_getConfig(config) { _getConfig(config) {
config = this._mergeConfigObj(config); config = this._mergeConfigObj(config);
config = this._configAfterMerge(config); config = this._configAfterMerge(config);
this._typeCheckConfig(config); this._typeCheckConfig(config);
return config; return config;
} }
_configAfterMerge(config) { _configAfterMerge(config) {
return config; return config;
} }
_mergeConfigObj(config, element) { _mergeConfigObj(config, element) {
const jsonConfig = index.isElement(element) const jsonConfig = index_js.isElement(element)
? Manipulator__default.default.getDataAttribute(element, 'config') ? Manipulator.getDataAttribute(element, 'config')
: {}; // try to parse : {}; // try to parse
return { return {
...this.constructor.Default, ...this.constructor.Default,
...(typeof jsonConfig === 'object' ? jsonConfig : {}), ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
...(index.isElement(element) ...(index_js.isElement(element) ? Manipulator.getDataAttributes(element) : {}),
? Manipulator__default.default.getDataAttributes(element)
: {}),
...(typeof config === 'object' ? config : {}), ...(typeof config === 'object' ? config : {}),
}; };
} }
_typeCheckConfig(config, configTypes = this.constructor.DefaultType) { _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
for (const property of Object.keys(configTypes)) { for (const [property, expectedTypes] of Object.entries(configTypes)) {
const expectedTypes = configTypes[property];
const value = config[property]; const value = config[property];
const valueType = index.isElement(value) ? 'element' : index.toType(value); const valueType = index_js.isElement(value) ? 'element' : index_js.toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError( throw new TypeError(
`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".` `${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`

View File

@ -1 +1 @@
{"version":3,"file":"config.js","sources":["../../src/util/config.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isElement, toType } from './index'\nimport Manipulator from '../dom/manipulator'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const property of Object.keys(configTypes)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n"],"names":["Config","Default","DefaultType","NAME","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","element","jsonConfig","isElement","Manipulator","getDataAttribute","constructor","getDataAttributes","configTypes","property","Object","keys","expectedTypes","value","valueType","toType","RegExp","test","TypeError","toUpperCase"],"mappings":";;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAKA;EACA;EACA;;EAEA,MAAMA,MAAN,CAAa;EACX;EACkB,EAAA,WAAPC,OAAO,GAAG;EACnB,IAAA,OAAO,EAAP,CAAA;EACD,GAAA;;EAEqB,EAAA,WAAXC,WAAW,GAAG;EACvB,IAAA,OAAO,EAAP,CAAA;EACD,GAAA;;EAEc,EAAA,WAAJC,IAAI,GAAG;EAChB,IAAA,MAAM,IAAIC,KAAJ,CAAU,qEAAV,CAAN,CAAA;EACD,GAAA;;IAEDC,UAAU,CAACC,MAAD,EAAS;EACjBA,IAAAA,MAAM,GAAG,IAAA,CAAKC,eAAL,CAAqBD,MAArB,CAAT,CAAA;EACAA,IAAAA,MAAM,GAAG,IAAA,CAAKE,iBAAL,CAAuBF,MAAvB,CAAT,CAAA;;MACA,IAAKG,CAAAA,gBAAL,CAAsBH,MAAtB,CAAA,CAAA;;EACA,IAAA,OAAOA,MAAP,CAAA;EACD,GAAA;;IAEDE,iBAAiB,CAACF,MAAD,EAAS;EACxB,IAAA,OAAOA,MAAP,CAAA;EACD,GAAA;;EAEDC,EAAAA,eAAe,CAACD,MAAD,EAASI,OAAT,EAAkB;EAC/B,IAAA,MAAMC,UAAU,GAAGC,eAAS,CAACF,OAAD,CAAT,GAAqBG,4BAAW,CAACC,gBAAZ,CAA6BJ,OAA7B,EAAsC,QAAtC,CAArB,GAAuE,EAA1F,CAD+B;;EAG/B,IAAA,OAAO,EACL,GAAG,IAAKK,CAAAA,WAAL,CAAiBd,OADf;QAEL,IAAI,OAAOU,UAAP,KAAsB,QAAtB,GAAiCA,UAAjC,GAA8C,EAAlD,CAFK;EAGL,MAAA,IAAIC,eAAS,CAACF,OAAD,CAAT,GAAqBG,4BAAW,CAACG,iBAAZ,CAA8BN,OAA9B,CAArB,GAA8D,EAAlE,CAHK;EAIL,MAAA,IAAI,OAAOJ,MAAP,KAAkB,QAAlB,GAA6BA,MAA7B,GAAsC,EAA1C,CAAA;OAJF,CAAA;EAMD,GAAA;;IAEDG,gBAAgB,CAACH,MAAD,EAASW,WAAW,GAAG,IAAKF,CAAAA,WAAL,CAAiBb,WAAxC,EAAqD;MACnE,KAAK,MAAMgB,QAAX,IAAuBC,MAAM,CAACC,IAAP,CAAYH,WAAZ,CAAvB,EAAiD;EAC/C,MAAA,MAAMI,aAAa,GAAGJ,WAAW,CAACC,QAAD,CAAjC,CAAA;EACA,MAAA,MAAMI,KAAK,GAAGhB,MAAM,CAACY,QAAD,CAApB,CAAA;EACA,MAAA,MAAMK,SAAS,GAAGX,eAAS,CAACU,KAAD,CAAT,GAAmB,SAAnB,GAA+BE,YAAM,CAACF,KAAD,CAAvD,CAAA;;QAEA,IAAI,CAAC,IAAIG,MAAJ,CAAWJ,aAAX,EAA0BK,IAA1B,CAA+BH,SAA/B,CAAL,EAAgD;EAC9C,QAAA,MAAM,IAAII,SAAJ,CACH,GAAE,IAAKZ,CAAAA,WAAL,CAAiBZ,IAAjB,CAAsByB,WAAtB,EAAoC,aAAYV,QAAS,CAAA,iBAAA,EAAmBK,SAAU,CAAuBF,qBAAAA,EAAAA,aAAc,IAD1H,CAAN,CAAA;EAGD,OAAA;EACF,KAAA;EACF,GAAA;;EAhDU;;;;;;;;"} {"version":3,"file":"config.js","sources":["../../src/util/config.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n"],"names":["Config","Default","DefaultType","NAME","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","element","jsonConfig","isElement","Manipulator","getDataAttribute","constructor","getDataAttributes","configTypes","property","expectedTypes","Object","entries","value","valueType","toType","RegExp","test","TypeError","toUpperCase"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;;EAKA;EACA;EACA;;EAEA,MAAMA,MAAM,CAAC;EACX;IACA,WAAWC,OAAOA,GAAG;EACnB,IAAA,OAAO,EAAE,CAAA;EACX,GAAA;IAEA,WAAWC,WAAWA,GAAG;EACvB,IAAA,OAAO,EAAE,CAAA;EACX,GAAA;IAEA,WAAWC,IAAIA,GAAG;EAChB,IAAA,MAAM,IAAIC,KAAK,CAAC,qEAAqE,CAAC,CAAA;EACxF,GAAA;IAEAC,UAAUA,CAACC,MAAM,EAAE;EACjBA,IAAAA,MAAM,GAAG,IAAI,CAACC,eAAe,CAACD,MAAM,CAAC,CAAA;EACrCA,IAAAA,MAAM,GAAG,IAAI,CAACE,iBAAiB,CAACF,MAAM,CAAC,CAAA;EACvC,IAAA,IAAI,CAACG,gBAAgB,CAACH,MAAM,CAAC,CAAA;EAC7B,IAAA,OAAOA,MAAM,CAAA;EACf,GAAA;IAEAE,iBAAiBA,CAACF,MAAM,EAAE;EACxB,IAAA,OAAOA,MAAM,CAAA;EACf,GAAA;EAEAC,EAAAA,eAAeA,CAACD,MAAM,EAAEI,OAAO,EAAE;EAC/B,IAAA,MAAMC,UAAU,GAAGC,kBAAS,CAACF,OAAO,CAAC,GAAGG,WAAW,CAACC,gBAAgB,CAACJ,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;;MAE7F,OAAO;EACL,MAAA,GAAG,IAAI,CAACK,WAAW,CAACd,OAAO;QAC3B,IAAI,OAAOU,UAAU,KAAK,QAAQ,GAAGA,UAAU,GAAG,EAAE,CAAC;EACrD,MAAA,IAAIC,kBAAS,CAACF,OAAO,CAAC,GAAGG,WAAW,CAACG,iBAAiB,CAACN,OAAO,CAAC,GAAG,EAAE,CAAC;QACrE,IAAI,OAAOJ,MAAM,KAAK,QAAQ,GAAGA,MAAM,GAAG,EAAE,CAAA;OAC7C,CAAA;EACH,GAAA;IAEAG,gBAAgBA,CAACH,MAAM,EAAEW,WAAW,GAAG,IAAI,CAACF,WAAW,CAACb,WAAW,EAAE;EACnE,IAAA,KAAK,MAAM,CAACgB,QAAQ,EAAEC,aAAa,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,WAAW,CAAC,EAAE;EACnE,MAAA,MAAMK,KAAK,GAAGhB,MAAM,CAACY,QAAQ,CAAC,CAAA;EAC9B,MAAA,MAAMK,SAAS,GAAGX,kBAAS,CAACU,KAAK,CAAC,GAAG,SAAS,GAAGE,eAAM,CAACF,KAAK,CAAC,CAAA;QAE9D,IAAI,CAAC,IAAIG,MAAM,CAACN,aAAa,CAAC,CAACO,IAAI,CAACH,SAAS,CAAC,EAAE;UAC9C,MAAM,IAAII,SAAS,CAChB,CAAA,EAAE,IAAI,CAACZ,WAAW,CAACZ,IAAI,CAACyB,WAAW,EAAG,aAAYV,QAAS,CAAA,iBAAA,EAAmBK,SAAU,CAAuBJ,qBAAAA,EAAAA,aAAc,IAChI,CAAC,CAAA;EACH,OAAA;EACF,KAAA;EACF,GAAA;EACF;;;;;;;;"}

View File

@ -1,14 +1,14 @@
/*! /*!
* Bootstrap focustrap.js v5.2.3 (https://getbootstrap.com/) * Bootstrap focustrap.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('../dom/event-handler'), require('../dom/event-handler.js'),
require('../dom/selector-engine'), require('../dom/selector-engine.js'),
require('./config') require('./config.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['../dom/event-handler', '../dom/selector-engine', './config'], factory) ? define(['../dom/event-handler', '../dom/selector-engine', './config'], factory)
@ -17,19 +17,13 @@
})(this, function (EventHandler, SelectorEngine, Config) { })(this, function (EventHandler, SelectorEngine, Config) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const Config__default = /*#__PURE__*/ _interopDefaultLegacy(Config);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/focustrap.js * Bootstrap util/focustrap.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -46,66 +40,59 @@
autofocus: true, autofocus: true,
trapElement: null, // The element to trap focus inside of trapElement: null, // The element to trap focus inside of
}; };
const DefaultType = { const DefaultType = {
autofocus: 'boolean', autofocus: 'boolean',
trapElement: 'element', trapElement: 'element',
}; };
/** /**
* Class definition * Class definition
*/ */
class FocusTrap extends Config__default.default { class FocusTrap extends Config {
constructor(config) { constructor(config) {
super(); super();
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._isActive = false; this._isActive = false;
this._lastTabNavDirection = null; this._lastTabNavDirection = null;
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
activate() { activate() {
if (this._isActive) { if (this._isActive) {
return; return;
} }
if (this._config.autofocus) { if (this._config.autofocus) {
this._config.trapElement.focus(); this._config.trapElement.focus();
} }
EventHandler.off(document, EVENT_KEY); // guard against infinite focus loop
EventHandler__default.default.off(document, EVENT_KEY); // guard against infinite focus loop EventHandler.on(document, EVENT_FOCUSIN, (event) => this._handleFocusin(event));
EventHandler.on(document, EVENT_KEYDOWN_TAB, (event) => this._handleKeydown(event));
EventHandler__default.default.on(document, EVENT_FOCUSIN, (event) =>
this._handleFocusin(event)
);
EventHandler__default.default.on(document, EVENT_KEYDOWN_TAB, (event) =>
this._handleKeydown(event)
);
this._isActive = true; this._isActive = true;
} }
deactivate() { deactivate() {
if (!this._isActive) { if (!this._isActive) {
return; return;
} }
this._isActive = false; this._isActive = false;
EventHandler__default.default.off(document, EVENT_KEY); EventHandler.off(document, EVENT_KEY);
} // Private }
// Private
_handleFocusin(event) { _handleFocusin(event) {
const { trapElement } = this._config; const { trapElement } = this._config;
if ( if (
event.target === document || event.target === document ||
event.target === trapElement || event.target === trapElement ||
@ -113,9 +100,7 @@
) { ) {
return; return;
} }
const elements = SelectorEngine.focusableChildren(trapElement);
const elements = SelectorEngine__default.default.focusableChildren(trapElement);
if (elements.length === 0) { if (elements.length === 0) {
trapElement.focus(); trapElement.focus();
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
@ -124,12 +109,10 @@
elements[0].focus(); elements[0].focus();
} }
} }
_handleKeydown(event) { _handleKeydown(event) {
if (event.key !== TAB_KEY) { if (event.key !== TAB_KEY) {
return; return;
} }
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD; this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
/*! /*!
* Bootstrap index.js v5.2.3 (https://getbootstrap.com/) * Bootstrap index.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
@ -15,24 +15,39 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/index.js * Bootstrap util/index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
const MAX_UID = 1000000; const MAX_UID = 1000000;
const MILLISECONDS_MULTIPLIER = 1000; const MILLISECONDS_MULTIPLIER = 1000;
const TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp) const TRANSITION_END = 'transitionend';
/**
* Properly escape IDs selectors to handle weird IDs
* @param {string} selector
* @returns {string}
*/
const parseSelector = (selector) => {
if (selector && window.CSS && window.CSS.escape) {
// document.querySelector needs escaping to handle IDs (html5+) containing for instance /
selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
}
return selector;
};
// Shout-out Angus Croll (https://goo.gl/pxwQGp)
const toType = (object) => { const toType = (object) => {
if (object === null || object === undefined) { if (object === null || object === undefined) {
return `${object}`; return `${object}`;
} }
return Object.prototype.toString return Object.prototype.toString
.call(object) .call(object)
.match(/\s([a-z]+)/i)[1] .match(/\s([a-z]+)/i)[1]
.toLowerCase(); .toLowerCase();
}; };
/** /**
* Public Util API * Public Util API
*/ */
@ -41,61 +56,24 @@
do { do {
prefix += Math.floor(Math.random() * MAX_UID); prefix += Math.floor(Math.random() * MAX_UID);
} while (document.getElementById(prefix)); } while (document.getElementById(prefix));
return prefix; return prefix;
}; };
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;
};
const getSelectorFromElement = (element) => {
const selector = getSelector(element);
if (selector) {
return document.querySelector(selector) ? selector : null;
}
return null;
};
const getElementFromSelector = (element) => {
const selector = getSelector(element);
return selector ? document.querySelector(selector) : null;
};
const getTransitionDurationFromElement = (element) => { const getTransitionDurationFromElement = (element) => {
if (!element) { if (!element) {
return 0; return 0;
} // Get transition-duration of the element }
// Get transition-duration of the element
let { transitionDuration, transitionDelay } = window.getComputedStyle(element); let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
const floatTransitionDuration = Number.parseFloat(transitionDuration); const floatTransitionDuration = Number.parseFloat(transitionDuration);
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found const floatTransitionDelay = Number.parseFloat(transitionDelay);
// Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) { if (!floatTransitionDuration && !floatTransitionDelay) {
return 0; return 0;
} // If multiple durations are defined, take the first }
// If multiple durations are defined, take the first
transitionDuration = transitionDuration.split(',')[0]; transitionDuration = transitionDuration.split(',')[0];
transitionDelay = transitionDelay.split(',')[0]; transitionDelay = transitionDelay.split(',')[0];
return ( return (
@ -103,102 +81,83 @@
MILLISECONDS_MULTIPLIER MILLISECONDS_MULTIPLIER
); );
}; };
const triggerTransitionEnd = (element) => { const triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END)); element.dispatchEvent(new Event(TRANSITION_END));
}; };
const isElement = (object) => { const isElement = (object) => {
if (!object || typeof object !== 'object') { if (!object || typeof object !== 'object') {
return false; return false;
} }
if (typeof object.jquery !== 'undefined') { if (typeof object.jquery !== 'undefined') {
object = object[0]; object = object[0];
} }
return typeof object.nodeType !== 'undefined'; return typeof object.nodeType !== 'undefined';
}; };
const getElement = (object) => { const getElement = (object) => {
// it's a jQuery object or a node element // it's a jQuery object or a node element
if (isElement(object)) { if (isElement(object)) {
return object.jquery ? object[0] : object; return object.jquery ? object[0] : object;
} }
if (typeof object === 'string' && object.length > 0) { if (typeof object === 'string' && object.length > 0) {
return document.querySelector(object); return document.querySelector(parseSelector(object));
} }
return null; return null;
}; };
const isVisible = (element) => { const isVisible = (element) => {
if (!isElement(element) || element.getClientRects().length === 0) { if (!isElement(element) || element.getClientRects().length === 0) {
return false; return false;
} }
const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';
const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed // Handle `details` element as its content may falsie appear visible when it is closed
const closedDetails = element.closest('details:not([open])'); const closedDetails = element.closest('details:not([open])');
if (!closedDetails) { if (!closedDetails) {
return elementIsVisible; return elementIsVisible;
} }
if (closedDetails !== element) { if (closedDetails !== element) {
const summary = element.closest('summary'); const summary = element.closest('summary');
if (summary && summary.parentNode !== closedDetails) { if (summary && summary.parentNode !== closedDetails) {
return false; return false;
} }
if (summary === null) { if (summary === null) {
return false; return false;
} }
} }
return elementIsVisible; return elementIsVisible;
}; };
const isDisabled = (element) => { const isDisabled = (element) => {
if (!element || element.nodeType !== Node.ELEMENT_NODE) { if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true; return true;
} }
if (element.classList.contains('disabled')) { if (element.classList.contains('disabled')) {
return true; return true;
} }
if (typeof element.disabled !== 'undefined') { if (typeof element.disabled !== 'undefined') {
return element.disabled; return element.disabled;
} }
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
}; };
const findShadowRoot = (element) => { const findShadowRoot = (element) => {
if (!document.documentElement.attachShadow) { if (!document.documentElement.attachShadow) {
return null; return null;
} // Can find the shadow root otherwise it'll return the document }
// Can find the shadow root otherwise it'll return the document
if (typeof element.getRootNode === 'function') { if (typeof element.getRootNode === 'function') {
const root = element.getRootNode(); const root = element.getRootNode();
return root instanceof ShadowRoot ? root : null; return root instanceof ShadowRoot ? root : null;
} }
if (element instanceof ShadowRoot) { if (element instanceof ShadowRoot) {
return element; return element;
} // when we don't find a shadow root }
// when we don't find a shadow root
if (!element.parentNode) { if (!element.parentNode) {
return null; return null;
} }
return findShadowRoot(element.parentNode); return findShadowRoot(element.parentNode);
}; };
const noop = () => {}; const noop = () => {};
/** /**
* Trick to restart an element's animation * Trick to restart an element's animation
* *
@ -207,7 +166,6 @@
* *
* @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
*/ */
const reflow = (element) => { const reflow = (element) => {
element.offsetHeight; // eslint-disable-line no-unused-expressions element.offsetHeight; // eslint-disable-line no-unused-expressions
}; };
@ -216,12 +174,9 @@
if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return window.jQuery; return window.jQuery;
} }
return null; return null;
}; };
const DOMContentLoadedCallbacks = []; const DOMContentLoadedCallbacks = [];
const onDOMContentLoaded = (callback) => { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
// add listener on the first call when the document is in loading state // add listener on the first call when the document is in loading state
@ -232,26 +187,21 @@
} }
}); });
} }
DOMContentLoadedCallbacks.push(callback); DOMContentLoadedCallbacks.push(callback);
} else { } else {
callback(); callback();
} }
}; };
const isRTL = () => document.documentElement.dir === 'rtl'; const isRTL = () => document.documentElement.dir === 'rtl';
const defineJQueryPlugin = (plugin) => { const defineJQueryPlugin = (plugin) => {
onDOMContentLoaded(() => { onDOMContentLoaded(() => {
const $ = getjQuery(); const $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
const name = plugin.NAME; const name = plugin.NAME;
const JQUERY_NO_CONFLICT = $.fn[name]; const JQUERY_NO_CONFLICT = $.fn[name];
$.fn[name] = plugin.jQueryInterface; $.fn[name] = plugin.jQueryInterface;
$.fn[name].Constructor = plugin; $.fn[name].Constructor = plugin;
$.fn[name].noConflict = () => { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
@ -259,33 +209,25 @@
} }
}); });
}; };
const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
const execute = (callback) => { return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
if (typeof callback === 'function') {
callback();
}
}; };
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
if (!waitForTransition) { if (!waitForTransition) {
execute(callback); execute(callback);
return; return;
} }
const durationPadding = 5; const durationPadding = 5;
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
let called = false; let called = false;
const handler = ({ target }) => { const handler = ({ target }) => {
if (target !== transitionElement) { if (target !== transitionElement) {
return; return;
} }
called = true; called = true;
transitionElement.removeEventListener(TRANSITION_END, handler); transitionElement.removeEventListener(TRANSITION_END, handler);
execute(callback); execute(callback);
}; };
transitionElement.addEventListener(TRANSITION_END, handler); transitionElement.addEventListener(TRANSITION_END, handler);
setTimeout(() => { setTimeout(() => {
if (!called) { if (!called) {
@ -293,6 +235,7 @@
} }
}, emulatedDuration); }, emulatedDuration);
}; };
/** /**
* Return the previous/next element of a list. * Return the previous/next element of a list.
* *
@ -302,22 +245,19 @@
* @param isCycleAllowed * @param isCycleAllowed
* @return {Element|elem} The proper element * @return {Element|elem} The proper element
*/ */
const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
const listLength = list.length; const listLength = list.length;
let index = list.indexOf(activeElement); // if the element does not exist in the list return an element let index = list.indexOf(activeElement);
// depending on the direction and if cycle is allowed
// if the element does not exist in the list return an element
// depending on the direction and if cycle is allowed
if (index === -1) { if (index === -1) {
return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]; return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
} }
index += shouldGetNext ? 1 : -1; index += shouldGetNext ? 1 : -1;
if (isCycleAllowed) { if (isCycleAllowed) {
index = (index + listLength) % listLength; index = (index + listLength) % listLength;
} }
return list[Math.max(0, Math.min(index, listLength - 1))]; return list[Math.max(0, Math.min(index, listLength - 1))];
}; };
@ -326,9 +266,7 @@
exports.executeAfterTransition = executeAfterTransition; exports.executeAfterTransition = executeAfterTransition;
exports.findShadowRoot = findShadowRoot; exports.findShadowRoot = findShadowRoot;
exports.getElement = getElement; exports.getElement = getElement;
exports.getElementFromSelector = getElementFromSelector;
exports.getNextActiveElement = getNextActiveElement; exports.getNextActiveElement = getNextActiveElement;
exports.getSelectorFromElement = getSelectorFromElement;
exports.getTransitionDurationFromElement = getTransitionDurationFromElement; exports.getTransitionDurationFromElement = getTransitionDurationFromElement;
exports.getUID = getUID; exports.getUID = getUID;
exports.getjQuery = getjQuery; exports.getjQuery = getjQuery;
@ -338,13 +276,11 @@
exports.isVisible = isVisible; exports.isVisible = isVisible;
exports.noop = noop; exports.noop = noop;
exports.onDOMContentLoaded = onDOMContentLoaded; exports.onDOMContentLoaded = onDOMContentLoaded;
exports.parseSelector = parseSelector;
exports.reflow = reflow; exports.reflow = reflow;
exports.toType = toType; exports.toType = toType;
exports.triggerTransitionEnd = triggerTransitionEnd; exports.triggerTransitionEnd = triggerTransitionEnd;
Object.defineProperties(exports, { Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
__esModule: { value: true },
[Symbol.toStringTag]: { value: 'Module' },
});
}); });
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
/*! /*!
* Bootstrap sanitizer.js v5.2.3 (https://getbootstrap.com/) * Bootstrap sanitizer.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
@ -15,55 +15,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/sanitizer.js * Bootstrap util/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
const uriAttributes = new Set([
'background', // js-docs-start allow-list
'cite',
'href',
'itemtype',
'longdesc',
'poster',
'src',
'xlink:href',
]);
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
/**
* A pattern that recognizes a commonly useful subset of URLs that are safe.
*
* Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
*/
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
/**
* A pattern that matches safe data URLs. Only matches image, video and audio types.
*
* Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
*/
const DATA_URL_PATTERN =
/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
const allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase();
if (allowedAttributeList.includes(attributeName)) {
if (uriAttributes.has(attributeName)) {
return Boolean(
SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)
);
}
return true;
} // Check if a regular expression validates the attribute.
return allowedAttributeList
.filter((attributeRegex) => attributeRegex instanceof RegExp)
.some((regex) => regex.test(attributeName));
};
const DefaultAllowlist = { const DefaultAllowlist = {
// Global attributes allowed on any supplied element below. // Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
@ -97,46 +55,71 @@
u: [], u: [],
ul: [], ul: [],
}; };
// js-docs-end allow-list
const uriAttributes = new Set([
'background',
'cite',
'href',
'itemtype',
'longdesc',
'poster',
'src',
'xlink:href',
]);
/**
* A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
* contexts.
*
* Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
*/
// eslint-disable-next-line unicorn/better-regex
const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
const allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase();
if (allowedAttributeList.includes(attributeName)) {
if (uriAttributes.has(attributeName)) {
return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
}
return true;
}
// Check if a regular expression validates the attribute.
return allowedAttributeList
.filter((attributeRegex) => attributeRegex instanceof RegExp)
.some((regex) => regex.test(attributeName));
};
function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
if (!unsafeHtml.length) { if (!unsafeHtml.length) {
return unsafeHtml; return unsafeHtml;
} }
if (sanitizeFunction && typeof sanitizeFunction === 'function') { if (sanitizeFunction && typeof sanitizeFunction === 'function') {
return sanitizeFunction(unsafeHtml); return sanitizeFunction(unsafeHtml);
} }
const domParser = new window.DOMParser(); const domParser = new window.DOMParser();
const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
const elements = [].concat(...createdDocument.body.querySelectorAll('*')); const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
for (const element of elements) { for (const element of elements) {
const elementName = element.nodeName.toLowerCase(); const elementName = element.nodeName.toLowerCase();
if (!Object.keys(allowList).includes(elementName)) { if (!Object.keys(allowList).includes(elementName)) {
element.remove(); element.remove();
continue; continue;
} }
const attributeList = [].concat(...element.attributes); const attributeList = [].concat(...element.attributes);
const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []); const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
for (const attribute of attributeList) { for (const attribute of attributeList) {
if (!allowedAttribute(attribute, allowedAttributes)) { if (!allowedAttribute(attribute, allowedAttributes)) {
element.removeAttribute(attribute.nodeName); element.removeAttribute(attribute.nodeName);
} }
} }
} }
return createdDocument.body.innerHTML; return createdDocument.body.innerHTML;
} }
exports.DefaultAllowlist = DefaultAllowlist; exports.DefaultAllowlist = DefaultAllowlist;
exports.sanitizeHtml = sanitizeHtml; exports.sanitizeHtml = sanitizeHtml;
Object.defineProperties(exports, { Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
__esModule: { value: true },
[Symbol.toStringTag]: { value: 'Module' },
});
}); });
//# sourceMappingURL=sanitizer.js.map //# sourceMappingURL=sanitizer.js.map

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,29 @@
/*! /*!
* Bootstrap scrollbar.js v5.2.3 (https://getbootstrap.com/) * Bootstrap scrollbar.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('../dom/selector-engine'), require('../dom/manipulator.js'),
require('../dom/manipulator'), require('../dom/selector-engine.js'),
require('./index') require('./index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['../dom/selector-engine', '../dom/manipulator', './index'], factory) ? define(['../dom/manipulator', '../dom/selector-engine', './index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Scrollbar = factory(global.SelectorEngine, global.Manipulator, global.Index))); (global.Scrollbar = factory(global.Manipulator, global.SelectorEngine, global.Index)));
})(this, function (SelectorEngine, Manipulator, index) { })(this, function (Manipulator, SelectorEngine, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/scrollBar.js * Bootstrap util/scrollBar.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -37,6 +32,7 @@
const SELECTOR_STICKY_CONTENT = '.sticky-top'; const SELECTOR_STICKY_CONTENT = '.sticky-top';
const PROPERTY_PADDING = 'padding-right'; const PROPERTY_PADDING = 'padding-right';
const PROPERTY_MARGIN = 'margin-right'; const PROPERTY_MARGIN = 'margin-right';
/** /**
* Class definition * Class definition
*/ */
@ -44,109 +40,90 @@
class ScrollBarHelper { class ScrollBarHelper {
constructor() { constructor() {
this._element = document.body; this._element = document.body;
} // Public }
// Public
getWidth() { getWidth() {
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
const documentWidth = document.documentElement.clientWidth; const documentWidth = document.documentElement.clientWidth;
return Math.abs(window.innerWidth - documentWidth); return Math.abs(window.innerWidth - documentWidth);
} }
hide() { hide() {
const width = this.getWidth(); const width = this.getWidth();
this._disableOverFlow();
this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width // give padding to element to balance the hidden scrollbar width
this._setElementAttributes( this._setElementAttributes(
this._element, this._element,
PROPERTY_PADDING, PROPERTY_PADDING,
(calculatedValue) => calculatedValue + width (calculatedValue) => calculatedValue + width
); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth );
// trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
this._setElementAttributes( this._setElementAttributes(
SELECTOR_FIXED_CONTENT, SELECTOR_FIXED_CONTENT,
PROPERTY_PADDING, PROPERTY_PADDING,
(calculatedValue) => calculatedValue + width (calculatedValue) => calculatedValue + width
); );
this._setElementAttributes( this._setElementAttributes(
SELECTOR_STICKY_CONTENT, SELECTOR_STICKY_CONTENT,
PROPERTY_MARGIN, PROPERTY_MARGIN,
(calculatedValue) => calculatedValue - width (calculatedValue) => calculatedValue - width
); );
} }
reset() { reset() {
this._resetElementAttributes(this._element, 'overflow'); this._resetElementAttributes(this._element, 'overflow');
this._resetElementAttributes(this._element, PROPERTY_PADDING); this._resetElementAttributes(this._element, PROPERTY_PADDING);
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING); this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN); this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
} }
isOverflowing() { isOverflowing() {
return this.getWidth() > 0; return this.getWidth() > 0;
} // Private
_disableOverFlow() {
this._saveInitialAttribute(this._element, 'overflow');
this._element.style.overflow = 'hidden';
} }
// Private
_disableOverFlow() {
this._saveInitialAttribute(this._element, 'overflow');
this._element.style.overflow = 'hidden';
}
_setElementAttributes(selector, styleProperty, callback) { _setElementAttributes(selector, styleProperty, callback) {
const scrollbarWidth = this.getWidth(); const scrollbarWidth = this.getWidth();
const manipulationCallBack = (element) => { const manipulationCallBack = (element) => {
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
return; return;
} }
this._saveInitialAttribute(element, styleProperty); this._saveInitialAttribute(element, styleProperty);
const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty); const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
element.style.setProperty( element.style.setProperty(
styleProperty, styleProperty,
`${callback(Number.parseFloat(calculatedValue))}px` `${callback(Number.parseFloat(calculatedValue))}px`
); );
}; };
this._applyManipulationCallback(selector, manipulationCallBack); this._applyManipulationCallback(selector, manipulationCallBack);
} }
_saveInitialAttribute(element, styleProperty) { _saveInitialAttribute(element, styleProperty) {
const actualValue = element.style.getPropertyValue(styleProperty); const actualValue = element.style.getPropertyValue(styleProperty);
if (actualValue) { if (actualValue) {
Manipulator__default.default.setDataAttribute(element, styleProperty, actualValue); Manipulator.setDataAttribute(element, styleProperty, actualValue);
} }
} }
_resetElementAttributes(selector, styleProperty) { _resetElementAttributes(selector, styleProperty) {
const manipulationCallBack = (element) => { const manipulationCallBack = (element) => {
const value = Manipulator__default.default.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero const value = Manipulator.getDataAttribute(element, styleProperty);
// We only want to remove the property if the value is `null`; the value can also be zero
if (value === null) { if (value === null) {
element.style.removeProperty(styleProperty); element.style.removeProperty(styleProperty);
return; return;
} }
Manipulator.removeDataAttribute(element, styleProperty);
Manipulator__default.default.removeDataAttribute(element, styleProperty);
element.style.setProperty(styleProperty, value); element.style.setProperty(styleProperty, value);
}; };
this._applyManipulationCallback(selector, manipulationCallBack); this._applyManipulationCallback(selector, manipulationCallBack);
} }
_applyManipulationCallback(selector, callBack) { _applyManipulationCallback(selector, callBack) {
if (index.isElement(selector)) { if (index_js.isElement(selector)) {
callBack(selector); callBack(selector);
return; return;
} }
for (const sel of SelectorEngine.find(selector, this._element)) {
for (const sel of SelectorEngine__default.default.find(selector, this._element)) {
callBack(sel); callBack(sel);
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,29 @@
/*! /*!
* Bootstrap swipe.js v5.2.3 (https://getbootstrap.com/) * Bootstrap swipe.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./config'), require('../dom/event-handler.js'),
require('../dom/event-handler'), require('./config.js'),
require('./index') require('./index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['./config', '../dom/event-handler', './index'], factory) ? define(['../dom/event-handler', './config', './index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Swipe = factory(global.Config, global.EventHandler, global.Index))); (global.Swipe = factory(global.EventHandler, global.Config, global.Index)));
})(this, function (Config, EventHandler, index) { })(this, function (EventHandler, Config, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const Config__default = /*#__PURE__*/ _interopDefaultLegacy(Config);
const EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/swipe.js * Bootstrap util/swipe.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
@ -54,115 +49,92 @@
leftCallback: '(function|null)', leftCallback: '(function|null)',
rightCallback: '(function|null)', rightCallback: '(function|null)',
}; };
/** /**
* Class definition * Class definition
*/ */
class Swipe extends Config__default.default { class Swipe extends Config {
constructor(element, config) { constructor(element, config) {
super(); super();
this._element = element; this._element = element;
if (!element || !Swipe.isSupported()) { if (!element || !Swipe.isSupported()) {
return; return;
} }
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._deltaX = 0; this._deltaX = 0;
this._supportPointerEvents = Boolean(window.PointerEvent); this._supportPointerEvents = Boolean(window.PointerEvent);
this._initEvents(); this._initEvents();
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
dispose() { dispose() {
EventHandler__default.default.off(this._element, EVENT_KEY); EventHandler.off(this._element, EVENT_KEY);
} // Private }
// Private
_start(event) { _start(event) {
if (!this._supportPointerEvents) { if (!this._supportPointerEvents) {
this._deltaX = event.touches[0].clientX; this._deltaX = event.touches[0].clientX;
return; return;
} }
if (this._eventIsPointerPenTouch(event)) { if (this._eventIsPointerPenTouch(event)) {
this._deltaX = event.clientX; this._deltaX = event.clientX;
} }
} }
_end(event) { _end(event) {
if (this._eventIsPointerPenTouch(event)) { if (this._eventIsPointerPenTouch(event)) {
this._deltaX = event.clientX - this._deltaX; this._deltaX = event.clientX - this._deltaX;
} }
this._handleSwipe(); this._handleSwipe();
index_js.execute(this._config.endCallback);
index.execute(this._config.endCallback);
} }
_move(event) { _move(event) {
this._deltaX = this._deltaX =
event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX; event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
} }
_handleSwipe() { _handleSwipe() {
const absDeltaX = Math.abs(this._deltaX); const absDeltaX = Math.abs(this._deltaX);
if (absDeltaX <= SWIPE_THRESHOLD) { if (absDeltaX <= SWIPE_THRESHOLD) {
return; return;
} }
const direction = absDeltaX / this._deltaX; const direction = absDeltaX / this._deltaX;
this._deltaX = 0; this._deltaX = 0;
if (!direction) { if (!direction) {
return; return;
} }
index_js.execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
index.execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
} }
_initEvents() { _initEvents() {
if (this._supportPointerEvents) { if (this._supportPointerEvents) {
EventHandler__default.default.on(this._element, EVENT_POINTERDOWN, (event) => EventHandler.on(this._element, EVENT_POINTERDOWN, (event) => this._start(event));
this._start(event) EventHandler.on(this._element, EVENT_POINTERUP, (event) => this._end(event));
);
EventHandler__default.default.on(this._element, EVENT_POINTERUP, (event) =>
this._end(event)
);
this._element.classList.add(CLASS_NAME_POINTER_EVENT); this._element.classList.add(CLASS_NAME_POINTER_EVENT);
} else { } else {
EventHandler__default.default.on(this._element, EVENT_TOUCHSTART, (event) => EventHandler.on(this._element, EVENT_TOUCHSTART, (event) => this._start(event));
this._start(event) EventHandler.on(this._element, EVENT_TOUCHMOVE, (event) => this._move(event));
); EventHandler.on(this._element, EVENT_TOUCHEND, (event) => this._end(event));
EventHandler__default.default.on(this._element, EVENT_TOUCHMOVE, (event) =>
this._move(event)
);
EventHandler__default.default.on(this._element, EVENT_TOUCHEND, (event) =>
this._end(event)
);
} }
} }
_eventIsPointerPenTouch(event) { _eventIsPointerPenTouch(event) {
return ( return (
this._supportPointerEvents && this._supportPointerEvents &&
(event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH) (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)
); );
} // Static }
// Static
static isSupported() { static isSupported() {
return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
} }

File diff suppressed because one or more lines are too long

View File

@ -1,47 +1,42 @@
/*! /*!
* Bootstrap template-factory.js v5.2.3 (https://getbootstrap.com/) * Bootstrap template-factory.js v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/ */
(function (global, factory) { (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory( ? (module.exports = factory(
require('./sanitizer'), require('../dom/selector-engine.js'),
require('./index'), require('./config.js'),
require('../dom/selector-engine'), require('./sanitizer.js'),
require('./config') require('./index.js')
)) ))
: typeof define === 'function' && define.amd : typeof define === 'function' && define.amd
? define(['./sanitizer', './index', '../dom/selector-engine', './config'], factory) ? define(['../dom/selector-engine', './config', './sanitizer', './index'], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.TemplateFactory = factory( (global.TemplateFactory = factory(
global.Sanitizer,
global.Index,
global.SelectorEngine, global.SelectorEngine,
global.Config global.Config,
global.Sanitizer,
global.Index
))); )));
})(this, function (sanitizer, index, SelectorEngine, Config) { })(this, function (SelectorEngine, Config, sanitizer_js, index_js) {
'use strict'; 'use strict';
const _interopDefaultLegacy = (e) =>
e && typeof e === 'object' && 'default' in e ? e : { default: e };
const SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
const Config__default = /*#__PURE__*/ _interopDefaultLegacy(Config);
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/template-factory.js * Bootstrap util/template-factory.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
/** /**
* Constants * Constants
*/ */
const NAME = 'TemplateFactory'; const NAME = 'TemplateFactory';
const Default = { const Default = {
allowList: sanitizer.DefaultAllowlist, allowList: sanitizer_js.DefaultAllowlist,
content: {}, content: {},
// { selector : text , selector2 : text2 , } // { selector : text , selector2 : text2 , }
extraClass: '', extraClass: '',
@ -63,70 +58,64 @@
entry: '(string|element|function|null)', entry: '(string|element|function|null)',
selector: '(string|element)', selector: '(string|element)',
}; };
/** /**
* Class definition * Class definition
*/ */
class TemplateFactory extends Config__default.default { class TemplateFactory extends Config {
constructor(config) { constructor(config) {
super(); super();
this._config = this._getConfig(config); this._config = this._getConfig(config);
} // Getters }
// Getters
static get Default() { static get Default() {
return Default; return Default;
} }
static get DefaultType() { static get DefaultType() {
return DefaultType; return DefaultType;
} }
static get NAME() { static get NAME() {
return NAME; return NAME;
} // Public }
// Public
getContent() { getContent() {
return Object.values(this._config.content) return Object.values(this._config.content)
.map((config) => this._resolvePossibleFunction(config)) .map((config) => this._resolvePossibleFunction(config))
.filter(Boolean); .filter(Boolean);
} }
hasContent() { hasContent() {
return this.getContent().length > 0; return this.getContent().length > 0;
} }
changeContent(content) { changeContent(content) {
this._checkContent(content); this._checkContent(content);
this._config.content = {
this._config.content = { ...this._config.content, ...content }; ...this._config.content,
...content,
};
return this; return this;
} }
toHtml() { toHtml() {
const templateWrapper = document.createElement('div'); const templateWrapper = document.createElement('div');
templateWrapper.innerHTML = this._maybeSanitize(this._config.template); templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
for (const [selector, text] of Object.entries(this._config.content)) { for (const [selector, text] of Object.entries(this._config.content)) {
this._setContent(templateWrapper, text, selector); this._setContent(templateWrapper, text, selector);
} }
const template = templateWrapper.children[0]; const template = templateWrapper.children[0];
const extraClass = this._resolvePossibleFunction(this._config.extraClass); const extraClass = this._resolvePossibleFunction(this._config.extraClass);
if (extraClass) { if (extraClass) {
template.classList.add(...extraClass.split(' ')); template.classList.add(...extraClass.split(' '));
} }
return template; return template;
} // Private
_typeCheckConfig(config) {
super._typeCheckConfig(config);
this._checkContent(config.content);
} }
// Private
_typeCheckConfig(config) {
super._typeCheckConfig(config);
this._checkContent(config.content);
}
_checkContent(arg) { _checkContent(arg) {
for (const [selector, content] of Object.entries(arg)) { for (const [selector, content] of Object.entries(arg)) {
super._typeCheckConfig( super._typeCheckConfig(
@ -138,52 +127,40 @@
); );
} }
} }
_setContent(template, content, selector) { _setContent(template, content, selector) {
const templateElement = SelectorEngine__default.default.findOne(selector, template); const templateElement = SelectorEngine.findOne(selector, template);
if (!templateElement) { if (!templateElement) {
return; return;
} }
content = this._resolvePossibleFunction(content); content = this._resolvePossibleFunction(content);
if (!content) { if (!content) {
templateElement.remove(); templateElement.remove();
return; return;
} }
if (index_js.isElement(content)) {
if (index.isElement(content)) { this._putElementInTemplate(index_js.getElement(content), templateElement);
this._putElementInTemplate(index.getElement(content), templateElement);
return; return;
} }
if (this._config.html) { if (this._config.html) {
templateElement.innerHTML = this._maybeSanitize(content); templateElement.innerHTML = this._maybeSanitize(content);
return; return;
} }
templateElement.textContent = content; templateElement.textContent = content;
} }
_maybeSanitize(arg) { _maybeSanitize(arg) {
return this._config.sanitize return this._config.sanitize
? sanitizer.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn)
: arg; : arg;
} }
_resolvePossibleFunction(arg) { _resolvePossibleFunction(arg) {
return typeof arg === 'function' ? arg(this) : arg; return index_js.execute(arg, [this]);
} }
_putElementInTemplate(element, templateElement) { _putElementInTemplate(element, templateElement) {
if (this._config.html) { if (this._config.html) {
templateElement.innerHTML = ''; templateElement.innerHTML = '';
templateElement.append(element); templateElement.append(element);
return; return;
} }
templateElement.textContent = element.textContent; templateElement.textContent = element.textContent;
} }
} }

File diff suppressed because one or more lines are too long

View File

@ -1,14 +1,14 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): alert.js * Bootstrap alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { defineJQueryPlugin } from './util/index'; import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler'; import EventHandler from './dom/event-handler.js';
import BaseComponent from './base-component'; import { enableDismissTrigger } from './util/component-functions.js';
import { enableDismissTrigger } from './util/component-functions'; import { defineJQueryPlugin } from './util/index.js';
/** /**
* Constants * Constants
@ -76,12 +76,12 @@ class Alert extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
enableDismissTrigger(Alert, 'close'); // enableDismissTrigger(Alert, 'close');
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Alert); // defineJQueryPlugin(Alert);
export default Alert; export default Alert;

View File

@ -1,20 +1,20 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): base-component.js * Bootstrap base-component.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import Data from './dom/data'; import Data from './dom/data.js';
import { executeAfterTransition, getElement } from './util/index'; import EventHandler from './dom/event-handler.js';
import EventHandler from './dom/event-handler'; import Config from './util/config.js';
import Config from './util/config'; import { executeAfterTransition, getElement } from './util/index.js';
/** /**
* Constants * Constants
*/ */
const VERSION = '5.2.3'; const VERSION = '5.3.2';
/** /**
* Class definition * Class definition

View File

@ -1,13 +1,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): button.js * Bootstrap button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { defineJQueryPlugin } from './util/index'; import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler'; import EventHandler from './dom/event-handler.js';
import BaseComponent from './base-component'; import { defineJQueryPlugin } from './util/index.js';
/** /**
* Constants * Constants
@ -54,19 +54,19 @@ class Button extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) => {
event.preventDefault(); // event.preventDefault();
const button = event.target.closest(SELECTOR_DATA_TOGGLE); // const button = event.target.closest(SELECTOR_DATA_TOGGLE);
const data = Button.getOrCreateInstance(button); // const data = Button.getOrCreateInstance(button);
data.toggle(); // data.toggle();
}); // });
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Button); // defineJQueryPlugin(Button);
export default Button; export default Button;

View File

@ -1,24 +1,23 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): carousel.js * Bootstrap carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler.js';
import Manipulator from './dom/manipulator.js';
import SelectorEngine from './dom/selector-engine.js';
import { import {
defineJQueryPlugin, defineJQueryPlugin,
getElementFromSelector,
getNextActiveElement, getNextActiveElement,
isRTL, isRTL,
isVisible, isVisible,
reflow, reflow,
triggerTransitionEnd, triggerTransitionEnd,
} from './util/index'; } from './util/index.js';
import EventHandler from './dom/event-handler'; import Swipe from './util/swipe.js';
import Manipulator from './dom/manipulator';
import SelectorEngine from './dom/selector-engine';
import Swipe from './util/swipe';
import BaseComponent from './base-component';
/** /**
* Constants * Constants
@ -337,7 +336,7 @@ class Carousel extends BaseComponent {
if (!activeElement || !nextElement) { if (!activeElement || !nextElement) {
// Some weirdness is happening, so we bail // Some weirdness is happening, so we bail
// todo: change tests that use empty divs to avoid this check // TODO: change tests that use empty divs to avoid this check
return; return;
} }
@ -437,46 +436,46 @@ class Carousel extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {
const target = getElementFromSelector(this); // const target = getElementFromSelector(this);
if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { // if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
return; // return;
} // }
event.preventDefault(); // event.preventDefault();
const carousel = Carousel.getOrCreateInstance(target); // const carousel = Carousel.getOrCreateInstance(target);
const slideIndex = this.getAttribute('data-mdb-slide-to'); // const slideIndex = this.getAttribute('data-mdb-slide-to');
if (slideIndex) { // if (slideIndex) {
carousel.to(slideIndex); // carousel.to(slideIndex);
carousel._maybeEnableCycle(); // carousel._maybeEnableCycle();
return; // return;
} // }
if (Manipulator.getDataAttribute(this, 'slide') === 'next') { // if (Manipulator.getDataAttribute(this, 'slide') === 'next') {
carousel.next(); // carousel.next();
carousel._maybeEnableCycle(); // carousel._maybeEnableCycle();
return; // return;
} // }
carousel.prev(); // carousel.prev();
carousel._maybeEnableCycle(); // carousel._maybeEnableCycle();
}); // });
EventHandler.on(window, EVENT_LOAD_DATA_API, () => { // EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); // const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
for (const carousel of carousels) { // for (const carousel of carousels) {
Carousel.getOrCreateInstance(carousel); // Carousel.getOrCreateInstance(carousel);
} // }
}); // });
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Carousel); // defineJQueryPlugin(Carousel);
export default Carousel; export default Carousel;

View File

@ -1,20 +1,14 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): collapse.js * Bootstrap collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { import BaseComponent from './base-component.js';
defineJQueryPlugin, import EventHandler from './dom/event-handler.js';
getElement, import SelectorEngine from './dom/selector-engine.js';
getElementFromSelector, import { defineJQueryPlugin, getElement, reflow } from './util/index.js';
getSelectorFromElement,
reflow,
} from './util/index';
import EventHandler from './dom/event-handler';
import SelectorEngine from './dom/selector-engine';
import BaseComponent from './base-component';
/** /**
* Constants * Constants
@ -42,7 +36,7 @@ const WIDTH = 'width';
const HEIGHT = 'height'; const HEIGHT = 'height';
const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'; const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
const SELECTOR_DATA_TOGGLE = '[data-mdb-toggle="collapse"]'; const SELECTOR_DATA_TOGGLE = '[data-mdb-collapse-init]';
const Default = { const Default = {
parent: null, parent: null,
@ -68,7 +62,7 @@ class Collapse extends BaseComponent {
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE); const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
for (const elem of toggleList) { for (const elem of toggleList) {
const selector = getSelectorFromElement(elem); const selector = SelectorEngine.getSelectorFromElement(elem);
const filterElement = SelectorEngine.find(selector).filter( const filterElement = SelectorEngine.find(selector).filter(
(foundElement) => foundElement === this._element (foundElement) => foundElement === this._element
); );
@ -186,7 +180,7 @@ class Collapse extends BaseComponent {
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
for (const trigger of this._triggerArray) { for (const trigger of this._triggerArray) {
const element = getElementFromSelector(trigger); const element = SelectorEngine.getElementFromSelector(trigger);
if (element && !this._isShown(element)) { if (element && !this._isShown(element)) {
this._addAriaAndCollapsedClass([trigger], false); this._addAriaAndCollapsedClass([trigger], false);
@ -230,7 +224,7 @@ class Collapse extends BaseComponent {
const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE); const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);
for (const element of children) { for (const element of children) {
const selected = getElementFromSelector(element); const selected = SelectorEngine.getElementFromSelector(element);
if (selected) { if (selected) {
this._addAriaAndCollapsedClass([element], this._isShown(selected)); this._addAriaAndCollapsedClass([element], this._isShown(selected));
@ -282,27 +276,24 @@ class Collapse extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element // // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if ( // if (
event.target.tagName === 'A' || // event.target.tagName === 'A' ||
(event.delegateTarget && event.delegateTarget.tagName === 'A') // (event.delegateTarget && event.delegateTarget.tagName === 'A')
) { // ) {
event.preventDefault(); // event.preventDefault();
} // }
const selector = getSelectorFromElement(this); // for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
const selectorElements = SelectorEngine.find(selector); // Collapse.getOrCreateInstance(element, { toggle: false }).toggle();
// }
for (const element of selectorElements) { // });
Collapse.getOrCreateInstance(element, { toggle: false }).toggle();
}
});
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Collapse); // defineJQueryPlugin(Collapse);
export default Collapse; export default Collapse;

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/data.js * Bootstrap dom/data.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */

View File

@ -1,11 +1,11 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/event-handler.js * Bootstrap dom/event-handler.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { getjQuery } from '../util/index'; import { getjQuery } from '../util/index.js';
/** /**
* Constants * Constants
@ -129,7 +129,7 @@ function findHandler(events, callable, delegationSelector = null) {
function normalizeParameters(originalTypeEvent, handler, delegationFunction) { function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
const isDelegated = typeof handler === 'string'; const isDelegated = typeof handler === 'string';
// todo: tooltip passes `false` instead of selector, so we need to check // TODO: tooltip passes `false` instead of selector, so we need to check
const callable = isDelegated ? delegationFunction : handler || delegationFunction; const callable = isDelegated ? delegationFunction : handler || delegationFunction;
let typeEvent = getTypeEvent(originalTypeEvent); let typeEvent = getTypeEvent(originalTypeEvent);
@ -207,9 +207,8 @@ function removeHandler(element, events, typeEvent, handler, delegationSelector)
function removeNamespacedHandlers(element, events, typeEvent, namespace) { function removeNamespacedHandlers(element, events, typeEvent, namespace) {
const storeElementEvent = events[typeEvent] || {}; const storeElementEvent = events[typeEvent] || {};
for (const handlerKey of Object.keys(storeElementEvent)) { for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
if (handlerKey.includes(namespace)) { if (handlerKey.includes(namespace)) {
const event = storeElementEvent[handlerKey];
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
} }
} }
@ -261,11 +260,10 @@ const EventHandler = {
} }
} }
for (const keyHandlers of Object.keys(storeElementEvent)) { for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
const handlerKey = keyHandlers.replace(stripUidRegex, ''); const handlerKey = keyHandlers.replace(stripUidRegex, '');
if (!inNamespace || originalTypeEvent.includes(handlerKey)) { if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
const event = storeElementEvent[keyHandlers];
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector); removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
} }
} }
@ -294,8 +292,7 @@ const EventHandler = {
defaultPrevented = jQueryEvent.isDefaultPrevented(); defaultPrevented = jQueryEvent.isDefaultPrevented();
} }
let evt = new Event(event, { bubbles, cancelable: true }); const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args);
evt = hydrateObj(evt, args);
if (defaultPrevented) { if (defaultPrevented) {
evt.preventDefault(); evt.preventDefault();
@ -313,8 +310,8 @@ const EventHandler = {
}, },
}; };
function hydrateObj(obj, meta) { function hydrateObj(obj, meta = {}) {
for (const [key, value] of Object.entries(meta || {})) { for (const [key, value] of Object.entries(meta)) {
try { try {
obj[key] = value; obj[key] = value;
} catch { } catch {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/manipulator.js * Bootstrap dom/manipulator.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */

View File

@ -1,15 +1,36 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dom/selector-engine.js * Bootstrap dom/selector-engine.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { isDisabled, isVisible } from '../util/index'; import { isDisabled, isVisible, parseSelector } from '../util/index.js';
/** const getSelector = (element) => {
* Constants let selector = element.getAttribute('data-mdb-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 !== '#' ? parseSelector(hrefAttribute.trim()) : null;
}
return selector;
};
const SelectorEngine = { const SelectorEngine = {
find(selector, element = document.documentElement) { find(selector, element = document.documentElement) {
@ -80,6 +101,28 @@ const SelectorEngine = {
return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el)); return this.find(focusables, element).filter((el) => !isDisabled(el) && 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) : [];
},
}; };
export default SelectorEngine; export default SelectorEngine;

View File

@ -1,13 +1,18 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): dropdown.js * Bootstrap dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import * as Popper from '@popperjs/core'; import * as Popper from '@popperjs/core';
import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler.js';
import Manipulator from './dom/manipulator.js';
import SelectorEngine from './dom/selector-engine.js';
import { import {
defineJQueryPlugin, defineJQueryPlugin,
execute,
getElement, getElement,
getNextActiveElement, getNextActiveElement,
isDisabled, isDisabled,
@ -15,11 +20,7 @@ import {
isRTL, isRTL,
isVisible, isVisible,
noop, noop,
} from './util/index'; } from './util/index.js';
import EventHandler from './dom/event-handler';
import Manipulator from './dom/manipulator';
import SelectorEngine from './dom/selector-engine';
import BaseComponent from './base-component';
/** /**
* Constants * Constants
@ -51,7 +52,7 @@ const CLASS_NAME_DROPSTART = 'dropstart';
const CLASS_NAME_DROPUP_CENTER = 'dropup-center'; const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'; const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
const SELECTOR_DATA_TOGGLE = '[data-mdb-toggle="dropdown"]:not(.disabled):not(:disabled)'; const SELECTOR_DATA_TOGGLE = '[data-mdb-dropdown-initialized]:not(.disabled):not(:disabled)';
const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`; const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`;
const SELECTOR_MENU = '.dropdown-menu'; const SELECTOR_MENU = '.dropdown-menu';
const SELECTOR_NAVBAR = '.navbar'; const SELECTOR_NAVBAR = '.navbar';
@ -95,7 +96,7 @@ class Dropdown extends BaseComponent {
this._popper = null; this._popper = null;
this._parent = this._element.parentNode; // dropdown wrapper this._parent = this._element.parentNode; // dropdown wrapper
// todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
this._menu = this._menu =
SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||
SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||
@ -317,7 +318,7 @@ class Dropdown extends BaseComponent {
// Disable Popper if we have a static display or Dropdown is in Navbar // Disable Popper if we have a static display or Dropdown is in Navbar
if (this._inNavbar || this._config.display === 'static') { if (this._inNavbar || this._config.display === 'static') {
Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
defaultBsPopperConfig.modifiers = [ defaultBsPopperConfig.modifiers = [
{ {
name: 'applyStyles', name: 'applyStyles',
@ -328,9 +329,7 @@ class Dropdown extends BaseComponent {
return { return {
...defaultBsPopperConfig, ...defaultBsPopperConfig,
...(typeof this._config.popperConfig === 'function' ...execute(this._config.popperConfig, [defaultBsPopperConfig]),
? this._config.popperConfig(defaultBsPopperConfig)
: this._config.popperConfig),
}; };
} }
@ -425,7 +424,7 @@ class Dropdown extends BaseComponent {
event.preventDefault(); event.preventDefault();
// todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE)
? this ? this
: SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||
@ -454,24 +453,24 @@ class Dropdown extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on( // EventHandler.on(
document, // document,
EVENT_KEYDOWN_DATA_API, // EVENT_KEYDOWN_DATA_API,
SELECTOR_DATA_TOGGLE, // SELECTOR_DATA_TOGGLE,
Dropdown.dataApiKeydownHandler // Dropdown.dataApiKeydownHandler
); // );
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, 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_CLICK_DATA_API, Dropdown.clearMenus);
EventHandler.on(document, EVENT_KEYUP_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) { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
event.preventDefault(); // event.preventDefault();
Dropdown.getOrCreateInstance(this).toggle(); // Dropdown.getOrCreateInstance(this).toggle();
}); // });
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Dropdown); // defineJQueryPlugin(Dropdown);
export default Dropdown; export default Dropdown;

View File

@ -1,18 +1,18 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): modal.js * Bootstrap modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { defineJQueryPlugin, getElementFromSelector, isRTL, isVisible, reflow } from './util/index'; import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler'; import EventHandler from './dom/event-handler.js';
import SelectorEngine from './dom/selector-engine'; import SelectorEngine from './dom/selector-engine.js';
import ScrollBarHelper from './util/scrollbar'; import Backdrop from './util/backdrop.js';
import BaseComponent from './base-component'; import { enableDismissTrigger } from './util/component-functions.js';
import Backdrop from './util/backdrop'; import FocusTrap from './util/focustrap.js';
import FocusTrap from './util/focustrap'; import { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js';
import { enableDismissTrigger } from './util/component-functions'; import ScrollBarHelper from './util/scrollbar.js';
/** /**
* Constants * Constants
@ -139,12 +139,12 @@ class Modal extends BaseComponent {
} }
dispose() { dispose() {
for (const htmlElement of [window, this._dialog]) { EventHandler.off(window, EVENT_KEY);
EventHandler.off(htmlElement, EVENT_KEY); EventHandler.off(this._dialog, EVENT_KEY);
}
this._backdrop.dispose(); this._backdrop.dispose();
this._focustrap.deactivate(); this._focustrap.deactivate();
super.dispose(); super.dispose();
} }
@ -208,7 +208,6 @@ class Modal extends BaseComponent {
} }
if (this._config.keyboard) { if (this._config.keyboard) {
event.preventDefault();
this.hide(); this.hide();
return; return;
} }
@ -335,45 +334,45 @@ class Modal extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
const target = getElementFromSelector(this); // const target = SelectorEngine.getElementFromSelector(this);
if (['A', 'AREA'].includes(this.tagName)) { // if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault(); // event.preventDefault();
} // }
EventHandler.one(target, EVENT_SHOW, (showEvent) => { // EventHandler.one(target, EVENT_SHOW, (showEvent) => {
if (showEvent.defaultPrevented) { // if (showEvent.defaultPrevented) {
// only register focus restorer if modal will actually get shown // // only register focus restorer if modal will actually get shown
return; // return;
} // }
EventHandler.one(target, EVENT_HIDDEN, () => { // EventHandler.one(target, EVENT_HIDDEN, () => {
if (isVisible(this)) { // if (isVisible(this)) {
this.focus(); // this.focus();
} // }
}); // });
}); // });
// avoid conflict when clicking modal toggler while another one is open // // avoid conflict when clicking modal toggler while another one is open
const allreadyOpenedModals = SelectorEngine.find(OPEN_SELECTOR); // const allreadyOpenedModals = SelectorEngine.find(OPEN_SELECTOR);
allreadyOpenedModals.forEach((modal) => { // allreadyOpenedModals.forEach((modal) => {
if (!modal.classList.contains('modal-non-invasive-show')) { // if (!modal.classList.contains('modal-non-invasive-show')) {
Modal.getInstance(modal).hide(); // Modal.getInstance(modal).hide();
} // }
}); // });
const data = Modal.getOrCreateInstance(target); // const data = Modal.getOrCreateInstance(target);
data.toggle(this); // data.toggle(this);
}); // });
enableDismissTrigger(Modal); // enableDismissTrigger(Modal);
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Modal); // defineJQueryPlugin(Modal);
export default Modal; export default Modal;

View File

@ -1,18 +1,18 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): offcanvas.js * Bootstrap offcanvas.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { defineJQueryPlugin, getElementFromSelector, isDisabled, isVisible } from './util/index'; import BaseComponent from './base-component.js';
import ScrollBarHelper from './util/scrollbar'; import EventHandler from './dom/event-handler.js';
import EventHandler from './dom/event-handler'; import SelectorEngine from './dom/selector-engine.js';
import BaseComponent from './base-component'; import Backdrop from './util/backdrop.js';
import SelectorEngine from './dom/selector-engine'; import { enableDismissTrigger } from './util/component-functions.js';
import Backdrop from './util/backdrop'; import FocusTrap from './util/focustrap.js';
import FocusTrap from './util/focustrap'; import { defineJQueryPlugin, isDisabled, isVisible } from './util/index.js';
import { enableDismissTrigger } from './util/component-functions'; import ScrollBarHelper from './util/scrollbar.js';
/** /**
* Constants * Constants
@ -194,12 +194,12 @@ class Offcanvas extends BaseComponent {
return; return;
} }
if (!this._config.keyboard) { if (this._config.keyboard) {
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); this.hide();
return; return;
} }
this.hide(); EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
}); });
} }
@ -225,54 +225,54 @@ class Offcanvas extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
const target = getElementFromSelector(this); // const target = SelectorEngine.getElementFromSelector(this);
if (['A', 'AREA'].includes(this.tagName)) { // if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault(); // event.preventDefault();
} // }
if (isDisabled(this)) { // if (isDisabled(this)) {
return; // return;
} // }
EventHandler.one(target, EVENT_HIDDEN, () => { // EventHandler.one(target, EVENT_HIDDEN, () => {
// focus on trigger when it is closed // // focus on trigger when it is closed
if (isVisible(this)) { // if (isVisible(this)) {
this.focus(); // this.focus();
} // }
}); // });
// avoid conflict when clicking a toggler of an offcanvas, while another is open // // avoid conflict when clicking a toggler of an offcanvas, while another is open
const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); // const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
if (alreadyOpen && alreadyOpen !== target) { // if (alreadyOpen && alreadyOpen !== target) {
Offcanvas.getInstance(alreadyOpen).hide(); // Offcanvas.getInstance(alreadyOpen).hide();
} // }
const data = Offcanvas.getOrCreateInstance(target); // const data = Offcanvas.getOrCreateInstance(target);
data.toggle(this); // data.toggle(this);
}); // });
EventHandler.on(window, EVENT_LOAD_DATA_API, () => { // EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
for (const selector of SelectorEngine.find(OPEN_SELECTOR)) { // for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
Offcanvas.getOrCreateInstance(selector).show(); // Offcanvas.getOrCreateInstance(selector).show();
} // }
}); // });
EventHandler.on(window, EVENT_RESIZE, () => { // EventHandler.on(window, EVENT_RESIZE, () => {
for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) { // for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
if (getComputedStyle(element).position !== 'fixed') { // if (getComputedStyle(element).position !== 'fixed') {
Offcanvas.getOrCreateInstance(element).hide(); // Offcanvas.getOrCreateInstance(element).hide();
} // }
} // }
}); // });
enableDismissTrigger(Offcanvas); // enableDismissTrigger(Offcanvas);
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Offcanvas); // defineJQueryPlugin(Offcanvas);
export default Offcanvas; export default Offcanvas;

View File

@ -1,12 +1,12 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): popover.js * Bootstrap popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { defineJQueryPlugin } from './util/index'; import Tooltip from './tooltip.js';
import Tooltip from './tooltip'; import { defineJQueryPlugin } from './util/index.js';
/** /**
* Constants * Constants
@ -93,6 +93,6 @@ class Popover extends Tooltip {
* jQuery * jQuery
*/ */
defineJQueryPlugin(Popover); // defineJQueryPlugin(Popover);
export default Popover; export default Popover;

View File

@ -1,20 +1,14 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): scrollspy.js * Bootstrap scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { import BaseComponent from './base-component.js';
defineJQueryPlugin, import EventHandler from './dom/event-handler.js';
getElement, import SelectorEngine from './dom/selector-engine.js';
isDisabled, import { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js';
isVisible,
getSelectorFromElement,
} from './util/index';
import EventHandler from './dom/event-handler';
import SelectorEngine from './dom/selector-engine';
import BaseComponent from './base-component';
/** /**
* Constants * Constants
@ -166,6 +160,7 @@ class ScrollSpy extends BaseComponent {
threshold: this._config.threshold, threshold: this._config.threshold,
rootMargin: this._config.rootMargin, rootMargin: this._config.rootMargin,
}; };
return new IntersectionObserver((entries) => this._observerCallback(entries), options); return new IntersectionObserver((entries) => this._observerCallback(entries), options);
} }
@ -221,11 +216,11 @@ class ScrollSpy extends BaseComponent {
continue; continue;
} }
const observableSection = SelectorEngine.findOne(anchor.hash, this._element); const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
// ensure that the observableSection exists & is visible // ensure that the observableSection exists & is visible
if (isVisible(observableSection)) { if (isVisible(observableSection)) {
this._targetLinks.set(anchor.hash, anchor); this._targetLinks.set(decodeURI(anchor.hash), anchor);
this._observableSections.set(anchor.hash, observableSection); this._observableSections.set(anchor.hash, observableSection);
} }
} }
@ -307,6 +302,6 @@ class ScrollSpy extends BaseComponent {
* jQuery * jQuery
*/ */
defineJQueryPlugin(ScrollSpy); // defineJQueryPlugin(ScrollSpy);
export default ScrollSpy; export default ScrollSpy;

View File

@ -1,19 +1,14 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): tab.js * Bootstrap tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { import BaseComponent from './base-component.js';
defineJQueryPlugin, import EventHandler from './dom/event-handler.js';
getElementFromSelector, import SelectorEngine from './dom/selector-engine.js';
getNextActiveElement, import { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js';
isDisabled,
} from './util/index';
import EventHandler from './dom/event-handler';
import SelectorEngine from './dom/selector-engine';
import BaseComponent from './base-component';
/** /**
* Constants * Constants
@ -35,6 +30,8 @@ const ARROW_LEFT_KEY = 'ArrowLeft';
const ARROW_RIGHT_KEY = 'ArrowRight'; const ARROW_RIGHT_KEY = 'ArrowRight';
const ARROW_UP_KEY = 'ArrowUp'; const ARROW_UP_KEY = 'ArrowUp';
const ARROW_DOWN_KEY = 'ArrowDown'; const ARROW_DOWN_KEY = 'ArrowDown';
const HOME_KEY = 'Home';
const END_KEY = 'End';
const CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
@ -43,13 +40,12 @@ const CLASS_DROPDOWN = 'dropdown';
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'; const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)'; const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'; const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
const SELECTOR_OUTER = '.nav-item, .list-group-item'; const SELECTOR_OUTER = '.nav-item, .list-group-item';
const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`; const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
const SELECTOR_DATA_TOGGLE = const SELECTOR_DATA_TOGGLE = '[data-mdb-tab-initialized]'; // todo:v6: could be only `tab`
'[data-mdb-toggle="tab"], [data-mdb-toggle="pill"], [data-mdb-toggle="list"]'; // todo:v6: could be only `tab`
const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`; const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-mdb-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-mdb-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-mdb-toggle="list"]`; const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-mdb-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-mdb-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-mdb-toggle="list"]`;
@ -65,7 +61,7 @@ class Tab extends BaseComponent {
if (!this._parent) { if (!this._parent) {
return; return;
// todo: should Throw exception on v6 // TODO: should throw exception in v6
// throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`) // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
} }
@ -113,7 +109,7 @@ class Tab extends BaseComponent {
element.classList.add(CLASS_NAME_ACTIVE); element.classList.add(CLASS_NAME_ACTIVE);
this._activate(getElementFromSelector(element)); // Search and activate/show the proper section this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
const complete = () => { const complete = () => {
if (element.getAttribute('role') !== 'tab') { if (element.getAttribute('role') !== 'tab') {
@ -140,7 +136,7 @@ class Tab extends BaseComponent {
element.classList.remove(CLASS_NAME_ACTIVE); element.classList.remove(CLASS_NAME_ACTIVE);
element.blur(); element.blur();
this._deactivate(getElementFromSelector(element)); // Search and deactivate the shown section too this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too
const complete = () => { const complete = () => {
if (element.getAttribute('role') !== 'tab') { if (element.getAttribute('role') !== 'tab') {
@ -158,19 +154,26 @@ class Tab extends BaseComponent {
} }
_keydown(event) { _keydown(event) {
if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) { if (
![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(
event.key
)
) {
return; return;
} }
event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
event.preventDefault(); event.preventDefault();
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
const nextActiveElement = getNextActiveElement( const children = this._getChildren().filter((element) => !isDisabled(element));
this._getChildren().filter((element) => !isDisabled(element)), let nextActiveElement;
event.target,
isNext, if ([HOME_KEY, END_KEY].includes(event.key)) {
true nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
); } else {
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
}
if (nextActiveElement) { if (nextActiveElement) {
nextActiveElement.focus({ preventScroll: true }); nextActiveElement.focus({ preventScroll: true });
@ -216,7 +219,7 @@ class Tab extends BaseComponent {
} }
_setInitialAttributesOnTargetPanel(child) { _setInitialAttributesOnTargetPanel(child) {
const target = getElementFromSelector(child); const target = SelectorEngine.getElementFromSelector(child);
if (!target) { if (!target) {
return; return;
@ -225,7 +228,7 @@ class Tab extends BaseComponent {
this._setAttributeIfNotExists(target, 'role', 'tabpanel'); this._setAttributeIfNotExists(target, 'role', 'tabpanel');
if (child.id) { if (child.id) {
this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`); this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);
} }
} }
@ -291,30 +294,30 @@ class Tab extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { // EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
if (['A', 'AREA'].includes(this.tagName)) { // if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault(); // event.preventDefault();
} // }
if (isDisabled(this)) { // if (isDisabled(this)) {
return; // return;
} // }
Tab.getOrCreateInstance(this).show(); // Tab.getOrCreateInstance(this).show();
}); // });
/** /**
* Initialize on focus * Initialize on focus
*/ */
EventHandler.on(window, EVENT_LOAD_DATA_API, () => { // EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) { // for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
Tab.getOrCreateInstance(element); // Tab.getOrCreateInstance(element);
} // }
}); // });
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Tab); // defineJQueryPlugin(Tab);
export default Tab; export default Tab;

View File

@ -1,14 +1,14 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): toast.js * Bootstrap toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { defineJQueryPlugin, reflow } from './util/index'; import BaseComponent from './base-component.js';
import EventHandler from './dom/event-handler'; import EventHandler from './dom/event-handler.js';
import BaseComponent from './base-component'; import { enableDismissTrigger } from './util/component-functions.js';
import { enableDismissTrigger } from './util/component-functions'; import { defineJQueryPlugin, reflow } from './util/index.js';
/** /**
* Constants * Constants
@ -214,12 +214,12 @@ class Toast extends BaseComponent {
* Data API implementation * Data API implementation
*/ */
enableDismissTrigger(Toast); // enableDismissTrigger(Toast);
/** /**
* jQuery * jQuery
*/ */
defineJQueryPlugin(Toast); // defineJQueryPlugin(Toast);
export default Toast; export default Toast;

View File

@ -1,17 +1,25 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): tooltip.js * Bootstrap tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import * as Popper from '@popperjs/core'; import * as Popper from '@popperjs/core';
import { defineJQueryPlugin, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index'; import BaseComponent from './base-component.js';
import { DefaultAllowlist } from './util/sanitizer'; import EventHandler from './dom/event-handler.js';
import EventHandler from './dom/event-handler'; import Manipulator from './dom/manipulator.js';
import Manipulator from './dom/manipulator'; import {
import BaseComponent from './base-component'; defineJQueryPlugin,
import TemplateFactory from './util/template-factory'; execute,
findShadowRoot,
getElement,
getUID,
isRTL,
noop,
} from './util/index.js';
import { DefaultAllowlist } from './util/sanitizer.js';
import TemplateFactory from './util/template-factory.js';
/** /**
* Constants * Constants
@ -62,7 +70,7 @@ const Default = {
delay: 0, delay: 0,
fallbackPlacements: ['top', 'right', 'bottom', 'left'], fallbackPlacements: ['top', 'right', 'bottom', 'left'],
html: false, html: false,
offset: [0, 0], offset: [0, 6],
placement: 'top', placement: 'top',
popperConfig: null, popperConfig: null,
sanitize: true, sanitize: true,
@ -204,7 +212,7 @@ class Tooltip extends BaseComponent {
return; return;
} }
// todo v6 remove this OR make it optional // TODO: v6 remove this or make it optional
this._disposePopper(); this._disposePopper();
const tip = this._getTipElement(); const tip = this._getTipElement();
@ -309,13 +317,13 @@ class Tooltip extends BaseComponent {
_createTipElement(content) { _createTipElement(content) {
const tip = this._getTemplateFactory(content).toHtml(); const tip = this._getTemplateFactory(content).toHtml();
// todo: remove this check on v6 // TODO: remove this check in v6
if (!tip) { if (!tip) {
return null; return null;
} }
tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
// todo: on v6 the following can be achieved with CSS only // TODO: v6 the following can be achieved with CSS only
tip.classList.add(`bs-${this.constructor.NAME}-auto`); tip.classList.add(`bs-${this.constructor.NAME}-auto`);
const tipId = getUID(this.constructor.NAME).toString(); const tipId = getUID(this.constructor.NAME).toString();
@ -380,10 +388,7 @@ class Tooltip extends BaseComponent {
} }
_createPopper(tip) { _createPopper(tip) {
const placement = const placement = execute(this._config.placement, [this, tip, this._element]);
typeof this._config.placement === 'function'
? this._config.placement.call(this, tip, this._element)
: this._config.placement;
const attachment = AttachmentMap[placement.toUpperCase()]; const attachment = AttachmentMap[placement.toUpperCase()];
return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment)); return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));
} }
@ -403,7 +408,7 @@ class Tooltip extends BaseComponent {
} }
_resolvePossibleFunction(arg) { _resolvePossibleFunction(arg) {
return typeof arg === 'function' ? arg.call(this._element) : arg; return execute(arg, [this._element]);
} }
_getPopperConfig(attachment) { _getPopperConfig(attachment) {
@ -449,9 +454,7 @@ class Tooltip extends BaseComponent {
return { return {
...defaultBsPopperConfig, ...defaultBsPopperConfig,
...(typeof this._config.popperConfig === 'function' ...execute(this._config.popperConfig, [defaultBsPopperConfig]),
? this._config.popperConfig(defaultBsPopperConfig)
: this._config.popperConfig),
}; };
} }
@ -603,9 +606,9 @@ class Tooltip extends BaseComponent {
_getDelegateConfig() { _getDelegateConfig() {
const config = {}; const config = {};
for (const key in this._config) { for (const [key, value] of Object.entries(this._config)) {
if (this.constructor.Default[key] !== this._config[key]) { if (this.constructor.Default[key] !== value) {
config[key] = this._config[key]; config[key] = value;
} }
} }
@ -652,6 +655,6 @@ class Tooltip extends BaseComponent {
* jQuery * jQuery
*/ */
defineJQueryPlugin(Tooltip); // defineJQueryPlugin(Tooltip);
export default Tooltip; export default Tooltip;

View File

@ -1,13 +1,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/backdrop.js * Bootstrap util/backdrop.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import EventHandler from '../dom/event-handler'; import EventHandler from '../dom/event-handler.js';
import { execute, executeAfterTransition, getElement, reflow } from './index'; import Config from './config.js';
import Config from './config'; import { execute, executeAfterTransition, getElement, reflow } from './index.js';
/** /**
* Constants * Constants

View File

@ -1,12 +1,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/component-functions.js * Bootstrap util/component-functions.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import EventHandler from '../dom/event-handler'; import EventHandler from '../dom/event-handler.js';
import { getElementFromSelector, isDisabled } from './index'; import SelectorEngine from '../dom/selector-engine.js';
import { isDisabled } from './index.js';
const enableDismissTrigger = (component, method = 'hide') => { const enableDismissTrigger = (component, method = 'hide') => {
const clickEvent = `click.dismiss${component.EVENT_KEY}`; const clickEvent = `click.dismiss${component.EVENT_KEY}`;
@ -21,7 +22,7 @@ const enableDismissTrigger = (component, method = 'hide') => {
return; return;
} }
const target = getElementFromSelector(this) || this.closest(`.${name}`); const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
const instance = component.getOrCreateInstance(target); const instance = component.getOrCreateInstance(target);
// Method argument is left, for Alert and only, as it doesn't implement the 'hide' method // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method

View File

@ -1,12 +1,12 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/config.js * Bootstrap util/config.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import { isElement, toType } from './index'; import Manipulator from '../dom/manipulator.js';
import Manipulator from '../dom/manipulator'; import { isElement, toType } from './index.js';
/** /**
* Class definition * Class definition
@ -49,8 +49,7 @@ class Config {
} }
_typeCheckConfig(config, configTypes = this.constructor.DefaultType) { _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
for (const property of Object.keys(configTypes)) { for (const [property, expectedTypes] of Object.entries(configTypes)) {
const expectedTypes = configTypes[property];
const value = config[property]; const value = config[property];
const valueType = isElement(value) ? 'element' : toType(value); const valueType = isElement(value) ? 'element' : toType(value);

View File

@ -1,13 +1,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/focustrap.js * Bootstrap util/focustrap.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
import EventHandler from '../dom/event-handler'; import EventHandler from '../dom/event-handler.js';
import SelectorEngine from '../dom/selector-engine'; import SelectorEngine from '../dom/selector-engine.js';
import Config from './config'; import Config from './config.js';
/** /**
* Constants * Constants

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/index.js * Bootstrap util/index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -9,6 +9,20 @@ const MAX_UID = 1_000_000;
const MILLISECONDS_MULTIPLIER = 1000; const MILLISECONDS_MULTIPLIER = 1000;
const TRANSITION_END = 'transitionend'; const TRANSITION_END = 'transitionend';
/**
* Properly escape IDs selectors to handle weird IDs
* @param {string} selector
* @returns {string}
*/
const parseSelector = (selector) => {
if (selector && window.CSS && window.CSS.escape) {
// document.querySelector needs escaping to handle IDs (html5+) containing for instance /
selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
}
return selector;
};
// Shout-out Angus Croll (https://goo.gl/pxwQGp) // Shout-out Angus Croll (https://goo.gl/pxwQGp)
const toType = (object) => { const toType = (object) => {
if (object === null || object === undefined) { if (object === null || object === undefined) {
@ -33,47 +47,6 @@ const getUID = (prefix) => {
return prefix; return prefix;
}; };
const getSelector = (element) => {
let selector = element.getAttribute('data-mdb-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;
};
const getSelectorFromElement = (element) => {
const selector = getSelector(element);
if (selector) {
return document.querySelector(selector) ? selector : null;
}
return null;
};
const getElementFromSelector = (element) => {
const selector = getSelector(element);
return selector ? document.querySelector(selector) : null;
};
const getTransitionDurationFromElement = (element) => { const getTransitionDurationFromElement = (element) => {
if (!element) { if (!element) {
return 0; return 0;
@ -123,7 +96,7 @@ const getElement = (object) => {
} }
if (typeof object === 'string' && object.length > 0) { if (typeof object === 'string' && object.length > 0) {
return document.querySelector(object); return document.querySelector(parseSelector(object));
} }
return null; return null;
@ -255,10 +228,8 @@ const defineJQueryPlugin = (plugin) => {
}); });
}; };
const execute = (callback) => { const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
if (typeof callback === 'function') { return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
callback();
}
}; };
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
@ -324,10 +295,8 @@ export {
executeAfterTransition, executeAfterTransition,
findShadowRoot, findShadowRoot,
getElement, getElement,
getElementFromSelector,
getjQuery, getjQuery,
getNextActiveElement, getNextActiveElement,
getSelectorFromElement,
getTransitionDurationFromElement, getTransitionDurationFromElement,
getUID, getUID,
isDisabled, isDisabled,
@ -336,6 +305,7 @@ export {
isVisible, isVisible,
noop, noop,
onDOMContentLoaded, onDOMContentLoaded,
parseSelector,
reflow, reflow,
triggerTransitionEnd, triggerTransitionEnd,
toType, toType,

View File

@ -1,57 +1,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.2.3): util/sanitizer.js * Bootstrap util/sanitizer.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
const uriAttributes = new Set([ // js-docs-start allow-list
'background',
'cite',
'href',
'itemtype',
'longdesc',
'poster',
'src',
'xlink:href',
]);
const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
/**
* A pattern that recognizes a commonly useful subset of URLs that are safe.
*
* Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
*/
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
/**
* A pattern that matches safe data URLs. Only matches image, video and audio types.
*
* Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
*/
const DATA_URL_PATTERN =
/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
const allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase();
if (allowedAttributeList.includes(attributeName)) {
if (uriAttributes.has(attributeName)) {
return Boolean(
SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)
);
}
return true;
}
// Check if a regular expression validates the attribute.
return allowedAttributeList
.filter((attributeRegex) => attributeRegex instanceof RegExp)
.some((regex) => regex.test(attributeName));
};
export const DefaultAllowlist = { export const DefaultAllowlist = {
// Global attributes allowed on any supplied element below. // Global attributes allowed on any supplied element below.
'*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
@ -85,6 +41,44 @@ export const DefaultAllowlist = {
u: [], u: [],
ul: [], ul: [],
}; };
// js-docs-end allow-list
const uriAttributes = new Set([
'background',
'cite',
'href',
'itemtype',
'longdesc',
'poster',
'src',
'xlink:href',
]);
/**
* A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
* contexts.
*
* Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
*/
// eslint-disable-next-line unicorn/better-regex
const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
const allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase();
if (allowedAttributeList.includes(attributeName)) {
if (uriAttributes.has(attributeName)) {
return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
}
return true;
}
// Check if a regular expression validates the attribute.
return allowedAttributeList
.filter((attributeRegex) => attributeRegex instanceof RegExp)
.some((regex) => regex.test(attributeName));
};
export function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) { export function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
if (!unsafeHtml.length) { if (!unsafeHtml.length) {
@ -104,7 +98,6 @@ export function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
if (!Object.keys(allowList).includes(elementName)) { if (!Object.keys(allowList).includes(elementName)) {
element.remove(); element.remove();
continue; continue;
} }

Some files were not shown because too many files have changed in this diff Show More