release: 3.5.0

This commit is contained in:
Grzegorz 2021-04-19 11:23:35 +02:00
parent 4156a2fc5a
commit addd9b8530
148 changed files with 4798 additions and 3817 deletions

BIN
License.pdf Normal file

Binary file not shown.

View File

@ -1,5 +1,5 @@
MDB5 MDB5
Version: FREE 3.4.0 Version: FREE 3.5.0
Documentation: Documentation:
https://mdbootstrap.com/docs/standard/ https://mdbootstrap.com/docs/standard/

10
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

12
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

6
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

4
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

View File

@ -1,6 +1,6 @@
{ {
"name": "mdb-ui-kit", "name": "mdb-ui-kit",
"version": "3.4.0", "version": "3.5.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

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap alert.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap alert.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -25,54 +25,20 @@
var EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler); var EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var MILLISECONDS_MULTIPLIER = 1000; const MILLISECONDS_MULTIPLIER = 1000;
var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp) const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
var getSelector = function getSelector(element) { const getSelector = (element) => {
var selector = element.getAttribute('data-bs-target'); let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, let hrefAttr = 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, // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
// `document.querySelector` will rightfully complain it is invalid. // `document.querySelector` will rightfully complain it is invalid.
// See https://github.com/twbs/bootstrap/issues/32273 // See https://github.com/twbs/bootstrap/issues/32273
@ -91,22 +57,19 @@
return selector; return selector;
}; };
var getElementFromSelector = function getElementFromSelector(element) { const getElementFromSelector = (element) => {
var selector = getSelector(element); const selector = getSelector(element);
return selector ? document.querySelector(selector) : null; return selector ? document.querySelector(selector) : null;
}; };
var getTransitionDurationFromElement = function 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
var _window$getComputedSt = window.getComputedStyle(element), let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
transitionDuration = _window$getComputedSt.transitionDuration, const floatTransitionDuration = Number.parseFloat(transitionDuration);
transitionDelay = _window$getComputedSt.transitionDelay; const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
var floatTransitionDuration = Number.parseFloat(transitionDuration);
var floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) { if (!floatTransitionDuration && !floatTransitionDelay) {
return 0; return 0;
@ -120,14 +83,14 @@
); );
}; };
var triggerTransitionEnd = function triggerTransitionEnd(element) { const triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END)); element.dispatchEvent(new Event(TRANSITION_END));
}; };
var emulateTransitionEnd = function emulateTransitionEnd(element, duration) { const emulateTransitionEnd = (element, duration) => {
var called = false; let called = false;
var durationPadding = 5; const durationPadding = 5;
var emulatedDuration = duration + durationPadding; const emulatedDuration = duration + durationPadding;
function listener() { function listener() {
called = true; called = true;
@ -135,16 +98,15 @@
} }
element.addEventListener(TRANSITION_END, listener); element.addEventListener(TRANSITION_END, listener);
setTimeout(function () { setTimeout(() => {
if (!called) { if (!called) {
triggerTransitionEnd(element); triggerTransitionEnd(element);
} }
}, emulatedDuration); }, emulatedDuration);
}; };
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -153,7 +115,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -161,19 +123,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -181,62 +141,62 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'alert'; const NAME = 'alert';
var DATA_KEY = 'bs.alert'; const DATA_KEY = 'bs.alert';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var DATA_API_KEY = '.data-api'; const DATA_API_KEY = '.data-api';
var SELECTOR_DISMISS = '[data-bs-dismiss="alert"]'; const SELECTOR_DISMISS = '[data-bs-dismiss="alert"]';
var EVENT_CLOSE = 'close' + EVENT_KEY; const EVENT_CLOSE = `close${EVENT_KEY}`;
var EVENT_CLOSED = 'closed' + EVENT_KEY; const EVENT_CLOSED = `closed${EVENT_KEY}`;
var EVENT_CLICK_DATA_API = 'click' + EVENT_KEY + DATA_API_KEY; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
var CLASS_NAME_ALERT = 'alert'; const CLASS_NAME_ALERT = 'alert';
var CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
var CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Class Definition * Class Definition
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Alert = /*#__PURE__*/ (function (_BaseComponent) { class Alert extends BaseComponent__default['default'] {
_inheritsLoose(Alert, _BaseComponent); // Getters
static get DATA_KEY() {
return DATA_KEY;
} // Public
function Alert() { close(element) {
return _BaseComponent.apply(this, arguments) || this; const rootElement = element ? this._getRootElement(element) : this._element;
}
var _proto = Alert.prototype; const customEvent = this._triggerCloseEvent(rootElement);
// Public
_proto.close = function close(element) {
var rootElement = element ? this._getRootElement(element) : this._element;
var customEvent = this._triggerCloseEvent(rootElement);
if (customEvent === null || customEvent.defaultPrevented) { if (customEvent === null || customEvent.defaultPrevented) {
return; return;
} }
this._removeElement(rootElement); this._removeElement(rootElement);
}; // Private } // Private
_proto._getRootElement = function _getRootElement(element) { _getRootElement(element) {
return getElementFromSelector(element) || element.closest('.' + CLASS_NAME_ALERT); return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`);
}; }
_proto._triggerCloseEvent = function _triggerCloseEvent(element) { _triggerCloseEvent(element) {
return EventHandler__default['default'].trigger(element, EVENT_CLOSE); return EventHandler__default['default'].trigger(element, EVENT_CLOSE);
}; }
_proto._removeElement = function _removeElement(element) {
var _this = this;
_removeElement(element) {
element.classList.remove(CLASS_NAME_SHOW); element.classList.remove(CLASS_NAME_SHOW);
if (!element.classList.contains(CLASS_NAME_FADE)) { if (!element.classList.contains(CLASS_NAME_FADE)) {
@ -245,24 +205,24 @@
return; return;
} }
var transitionDuration = getTransitionDurationFromElement(element); const transitionDuration = getTransitionDurationFromElement(element);
EventHandler__default['default'].one(element, 'transitionend', function () { EventHandler__default['default'].one(element, 'transitionend', () =>
return _this._destroyElement(element); this._destroyElement(element)
}); );
emulateTransitionEnd(element, transitionDuration); emulateTransitionEnd(element, transitionDuration);
}; }
_proto._destroyElement = function _destroyElement(element) { _destroyElement(element) {
if (element.parentNode) { if (element.parentNode) {
element.parentNode.removeChild(element); element.parentNode.removeChild(element);
} }
EventHandler__default['default'].trigger(element, EVENT_CLOSED); EventHandler__default['default'].trigger(element, EVENT_CLOSED);
}; // Static } // Static
Alert.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
var data = Data__default['default'].getData(this, DATA_KEY); let data = Data__default['default'].get(this, DATA_KEY);
if (!data) { if (!data) {
data = new Alert(this); data = new Alert(this);
@ -272,9 +232,9 @@
data[config](this); data[config](this);
} }
}); });
}; }
Alert.handleDismiss = function handleDismiss(alertInstance) { static handleDismiss(alertInstance) {
return function (event) { return function (event) {
if (event) { if (event) {
event.preventDefault(); event.preventDefault();
@ -282,20 +242,8 @@
alertInstance.close(this); alertInstance.close(this);
}; };
}; }
}
_createClass(Alert, null, [
{
key: 'DATA_KEY',
// Getters
get: function get() {
return DATA_KEY;
},
},
]);
return Alert;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Data Api implementation * Data Api implementation

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap base-component.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap base-component.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -19,63 +19,46 @@
var Data__default = /*#__PURE__*/ _interopDefaultLegacy(Data); var Data__default = /*#__PURE__*/ _interopDefaultLegacy(Data);
function _defineProperties(target, props) { /**
for (var i = 0; i < props.length; i++) { * --------------------------------------------------------------------------
var descriptor = props[i]; * Bootstrap (v5.0.0-beta3): base-component.js
descriptor.enumerable = descriptor.enumerable || false; * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
descriptor.configurable = true; * --------------------------------------------------------------------------
if ('value' in descriptor) descriptor.writable = true; */
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var VERSION = '5.0.0-beta2'; const VERSION = '5.0.0-beta3';
class BaseComponent {
constructor(element) {
element = typeof element === 'string' ? document.querySelector(element) : element;
var BaseComponent = /*#__PURE__*/ (function () {
function BaseComponent(element) {
if (!element) { if (!element) {
return; return;
} }
this._element = element; this._element = element;
Data__default['default'].setData(element, this.constructor.DATA_KEY, this); Data__default['default'].set(this._element, this.constructor.DATA_KEY, this);
} }
var _proto = BaseComponent.prototype; dispose() {
Data__default['default'].remove(this._element, this.constructor.DATA_KEY);
_proto.dispose = function dispose() {
Data__default['default'].removeData(this._element, this.constructor.DATA_KEY);
this._element = null; this._element = null;
}; }
/** Static */ /** Static */
BaseComponent.getInstance = function getInstance(element) { static getInstance(element) {
return Data__default['default'].getData(element, this.DATA_KEY); return Data__default['default'].get(element, this.DATA_KEY);
}; }
_createClass(BaseComponent, null, [ static get VERSION() {
{
key: 'VERSION',
get: function get() {
return VERSION; return VERSION;
}, }
}, }
]);
return BaseComponent;
})();
return BaseComponent; return BaseComponent;
}); });

View File

@ -1 +1 @@
{"version":3,"file":"base-component.js","sources":["../src/base-component.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.0.0-beta2'\n\nclass BaseComponent {\n constructor(element) {\n if (!element) {\n return\n }\n\n this._element = element\n Data.setData(element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.removeData(this._element, this.constructor.DATA_KEY)\n this._element = null\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.getData(element, this.DATA_KEY)\n }\n\n static get VERSION() {\n return VERSION\n }\n}\n\nexport default BaseComponent\n"],"names":["VERSION","BaseComponent","element","_element","Data","setData","constructor","DATA_KEY","dispose","removeData","getInstance","getData"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASA;EACA;EACA;EACA;EACA;;EAEA,IAAMA,OAAO,GAAG,aAAhB;;MAEMC;EACJ,yBAAYC,OAAZ,EAAqB;EACnB,QAAI,CAACA,OAAL,EAAc;EACZ;EACD;;EAED,SAAKC,QAAL,GAAgBD,OAAhB;EACAE,IAAAA,wBAAI,CAACC,OAAL,CAAaH,OAAb,EAAsB,KAAKI,WAAL,CAAiBC,QAAvC,EAAiD,IAAjD;EACD;;;;WAEDC,UAAA,mBAAU;EACRJ,IAAAA,wBAAI,CAACK,UAAL,CAAgB,KAAKN,QAArB,EAA+B,KAAKG,WAAL,CAAiBC,QAAhD;EACA,SAAKJ,QAAL,GAAgB,IAAhB;EACD;EAED;;;kBAEOO,cAAP,qBAAmBR,OAAnB,EAA4B;EAC1B,WAAOE,wBAAI,CAACO,OAAL,CAAaT,OAAb,EAAsB,KAAKK,QAA3B,CAAP;EACD;;;;WAED,eAAqB;EACnB,aAAOP,OAAP;EACD;;;;;;;;;;;;"} {"version":3,"file":"base-component.js","sources":["../src/base-component.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.0.0-beta3'\n\nclass BaseComponent {\n constructor(element) {\n element = typeof element === 'string' ? document.querySelector(element) : element\n\n if (!element) {\n return\n }\n\n this._element = element\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n this._element = null\n }\n\n /** Static */\n\n static getInstance(element) {\n return Data.get(element, this.DATA_KEY)\n }\n\n static get VERSION() {\n return VERSION\n }\n}\n\nexport default BaseComponent\n"],"names":["VERSION","BaseComponent","constructor","element","document","querySelector","_element","Data","set","DATA_KEY","dispose","remove","getInstance","get"],"mappings":";;;;;;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAIA;EACA;EACA;EACA;EACA;;EAEA,MAAMA,OAAO,GAAG,aAAhB;;EAEA,MAAMC,aAAN,CAAoB;EAClBC,EAAAA,WAAW,CAACC,OAAD,EAAU;EACnBA,IAAAA,OAAO,GAAG,OAAOA,OAAP,KAAmB,QAAnB,GAA8BC,QAAQ,CAACC,aAAT,CAAuBF,OAAvB,CAA9B,GAAgEA,OAA1E;;EAEA,QAAI,CAACA,OAAL,EAAc;EACZ;EACD;;EAED,SAAKG,QAAL,GAAgBH,OAAhB;EACAI,IAAAA,wBAAI,CAACC,GAAL,CAAS,KAAKF,QAAd,EAAwB,KAAKJ,WAAL,CAAiBO,QAAzC,EAAmD,IAAnD;EACD;;EAEDC,EAAAA,OAAO,GAAG;EACRH,IAAAA,wBAAI,CAACI,MAAL,CAAY,KAAKL,QAAjB,EAA2B,KAAKJ,WAAL,CAAiBO,QAA5C;EACA,SAAKH,QAAL,GAAgB,IAAhB;EACD;EAED;;;EAEkB,SAAXM,WAAW,CAACT,OAAD,EAAU;EAC1B,WAAOI,wBAAI,CAACM,GAAL,CAASV,OAAT,EAAkB,KAAKM,QAAvB,CAAP;EACD;;EAEiB,aAAPT,OAAO,GAAG;EACnB,WAAOA,OAAP;EACD;;EAzBiB;;;;;;;;"}

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap button.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap button.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -25,50 +25,15 @@
var EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler); var EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -77,7 +42,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -85,19 +50,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -105,43 +68,45 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'button'; const NAME = 'button';
var DATA_KEY = 'bs.button'; const DATA_KEY = 'bs.button';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var DATA_API_KEY = '.data-api'; const DATA_API_KEY = '.data-api';
var CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="button"]';
var 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
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Button = /*#__PURE__*/ (function (_BaseComponent) { class Button extends BaseComponent__default['default'] {
_inheritsLoose(Button, _BaseComponent); // Getters
static get DATA_KEY() {
return DATA_KEY;
} // Public
function Button() { toggle() {
return _BaseComponent.apply(this, arguments) || this;
}
var _proto = Button.prototype;
// Public
_proto.toggle = function 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
Button.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
var data = Data__default['default'].getData(this, DATA_KEY); let data = Data__default['default'].get(this, DATA_KEY);
if (!data) { if (!data) {
data = new Button(this); data = new Button(this);
@ -151,20 +116,8 @@
data[config](); data[config]();
} }
}); });
}; }
}
_createClass(Button, null, [
{
key: 'DATA_KEY',
// Getters
get: function get() {
return DATA_KEY;
},
},
]);
return Button;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Data Api implementation * Data Api implementation
@ -175,10 +128,10 @@
document, document,
EVENT_CLICK_DATA_API, EVENT_CLICK_DATA_API,
SELECTOR_DATA_TOGGLE, SELECTOR_DATA_TOGGLE,
function (event) { (event) => {
event.preventDefault(); event.preventDefault();
var button = event.target.closest(SELECTOR_DATA_TOGGLE); const button = event.target.closest(SELECTOR_DATA_TOGGLE);
var data = Data__default['default'].getData(button, DATA_KEY); let data = Data__default['default'].get(button, DATA_KEY);
if (!data) { if (!data) {
data = new Button(button); data = new Button(button);

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap collapse.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap collapse.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -41,72 +41,18 @@
var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine); var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_extends =
Object.assign ||
function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var MILLISECONDS_MULTIPLIER = 1000; const MILLISECONDS_MULTIPLIER = 1000;
var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp) const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
var toType = function toType(obj) { const toType = (obj) => {
if (obj === null || obj === undefined) { if (obj === null || obj === undefined) {
return '' + obj; return `${obj}`;
} }
return {}.toString return {}.toString
@ -115,11 +61,11 @@
.toLowerCase(); .toLowerCase();
}; };
var getSelector = function getSelector(element) { const getSelector = (element) => {
var selector = element.getAttribute('data-bs-target'); let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, let hrefAttr = 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, // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
// `document.querySelector` will rightfully complain it is invalid. // `document.querySelector` will rightfully complain it is invalid.
// See https://github.com/twbs/bootstrap/issues/32273 // See https://github.com/twbs/bootstrap/issues/32273
@ -138,8 +84,8 @@
return selector; return selector;
}; };
var getSelectorFromElement = function getSelectorFromElement(element) { const getSelectorFromElement = (element) => {
var selector = getSelector(element); const selector = getSelector(element);
if (selector) { if (selector) {
return document.querySelector(selector) ? selector : null; return document.querySelector(selector) ? selector : null;
@ -148,22 +94,19 @@
return null; return null;
}; };
var getElementFromSelector = function getElementFromSelector(element) { const getElementFromSelector = (element) => {
var selector = getSelector(element); const selector = getSelector(element);
return selector ? document.querySelector(selector) : null; return selector ? document.querySelector(selector) : null;
}; };
var getTransitionDurationFromElement = function 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
var _window$getComputedSt = window.getComputedStyle(element), let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
transitionDuration = _window$getComputedSt.transitionDuration, const floatTransitionDuration = Number.parseFloat(transitionDuration);
transitionDelay = _window$getComputedSt.transitionDelay; const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
var floatTransitionDuration = Number.parseFloat(transitionDuration);
var floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) { if (!floatTransitionDuration && !floatTransitionDelay) {
return 0; return 0;
@ -177,18 +120,16 @@
); );
}; };
var triggerTransitionEnd = function triggerTransitionEnd(element) { const triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END)); element.dispatchEvent(new Event(TRANSITION_END));
}; };
var isElement = function isElement(obj) { const isElement = (obj) => (obj[0] || obj).nodeType;
return (obj[0] || obj).nodeType;
};
var emulateTransitionEnd = function emulateTransitionEnd(element, duration) { const emulateTransitionEnd = (element, duration) => {
var called = false; let called = false;
var durationPadding = 5; const durationPadding = 5;
var emulatedDuration = duration + durationPadding; const emulatedDuration = duration + durationPadding;
function listener() { function listener() {
called = true; called = true;
@ -196,37 +137,33 @@
} }
element.addEventListener(TRANSITION_END, listener); element.addEventListener(TRANSITION_END, listener);
setTimeout(function () { setTimeout(() => {
if (!called) { if (!called) {
triggerTransitionEnd(element); triggerTransitionEnd(element);
} }
}, emulatedDuration); }, emulatedDuration);
}; };
var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) { const typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach(function (property) { Object.keys(configTypes).forEach((property) => {
var expectedTypes = configTypes[property]; const expectedTypes = configTypes[property];
var value = config[property]; const value = config[property];
var valueType = value && isElement(value) ? 'element' : toType(value); const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError( throw new TypeError(
componentName.toUpperCase() + `${componentName.toUpperCase()}: ` +
': ' + `Option "${property}" provided type "${valueType}" ` +
('Option "' + property + '" provided type "' + valueType + '" ') + `but expected type "${expectedTypes}".`
('but expected type "' + expectedTypes + '".')
); );
} }
}); });
}; };
var reflow = function reflow(element) { const reflow = (element) => element.offsetHeight;
return element.offsetHeight;
};
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -235,7 +172,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -243,19 +180,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -263,117 +198,115 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'collapse'; const NAME = 'collapse';
var DATA_KEY = 'bs.collapse'; const DATA_KEY = 'bs.collapse';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var DATA_API_KEY = '.data-api'; const DATA_API_KEY = '.data-api';
var Default = { const Default = {
toggle: true, toggle: true,
parent: '', parent: '',
}; };
var DefaultType = { const DefaultType = {
toggle: 'boolean', toggle: 'boolean',
parent: '(string|element)', parent: '(string|element)',
}; };
var EVENT_SHOW = 'show' + EVENT_KEY; const EVENT_SHOW = `show${EVENT_KEY}`;
var EVENT_SHOWN = 'shown' + EVENT_KEY; const EVENT_SHOWN = `shown${EVENT_KEY}`;
var EVENT_HIDE = 'hide' + EVENT_KEY; const EVENT_HIDE = `hide${EVENT_KEY}`;
var EVENT_HIDDEN = 'hidden' + EVENT_KEY; const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
var EVENT_CLICK_DATA_API = 'click' + EVENT_KEY + DATA_API_KEY; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
var CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
var CLASS_NAME_COLLAPSE = 'collapse'; const CLASS_NAME_COLLAPSE = 'collapse';
var CLASS_NAME_COLLAPSING = 'collapsing'; const CLASS_NAME_COLLAPSING = 'collapsing';
var CLASS_NAME_COLLAPSED = 'collapsed'; const CLASS_NAME_COLLAPSED = 'collapsed';
var WIDTH = 'width'; const WIDTH = 'width';
var HEIGHT = 'height'; const HEIGHT = 'height';
var SELECTOR_ACTIVES = '.show, .collapsing'; const SELECTOR_ACTIVES = '.show, .collapsing';
var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Class Definition * Class Definition
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Collapse = /*#__PURE__*/ (function (_BaseComponent) { class Collapse extends BaseComponent__default['default'] {
_inheritsLoose(Collapse, _BaseComponent); constructor(element, config) {
super(element);
function Collapse(element, config) { this._isTransitioning = false;
var _this; this._config = this._getConfig(config);
this._triggerArray = SelectorEngine__default['default'].find(
_this = _BaseComponent.call(this, element) || this; `${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` +
_this._isTransitioning = false; `${SELECTOR_DATA_TOGGLE}[data-bs-target="#${this._element.id}"]`
_this._config = _this._getConfig(config);
_this._triggerArray = SelectorEngine__default['default'].find(
SELECTOR_DATA_TOGGLE +
'[href="#' +
element.id +
'"],' +
(SELECTOR_DATA_TOGGLE + '[data-bs-target="#' + element.id + '"]')
); );
var toggleList = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE); const toggleList = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
for (var i = 0, len = toggleList.length; i < len; i++) { for (let i = 0, len = toggleList.length; i < len; i++) {
var elem = toggleList[i]; const elem = toggleList[i];
var selector = getSelectorFromElement(elem); const selector = getSelectorFromElement(elem);
var filterElement = SelectorEngine__default['default'] const filterElement = SelectorEngine__default['default']
.find(selector) .find(selector)
.filter(function (foundElem) { .filter((foundElem) => foundElem === this._element);
return foundElem === element;
});
if (selector !== null && filterElement.length) { if (selector !== null && filterElement.length) {
_this._selector = selector; this._selector = selector;
_this._triggerArray.push(elem); this._triggerArray.push(elem);
} }
} }
_this._parent = _this._config.parent ? _this._getParent() : null; this._parent = this._config.parent ? this._getParent() : null;
if (!_this._config.parent) { if (!this._config.parent) {
_this._addAriaAndCollapsedClass(_this._element, _this._triggerArray); this._addAriaAndCollapsedClass(this._element, this._triggerArray);
} }
if (_this._config.toggle) { if (this._config.toggle) {
_this.toggle(); this.toggle();
} }
return _this;
} // Getters } // Getters
var _proto = Collapse.prototype; static get Default() {
return Default;
}
// Public static get DATA_KEY() {
_proto.toggle = function toggle() { return DATA_KEY;
} // Public
toggle() {
if (this._element.classList.contains(CLASS_NAME_SHOW)) { if (this._element.classList.contains(CLASS_NAME_SHOW)) {
this.hide(); this.hide();
} else { } else {
this.show(); this.show();
} }
}; }
_proto.show = function show() {
var _this2 = this;
show() {
if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) { if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) {
return; return;
} }
var actives; let actives;
var activesData; let activesData;
if (this._parent) { if (this._parent) {
actives = SelectorEngine__default['default'] actives = SelectorEngine__default['default']
.find(SELECTOR_ACTIVES, this._parent) .find(SELECTOR_ACTIVES, this._parent)
.filter(function (elem) { .filter((elem) => {
if (typeof _this2._config.parent === 'string') { if (typeof this._config.parent === 'string') {
return elem.getAttribute('data-bs-parent') === _this2._config.parent; return elem.getAttribute('data-bs-parent') === this._config.parent;
} }
return elem.classList.contains(CLASS_NAME_COLLAPSE); return elem.classList.contains(CLASS_NAME_COLLAPSE);
@ -384,14 +317,12 @@
} }
} }
var container = SelectorEngine__default['default'].findOne(this._selector); const container = SelectorEngine__default['default'].findOne(this._selector);
if (actives) { if (actives) {
var tempActiveData = actives.find(function (elem) { const tempActiveData = actives.find((elem) => container !== elem);
return container !== elem;
});
activesData = tempActiveData activesData = tempActiveData
? Data__default['default'].getData(tempActiveData, DATA_KEY) ? Data__default['default'].get(tempActiveData, DATA_KEY)
: null; : null;
if (activesData && activesData._isTransitioning) { if (activesData && activesData._isTransitioning) {
@ -399,25 +330,25 @@
} }
} }
var startEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW); const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
if (startEvent.defaultPrevented) { if (startEvent.defaultPrevented) {
return; return;
} }
if (actives) { if (actives) {
actives.forEach(function (elemActive) { actives.forEach((elemActive) => {
if (container !== elemActive) { if (container !== elemActive) {
Collapse.collapseInterface(elemActive, 'hide'); Collapse.collapseInterface(elemActive, 'hide');
} }
if (!activesData) { if (!activesData) {
Data__default['default'].setData(elemActive, DATA_KEY, null); Data__default['default'].set(elemActive, DATA_KEY, null);
} }
}); });
} }
var dimension = this._getDimension(); const dimension = this._getDimension();
this._element.classList.remove(CLASS_NAME_COLLAPSE); this._element.classList.remove(CLASS_NAME_COLLAPSE);
@ -426,7 +357,7 @@
this._element.style[dimension] = 0; this._element.style[dimension] = 0;
if (this._triggerArray.length) { if (this._triggerArray.length) {
this._triggerArray.forEach(function (element) { this._triggerArray.forEach((element) => {
element.classList.remove(CLASS_NAME_COLLAPSED); element.classList.remove(CLASS_NAME_COLLAPSED);
element.setAttribute('aria-expanded', true); element.setAttribute('aria-expanded', true);
}); });
@ -434,54 +365,50 @@
this.setTransitioning(true); this.setTransitioning(true);
var complete = function complete() { const complete = () => {
_this2._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSING);
_this2._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
_this2._element.style[dimension] = ''; this._element.style[dimension] = '';
this.setTransitioning(false);
_this2.setTransitioning(false); EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
EventHandler__default['default'].trigger(_this2._element, EVENT_SHOWN);
}; };
var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
var scrollSize = 'scroll' + capitalizedDimension; const scrollSize = `scroll${capitalizedDimension}`;
var transitionDuration = getTransitionDurationFromElement(this._element); const transitionDuration = getTransitionDurationFromElement(this._element);
EventHandler__default['default'].one(this._element, 'transitionend', complete); EventHandler__default['default'].one(this._element, 'transitionend', complete);
emulateTransitionEnd(this._element, transitionDuration); emulateTransitionEnd(this._element, transitionDuration);
this._element.style[dimension] = this._element[scrollSize] + 'px'; this._element.style[dimension] = `${this._element[scrollSize]}px`;
}; }
_proto.hide = function hide() {
var _this3 = this;
hide() {
if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) { if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) {
return; return;
} }
var startEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE); const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
if (startEvent.defaultPrevented) { if (startEvent.defaultPrevented) {
return; return;
} }
var 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`;
reflow(this._element); 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);
var triggerArrayLength = this._triggerArray.length; const triggerArrayLength = this._triggerArray.length;
if (triggerArrayLength > 0) { if (triggerArrayLength > 0) {
for (var i = 0; i < triggerArrayLength; i++) { for (let i = 0; i < triggerArrayLength; i++) {
var trigger = this._triggerArray[i]; const trigger = this._triggerArray[i];
var elem = getElementFromSelector(trigger); const elem = getElementFromSelector(trigger);
if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) { if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) {
trigger.classList.add(CLASS_NAME_COLLAPSED); trigger.classList.add(CLASS_NAME_COLLAPSED);
@ -492,51 +419,48 @@
this.setTransitioning(true); this.setTransitioning(true);
var complete = function complete() { const complete = () => {
_this3.setTransitioning(false); this.setTransitioning(false);
_this3._element.classList.remove(CLASS_NAME_COLLAPSING); this._element.classList.remove(CLASS_NAME_COLLAPSING);
_this3._element.classList.add(CLASS_NAME_COLLAPSE); this._element.classList.add(CLASS_NAME_COLLAPSE);
EventHandler__default['default'].trigger(_this3._element, EVENT_HIDDEN); EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
}; };
this._element.style[dimension] = ''; this._element.style[dimension] = '';
var transitionDuration = getTransitionDurationFromElement(this._element); const transitionDuration = getTransitionDurationFromElement(this._element);
EventHandler__default['default'].one(this._element, 'transitionend', complete); EventHandler__default['default'].one(this._element, 'transitionend', complete);
emulateTransitionEnd(this._element, transitionDuration); emulateTransitionEnd(this._element, transitionDuration);
}; }
_proto.setTransitioning = function setTransitioning(isTransitioning) { setTransitioning(isTransitioning) {
this._isTransitioning = isTransitioning; this._isTransitioning = isTransitioning;
}; }
_proto.dispose = function dispose() {
_BaseComponent.prototype.dispose.call(this);
dispose() {
super.dispose();
this._config = null; this._config = null;
this._parent = null; this._parent = null;
this._triggerArray = null; this._triggerArray = null;
this._isTransitioning = null; this._isTransitioning = null;
}; // Private } // Private
_proto._getConfig = function _getConfig(config) { _getConfig(config) {
config = _extends({}, Default, config); config = { ...Default, ...config };
config.toggle = Boolean(config.toggle); // Coerce string values config.toggle = Boolean(config.toggle); // Coerce string values
typeCheckConfig(NAME, config, DefaultType); typeCheckConfig(NAME, config, DefaultType);
return config; return config;
}; }
_proto._getDimension = function _getDimension() { _getDimension() {
return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT; return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT;
}; }
_proto._getParent = function _getParent() { _getParent() {
var _this4 = this; let { parent } = this._config;
var parent = this._config.parent;
if (isElement(parent)) { if (isElement(parent)) {
// it's a jQuery object // it's a jQuery object
@ -547,22 +471,22 @@
parent = SelectorEngine__default['default'].findOne(parent); parent = SelectorEngine__default['default'].findOne(parent);
} }
var selector = SELECTOR_DATA_TOGGLE + '[data-bs-parent="' + parent + '"]'; const selector = `${SELECTOR_DATA_TOGGLE}[data-bs-parent="${parent}"]`;
SelectorEngine__default['default'].find(selector, parent).forEach(function (element) { SelectorEngine__default['default'].find(selector, parent).forEach((element) => {
var selected = getElementFromSelector(element); const selected = getElementFromSelector(element);
_this4._addAriaAndCollapsedClass(selected, [element]); this._addAriaAndCollapsedClass(selected, [element]);
}); });
return parent; return parent;
}; }
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { _addAriaAndCollapsedClass(element, triggerArray) {
if (!element || !triggerArray.length) { if (!element || !triggerArray.length) {
return; return;
} }
var isOpen = element.classList.contains(CLASS_NAME_SHOW); const isOpen = element.classList.contains(CLASS_NAME_SHOW);
triggerArray.forEach(function (elem) { triggerArray.forEach((elem) => {
if (isOpen) { if (isOpen) {
elem.classList.remove(CLASS_NAME_COLLAPSED); elem.classList.remove(CLASS_NAME_COLLAPSED);
} else { } else {
@ -571,17 +495,15 @@
elem.setAttribute('aria-expanded', isOpen); elem.setAttribute('aria-expanded', isOpen);
}); });
}; // Static } // Static
Collapse.collapseInterface = function collapseInterface(element, config) { static collapseInterface(element, config) {
var data = Data__default['default'].getData(element, DATA_KEY); let data = Data__default['default'].get(element, DATA_KEY);
const _config = {
var _config = _extends( ...Default,
{}, ...Manipulator__default['default'].getDataAttributes(element),
Default, ...(typeof config === 'object' && config ? config : {}),
Manipulator__default['default'].getDataAttributes(element), };
typeof config === 'object' && config ? config : {}
);
if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
_config.toggle = false; _config.toggle = false;
@ -593,36 +515,19 @@
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]();
} }
}; }
Collapse.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
Collapse.collapseInterface(this, config); Collapse.collapseInterface(this, config);
}); });
}; }
}
_createClass(Collapse, null, [
{
key: 'Default',
get: function get() {
return Default;
},
},
{
key: 'DATA_KEY',
get: function get() {
return DATA_KEY;
},
},
]);
return Collapse;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Data Api implementation * Data Api implementation
@ -642,12 +547,12 @@
event.preventDefault(); event.preventDefault();
} }
var triggerData = Manipulator__default['default'].getDataAttributes(this); const triggerData = Manipulator__default['default'].getDataAttributes(this);
var selector = getSelectorFromElement(this); const selector = getSelectorFromElement(this);
var selectorElements = SelectorEngine__default['default'].find(selector); const selectorElements = SelectorEngine__default['default'].find(selector);
selectorElements.forEach(function (element) { selectorElements.forEach((element) => {
var data = Data__default['default'].getData(element, DATA_KEY); const data = Data__default['default'].get(element, DATA_KEY);
var config; let config;
if (data) { if (data) {
// update parent attribute // update parent attribute

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap data.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap data.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -15,7 +15,7 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/data.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -25,61 +25,51 @@
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var mapData = (function () { const elementMap = new Map();
var storeData = {}; var data = {
var id = 1; set(element, key, instance) {
return { if (!elementMap.has(element)) {
set: function set(element, key, data) { elementMap.set(element, new Map());
if (typeof element.bsKey === 'undefined') {
element.bsKey = {
key: key,
id: id,
};
id++;
} }
storeData[element.bsKey.id] = data; const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
}, // can be removed later when multiple key/instances are fine to be used
get: function get(element, key) {
if (!element || typeof element.bsKey === 'undefined') {
return null;
}
var keyProperties = element.bsKey; if (!instanceMap.has(key) && instanceMap.size !== 0) {
// eslint-disable-next-line no-console
if (keyProperties.key === key) { console.error(
return storeData[keyProperties.id]; `Bootstrap doesn't allow more than one instance per element. Bound instance: ${
} Array.from(instanceMap.keys())[0]
}.`
return null; );
},
delete: function _delete(element, key) {
if (typeof element.bsKey === 'undefined') {
return; return;
} }
var keyProperties = element.bsKey; instanceMap.set(key, instance);
},
if (keyProperties.key === key) { get(element, key) {
delete storeData[keyProperties.id]; if (elementMap.has(element)) {
delete element.bsKey; return elementMap.get(element).get(key) || null;
}
return null;
},
remove(element, key) {
if (!elementMap.has(element)) {
return;
}
const instanceMap = elementMap.get(element);
instanceMap.delete(key); // free up element references if there are no instances left for an element
if (instanceMap.size === 0) {
elementMap.delete(element);
} }
}, },
}; };
})();
var Data = { return data;
setData: function setData(instance, key, data) {
mapData.set(instance, key, data);
},
getData: function getData(instance, key) {
return mapData.get(instance, key);
},
removeData: function removeData(instance, key) {
mapData.delete(instance, key);
},
};
return Data;
}); });
//# sourceMappingURL=data.js.map //# sourceMappingURL=data.js.map

View File

@ -1 +1 @@
{"version":3,"file":"data.js","sources":["../../src/dom/data.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst mapData = (() => {\n const storeData = {}\n let id = 1\n return {\n set(element, key, data) {\n if (typeof element.bsKey === 'undefined') {\n element.bsKey = {\n key,\n id\n }\n id++\n }\n\n storeData[element.bsKey.id] = data\n },\n get(element, key) {\n if (!element || typeof element.bsKey === 'undefined') {\n return null\n }\n\n const keyProperties = element.bsKey\n if (keyProperties.key === key) {\n return storeData[keyProperties.id]\n }\n\n return null\n },\n delete(element, key) {\n if (typeof element.bsKey === 'undefined') {\n return\n }\n\n const keyProperties = element.bsKey\n if (keyProperties.key === key) {\n delete storeData[keyProperties.id]\n delete element.bsKey\n }\n }\n }\n})()\n\nconst Data = {\n setData(instance, key, data) {\n mapData.set(instance, key, data)\n },\n getData(instance, key) {\n return mapData.get(instance, key)\n },\n removeData(instance, key) {\n mapData.delete(instance, key)\n }\n}\n\nexport default Data\n"],"names":["mapData","storeData","id","set","element","key","data","bsKey","get","keyProperties","delete","Data","setData","instance","getData","removeData"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EAEA,IAAMA,OAAO,GAAI,YAAM;EACrB,MAAMC,SAAS,GAAG,EAAlB;EACA,MAAIC,EAAE,GAAG,CAAT;EACA,SAAO;EACLC,IAAAA,GADK,eACDC,OADC,EACQC,GADR,EACaC,IADb,EACmB;EACtB,UAAI,OAAOF,OAAO,CAACG,KAAf,KAAyB,WAA7B,EAA0C;EACxCH,QAAAA,OAAO,CAACG,KAAR,GAAgB;EACdF,UAAAA,GAAG,EAAHA,GADc;EAEdH,UAAAA,EAAE,EAAFA;EAFc,SAAhB;EAIAA,QAAAA,EAAE;EACH;;EAEDD,MAAAA,SAAS,CAACG,OAAO,CAACG,KAAR,CAAcL,EAAf,CAAT,GAA8BI,IAA9B;EACD,KAXI;EAYLE,IAAAA,GAZK,eAYDJ,OAZC,EAYQC,GAZR,EAYa;EAChB,UAAI,CAACD,OAAD,IAAY,OAAOA,OAAO,CAACG,KAAf,KAAyB,WAAzC,EAAsD;EACpD,eAAO,IAAP;EACD;;EAED,UAAME,aAAa,GAAGL,OAAO,CAACG,KAA9B;;EACA,UAAIE,aAAa,CAACJ,GAAd,KAAsBA,GAA1B,EAA+B;EAC7B,eAAOJ,SAAS,CAACQ,aAAa,CAACP,EAAf,CAAhB;EACD;;EAED,aAAO,IAAP;EACD,KAvBI;EAwBLQ,IAAAA,MAxBK,mBAwBEN,OAxBF,EAwBWC,GAxBX,EAwBgB;EACnB,UAAI,OAAOD,OAAO,CAACG,KAAf,KAAyB,WAA7B,EAA0C;EACxC;EACD;;EAED,UAAME,aAAa,GAAGL,OAAO,CAACG,KAA9B;;EACA,UAAIE,aAAa,CAACJ,GAAd,KAAsBA,GAA1B,EAA+B;EAC7B,eAAOJ,SAAS,CAACQ,aAAa,CAACP,EAAf,CAAhB;EACA,eAAOE,OAAO,CAACG,KAAf;EACD;EACF;EAlCI,GAAP;EAoCD,CAvCe,EAAhB;;MAyCMI,IAAI,GAAG;EACXC,EAAAA,OADW,mBACHC,QADG,EACOR,GADP,EACYC,IADZ,EACkB;EAC3BN,IAAAA,OAAO,CAACG,GAAR,CAAYU,QAAZ,EAAsBR,GAAtB,EAA2BC,IAA3B;EACD,GAHU;EAIXQ,EAAAA,OAJW,mBAIHD,QAJG,EAIOR,GAJP,EAIY;EACrB,WAAOL,OAAO,CAACQ,GAAR,CAAYK,QAAZ,EAAsBR,GAAtB,CAAP;EACD,GANU;EAOXU,EAAAA,UAPW,sBAOAF,QAPA,EAOUR,GAPV,EAOe;EACxBL,IAAAA,OAAO,CAACU,MAAR,CAAeG,QAAf,EAAyBR,GAAzB;EACD;EATU;;;;;;;;"} {"version":3,"file":"data.js","sources":["../../src/dom/data.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\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;EACA;EACA;EAEA,MAAMA,UAAU,GAAG,IAAIC,GAAJ,EAAnB;AAEA,aAAe;EACbC,EAAAA,GAAG,CAACC,OAAD,EAAUC,GAAV,EAAeC,QAAf,EAAyB;EAC1B,QAAI,CAACL,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAL,EAA8B;EAC5BH,MAAAA,UAAU,CAACE,GAAX,CAAeC,OAAf,EAAwB,IAAIF,GAAJ,EAAxB;EACD;;EAED,UAAMM,WAAW,GAAGP,UAAU,CAACQ,GAAX,CAAeL,OAAf,CAApB,CAL0B;EAQ1B;;EACA,QAAI,CAACI,WAAW,CAACD,GAAZ,CAAgBF,GAAhB,CAAD,IAAyBG,WAAW,CAACE,IAAZ,KAAqB,CAAlD,EAAqD;EACnD;EACAC,MAAAA,OAAO,CAACC,KAAR,CAAe,+EAA8EC,KAAK,CAACC,IAAN,CAAWN,WAAW,CAACO,IAAZ,EAAX,EAA+B,CAA/B,CAAkC,GAA/H;EACA;EACD;;EAEDP,IAAAA,WAAW,CAACL,GAAZ,CAAgBE,GAAhB,EAAqBC,QAArB;EACD,GAjBY;;EAmBbG,EAAAA,GAAG,CAACL,OAAD,EAAUC,GAAV,EAAe;EAChB,QAAIJ,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAJ,EAA6B;EAC3B,aAAOH,UAAU,CAACQ,GAAX,CAAeL,OAAf,EAAwBK,GAAxB,CAA4BJ,GAA5B,KAAoC,IAA3C;EACD;;EAED,WAAO,IAAP;EACD,GAzBY;;EA2BbW,EAAAA,MAAM,CAACZ,OAAD,EAAUC,GAAV,EAAe;EACnB,QAAI,CAACJ,UAAU,CAACM,GAAX,CAAeH,OAAf,CAAL,EAA8B;EAC5B;EACD;;EAED,UAAMI,WAAW,GAAGP,UAAU,CAACQ,GAAX,CAAeL,OAAf,CAApB;EAEAI,IAAAA,WAAW,CAACS,MAAZ,CAAmBZ,GAAnB,EAPmB;;EAUnB,QAAIG,WAAW,CAACE,IAAZ,KAAqB,CAAzB,EAA4B;EAC1BT,MAAAA,UAAU,CAACgB,MAAX,CAAkBb,OAAlB;EACD;EACF;;EAxCY,CAAf;;;;;;;;"}

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap event-handler.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap event-handler.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -15,14 +15,13 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -31,11 +30,9 @@
return null; return null;
}; };
document.documentElement.dir === 'rtl';
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/event-handler.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -45,17 +42,17 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var namespaceRegex = /[^.]*(?=\..*)\.|.*/; const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
var stripNameRegex = /\..*/; const stripNameRegex = /\..*/;
var stripUidRegex = /::\d+$/; const stripUidRegex = /::\d+$/;
var eventRegistry = {}; // Events storage const eventRegistry = {}; // Events storage
var uidEvent = 1; let uidEvent = 1;
var customEvents = { const customEvents = {
mouseenter: 'mouseover', mouseenter: 'mouseover',
mouseleave: 'mouseout', mouseleave: 'mouseout',
}; };
var nativeEvents = new Set([ const nativeEvents = new Set([
'click', 'click',
'dblclick', 'dblclick',
'mouseup', 'mouseup',
@ -110,11 +107,11 @@
*/ */
function getUidEvent(element, uid) { function getUidEvent(element, uid) {
return (uid && uid + '::' + uidEvent++) || element.uidEvent || uidEvent++; return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++;
} }
function getEvent(element) { function getEvent(element) {
var uid = getUidEvent(element); const uid = getUidEvent(element);
element.uidEvent = uid; element.uidEvent = uid;
eventRegistry[uid] = eventRegistry[uid] || {}; eventRegistry[uid] = eventRegistry[uid] || {};
return eventRegistry[uid]; return eventRegistry[uid];
@ -134,10 +131,10 @@
function bootstrapDelegationHandler(element, selector, fn) { function bootstrapDelegationHandler(element, selector, fn) {
return function handler(event) { return function handler(event) {
var domElements = element.querySelectorAll(selector); const domElements = element.querySelectorAll(selector);
for (var target = event.target; target && target !== this; target = target.parentNode) { for (let { target } = event; target && target !== this; target = target.parentNode) {
for (var i = domElements.length; i--; ) { for (let i = domElements.length; i--; ) {
if (domElements[i] === target) { if (domElements[i] === target) {
event.delegateTarget = target; event.delegateTarget = target;
@ -155,15 +152,11 @@
}; };
} }
function findHandler(events, handler, delegationSelector) { function findHandler(events, handler, delegationSelector = null) {
if (delegationSelector === void 0) { const uidEventList = Object.keys(events);
delegationSelector = null;
}
var uidEventList = Object.keys(events); for (let i = 0, len = uidEventList.length; i < len; i++) {
const event = events[uidEventList[i]];
for (var i = 0, len = uidEventList.length; i < len; i++) {
var event = events[uidEventList[i]];
if (event.originalHandler === handler && event.delegationSelector === delegationSelector) { if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
return event; return event;
@ -174,17 +167,17 @@
} }
function normalizeParams(originalTypeEvent, handler, delegationFn) { function normalizeParams(originalTypeEvent, handler, delegationFn) {
var delegation = typeof handler === 'string'; const delegation = typeof handler === 'string';
var originalHandler = delegation ? delegationFn : handler; // allow to get the native events from namespaced events ('click.bs.button' --> 'click') const originalHandler = delegation ? delegationFn : handler; // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
var typeEvent = originalTypeEvent.replace(stripNameRegex, ''); let typeEvent = originalTypeEvent.replace(stripNameRegex, '');
var custom = customEvents[typeEvent]; const custom = customEvents[typeEvent];
if (custom) { if (custom) {
typeEvent = custom; typeEvent = custom;
} }
var isNative = nativeEvents.has(typeEvent); const isNative = nativeEvents.has(typeEvent);
if (!isNative) { if (!isNative) {
typeEvent = originalTypeEvent; typeEvent = originalTypeEvent;
@ -203,22 +196,22 @@
delegationFn = null; delegationFn = null;
} }
var _normalizeParams = normalizeParams(originalTypeEvent, handler, delegationFn), const [delegation, originalHandler, typeEvent] = normalizeParams(
delegation = _normalizeParams[0], originalTypeEvent,
originalHandler = _normalizeParams[1], handler,
typeEvent = _normalizeParams[2]; delegationFn
);
var events = getEvent(element); const events = getEvent(element);
var handlers = events[typeEvent] || (events[typeEvent] = {}); const handlers = events[typeEvent] || (events[typeEvent] = {});
var previousFn = findHandler(handlers, originalHandler, delegation ? handler : null); const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);
if (previousFn) { if (previousFn) {
previousFn.oneOff = previousFn.oneOff && oneOff; previousFn.oneOff = previousFn.oneOff && oneOff;
return; return;
} }
var uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')); const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));
var fn = delegation const fn = delegation
? bootstrapDelegationHandler(element, handler, delegationFn) ? bootstrapDelegationHandler(element, handler, delegationFn)
: bootstrapHandler(element, handler); : bootstrapHandler(element, handler);
fn.delegationSelector = delegation ? handler : null; fn.delegationSelector = delegation ? handler : null;
@ -230,7 +223,7 @@
} }
function removeHandler(element, events, typeEvent, handler, delegationSelector) { function removeHandler(element, events, typeEvent, handler, delegationSelector) {
var fn = findHandler(events[typeEvent], handler, delegationSelector); const fn = findHandler(events[typeEvent], handler, delegationSelector);
if (!fn) { if (!fn) {
return; return;
@ -241,35 +234,37 @@
} }
function removeNamespacedHandlers(element, events, typeEvent, namespace) { function removeNamespacedHandlers(element, events, typeEvent, namespace) {
var storeElementEvent = events[typeEvent] || {}; const storeElementEvent = events[typeEvent] || {};
Object.keys(storeElementEvent).forEach(function (handlerKey) { Object.keys(storeElementEvent).forEach((handlerKey) => {
if (handlerKey.includes(namespace)) { if (handlerKey.includes(namespace)) {
var event = storeElementEvent[handlerKey]; const event = storeElementEvent[handlerKey];
removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
} }
}); });
} }
var EventHandler = { const EventHandler = {
on: function on(element, event, handler, delegationFn) { on(element, event, handler, delegationFn) {
addHandler(element, event, handler, delegationFn, false); addHandler(element, event, handler, delegationFn, false);
}, },
one: function one(element, event, handler, delegationFn) {
one(element, event, handler, delegationFn) {
addHandler(element, event, handler, delegationFn, true); addHandler(element, event, handler, delegationFn, true);
}, },
off: function off(element, originalTypeEvent, handler, delegationFn) {
off(element, originalTypeEvent, handler, delegationFn) {
if (typeof originalTypeEvent !== 'string' || !element) { if (typeof originalTypeEvent !== 'string' || !element) {
return; return;
} }
var _normalizeParams2 = normalizeParams(originalTypeEvent, handler, delegationFn), const [delegation, originalHandler, typeEvent] = normalizeParams(
delegation = _normalizeParams2[0], originalTypeEvent,
originalHandler = _normalizeParams2[1], handler,
typeEvent = _normalizeParams2[2]; delegationFn
);
var inNamespace = typeEvent !== originalTypeEvent; const inNamespace = typeEvent !== originalTypeEvent;
var events = getEvent(element); const events = getEvent(element);
var isNamespace = originalTypeEvent.startsWith('.'); const isNamespace = originalTypeEvent.startsWith('.');
if (typeof originalHandler !== 'undefined') { if (typeof originalHandler !== 'undefined') {
// Simplest case: handler is passed, remove that listener ONLY. // Simplest case: handler is passed, remove that listener ONLY.
@ -282,17 +277,17 @@
} }
if (isNamespace) { if (isNamespace) {
Object.keys(events).forEach(function (elementEvent) { Object.keys(events).forEach((elementEvent) => {
removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
}); });
} }
var storeElementEvent = events[typeEvent] || {}; const storeElementEvent = events[typeEvent] || {};
Object.keys(storeElementEvent).forEach(function (keyHandlers) { Object.keys(storeElementEvent).forEach((keyHandlers) => {
var handlerKey = keyHandlers.replace(stripUidRegex, ''); const handlerKey = keyHandlers.replace(stripUidRegex, '');
if (!inNamespace || originalTypeEvent.includes(handlerKey)) { if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
var event = storeElementEvent[keyHandlers]; const event = storeElementEvent[keyHandlers];
removeHandler( removeHandler(
element, element,
events, events,
@ -303,20 +298,21 @@
} }
}); });
}, },
trigger: function trigger(element, event, args) {
trigger(element, event, args) {
if (typeof event !== 'string' || !element) { if (typeof event !== 'string' || !element) {
return null; return null;
} }
var $ = getjQuery(); const $ = getjQuery();
var typeEvent = event.replace(stripNameRegex, ''); const typeEvent = event.replace(stripNameRegex, '');
var inNamespace = event !== typeEvent; const inNamespace = event !== typeEvent;
var isNative = nativeEvents.has(typeEvent); const isNative = nativeEvents.has(typeEvent);
var jQueryEvent; let jQueryEvent;
var bubbles = true; let bubbles = true;
var nativeDispatch = true; let nativeDispatch = true;
var defaultPrevented = false; let defaultPrevented = false;
var evt = null; let evt = null;
if (inNamespace && $) { if (inNamespace && $) {
jQueryEvent = $.Event(event, args); jQueryEvent = $.Event(event, args);
@ -331,15 +327,15 @@
evt.initEvent(typeEvent, bubbles, true); evt.initEvent(typeEvent, bubbles, true);
} else { } else {
evt = new CustomEvent(event, { evt = new CustomEvent(event, {
bubbles: bubbles, bubbles,
cancelable: true, cancelable: true,
}); });
} // merge custom information in our event } // merge custom information in our event
if (typeof args !== 'undefined') { if (typeof args !== 'undefined') {
Object.keys(args).forEach(function (key) { Object.keys(args).forEach((key) => {
Object.defineProperty(evt, key, { Object.defineProperty(evt, key, {
get: function get() { get() {
return args[key]; return args[key];
}, },
}); });

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap manipulator.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap manipulator.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -15,7 +15,7 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/manipulator.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -40,46 +40,47 @@
} }
function normalizeDataKey(key) { function normalizeDataKey(key) {
return key.replace(/[A-Z]/g, function (chr) { return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
return '-' + chr.toLowerCase();
});
} }
var Manipulator = { const Manipulator = {
setDataAttribute: function setDataAttribute(element, key, value) { setDataAttribute(element, key, value) {
element.setAttribute('data-bs-' + normalizeDataKey(key), value); element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
}, },
removeDataAttribute: function removeDataAttribute(element, key) {
element.removeAttribute('data-bs-' + normalizeDataKey(key)); removeDataAttribute(element, key) {
element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
}, },
getDataAttributes: function getDataAttributes(element) {
getDataAttributes(element) {
if (!element) { if (!element) {
return {}; return {};
} }
var attributes = {}; const attributes = {};
Object.keys(element.dataset) Object.keys(element.dataset)
.filter(function (key) { .filter((key) => key.startsWith('bs'))
return key.startsWith('bs'); .forEach((key) => {
}) let pureKey = key.replace(/^bs/, '');
.forEach(function (key) {
var 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: function getDataAttribute(element, key) {
return normalizeData(element.getAttribute('data-bs-' + normalizeDataKey(key))); getDataAttribute(element, key) {
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
}, },
offset: function offset(element) {
var rect = element.getBoundingClientRect(); offset(element) {
const rect = element.getBoundingClientRect();
return { return {
top: rect.top + document.body.scrollTop, top: rect.top + document.body.scrollTop,
left: rect.left + document.body.scrollLeft, left: rect.left + document.body.scrollLeft,
}; };
}, },
position: function position(element) {
position(element) {
return { return {
top: element.offsetTop, top: element.offsetTop,
left: element.offsetLeft, left: element.offsetLeft,

View File

@ -1 +1 @@
{"version":3,"file":"manipulator.js","sources":["../../src/dom/manipulator.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\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\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\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 offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + document.body.scrollTop,\n left: rect.left + document.body.scrollLeft\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n"],"names":["normalizeData","val","Number","toString","normalizeDataKey","key","replace","chr","toLowerCase","Manipulator","setDataAttribute","element","value","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","Object","keys","dataset","filter","startsWith","forEach","pureKey","charAt","slice","length","getDataAttribute","getAttribute","offset","rect","getBoundingClientRect","top","document","body","scrollTop","left","scrollLeft","position","offsetTop","offsetLeft"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAEA,SAASA,aAAT,CAAuBC,GAAvB,EAA4B;EAC1B,MAAIA,GAAG,KAAK,MAAZ,EAAoB;EAClB,WAAO,IAAP;EACD;;EAED,MAAIA,GAAG,KAAK,OAAZ,EAAqB;EACnB,WAAO,KAAP;EACD;;EAED,MAAIA,GAAG,KAAKC,MAAM,CAACD,GAAD,CAAN,CAAYE,QAAZ,EAAZ,EAAoC;EAClC,WAAOD,MAAM,CAACD,GAAD,CAAb;EACD;;EAED,MAAIA,GAAG,KAAK,EAAR,IAAcA,GAAG,KAAK,MAA1B,EAAkC;EAChC,WAAO,IAAP;EACD;;EAED,SAAOA,GAAP;EACD;;EAED,SAASG,gBAAT,CAA0BC,GAA1B,EAA+B;EAC7B,SAAOA,GAAG,CAACC,OAAJ,CAAY,QAAZ,EAAsB,UAAAC,GAAG;EAAA,iBAAQA,GAAG,CAACC,WAAJ,EAAR;EAAA,GAAzB,CAAP;EACD;;MAEKC,WAAW,GAAG;EAClBC,EAAAA,gBADkB,4BACDC,OADC,EACQN,GADR,EACaO,KADb,EACoB;EACpCD,IAAAA,OAAO,CAACE,YAAR,cAAgCT,gBAAgB,CAACC,GAAD,CAAhD,EAAyDO,KAAzD;EACD,GAHiB;EAKlBE,EAAAA,mBALkB,+BAKEH,OALF,EAKWN,GALX,EAKgB;EAChCM,IAAAA,OAAO,CAACI,eAAR,cAAmCX,gBAAgB,CAACC,GAAD,CAAnD;EACD,GAPiB;EASlBW,EAAAA,iBATkB,6BASAL,OATA,EASS;EACzB,QAAI,CAACA,OAAL,EAAc;EACZ,aAAO,EAAP;EACD;;EAED,QAAMM,UAAU,GAAG,EAAnB;EAEAC,IAAAA,MAAM,CAACC,IAAP,CAAYR,OAAO,CAACS,OAApB,EACGC,MADH,CACU,UAAAhB,GAAG;EAAA,aAAIA,GAAG,CAACiB,UAAJ,CAAe,IAAf,CAAJ;EAAA,KADb,EAEGC,OAFH,CAEW,UAAAlB,GAAG,EAAI;EACd,UAAImB,OAAO,GAAGnB,GAAG,CAACC,OAAJ,CAAY,KAAZ,EAAmB,EAAnB,CAAd;EACAkB,MAAAA,OAAO,GAAGA,OAAO,CAACC,MAAR,CAAe,CAAf,EAAkBjB,WAAlB,KAAkCgB,OAAO,CAACE,KAAR,CAAc,CAAd,EAAiBF,OAAO,CAACG,MAAzB,CAA5C;EACAV,MAAAA,UAAU,CAACO,OAAD,CAAV,GAAsBxB,aAAa,CAACW,OAAO,CAACS,OAAR,CAAgBf,GAAhB,CAAD,CAAnC;EACD,KANH;EAQA,WAAOY,UAAP;EACD,GAzBiB;EA2BlBW,EAAAA,gBA3BkB,4BA2BDjB,OA3BC,EA2BQN,GA3BR,EA2Ba;EAC7B,WAAOL,aAAa,CAACW,OAAO,CAACkB,YAAR,cAAgCzB,gBAAgB,CAACC,GAAD,CAAhD,CAAD,CAApB;EACD,GA7BiB;EA+BlByB,EAAAA,MA/BkB,kBA+BXnB,OA/BW,EA+BF;EACd,QAAMoB,IAAI,GAAGpB,OAAO,CAACqB,qBAAR,EAAb;EAEA,WAAO;EACLC,MAAAA,GAAG,EAAEF,IAAI,CAACE,GAAL,GAAWC,QAAQ,CAACC,IAAT,CAAcC,SADzB;EAELC,MAAAA,IAAI,EAAEN,IAAI,CAACM,IAAL,GAAYH,QAAQ,CAACC,IAAT,CAAcG;EAF3B,KAAP;EAID,GAtCiB;EAwClBC,EAAAA,QAxCkB,oBAwCT5B,OAxCS,EAwCA;EAChB,WAAO;EACLsB,MAAAA,GAAG,EAAEtB,OAAO,CAAC6B,SADR;EAELH,MAAAA,IAAI,EAAE1B,OAAO,CAAC8B;EAFT,KAAP;EAID;EA7CiB;;;;;;;;"} {"version":3,"file":"manipulator.js","sources":["../../src/dom/manipulator.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(val) {\n if (val === 'true') {\n return true\n }\n\n if (val === 'false') {\n return false\n }\n\n if (val === Number(val).toString()) {\n return Number(val)\n }\n\n if (val === '' || val === 'null') {\n return null\n }\n\n return val\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\n Object.keys(element.dataset)\n .filter(key => key.startsWith('bs'))\n .forEach(key => {\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 offset(element) {\n const rect = element.getBoundingClientRect()\n\n return {\n top: rect.top + document.body.scrollTop,\n left: rect.left + document.body.scrollLeft\n }\n },\n\n position(element) {\n return {\n top: element.offsetTop,\n left: element.offsetLeft\n }\n }\n}\n\nexport default Manipulator\n"],"names":["normalizeData","val","Number","toString","normalizeDataKey","key","replace","chr","toLowerCase","Manipulator","setDataAttribute","element","value","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","Object","keys","dataset","filter","startsWith","forEach","pureKey","charAt","slice","length","getDataAttribute","getAttribute","offset","rect","getBoundingClientRect","top","document","body","scrollTop","left","scrollLeft","position","offsetTop","offsetLeft"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;EAEA,SAASA,aAAT,CAAuBC,GAAvB,EAA4B;EAC1B,MAAIA,GAAG,KAAK,MAAZ,EAAoB;EAClB,WAAO,IAAP;EACD;;EAED,MAAIA,GAAG,KAAK,OAAZ,EAAqB;EACnB,WAAO,KAAP;EACD;;EAED,MAAIA,GAAG,KAAKC,MAAM,CAACD,GAAD,CAAN,CAAYE,QAAZ,EAAZ,EAAoC;EAClC,WAAOD,MAAM,CAACD,GAAD,CAAb;EACD;;EAED,MAAIA,GAAG,KAAK,EAAR,IAAcA,GAAG,KAAK,MAA1B,EAAkC;EAChC,WAAO,IAAP;EACD;;EAED,SAAOA,GAAP;EACD;;EAED,SAASG,gBAAT,CAA0BC,GAA1B,EAA+B;EAC7B,SAAOA,GAAG,CAACC,OAAJ,CAAY,QAAZ,EAAsBC,GAAG,IAAK,IAAGA,GAAG,CAACC,WAAJ,EAAkB,EAAnD,CAAP;EACD;;QAEKC,WAAW,GAAG;EAClBC,EAAAA,gBAAgB,CAACC,OAAD,EAAUN,GAAV,EAAeO,KAAf,EAAsB;EACpCD,IAAAA,OAAO,CAACE,YAAR,CAAsB,WAAUT,gBAAgB,CAACC,GAAD,CAAM,EAAtD,EAAyDO,KAAzD;EACD,GAHiB;;EAKlBE,EAAAA,mBAAmB,CAACH,OAAD,EAAUN,GAAV,EAAe;EAChCM,IAAAA,OAAO,CAACI,eAAR,CAAyB,WAAUX,gBAAgB,CAACC,GAAD,CAAM,EAAzD;EACD,GAPiB;;EASlBW,EAAAA,iBAAiB,CAACL,OAAD,EAAU;EACzB,QAAI,CAACA,OAAL,EAAc;EACZ,aAAO,EAAP;EACD;;EAED,UAAMM,UAAU,GAAG,EAAnB;EAEAC,IAAAA,MAAM,CAACC,IAAP,CAAYR,OAAO,CAACS,OAApB,EACGC,MADH,CACUhB,GAAG,IAAIA,GAAG,CAACiB,UAAJ,CAAe,IAAf,CADjB,EAEGC,OAFH,CAEWlB,GAAG,IAAI;EACd,UAAImB,OAAO,GAAGnB,GAAG,CAACC,OAAJ,CAAY,KAAZ,EAAmB,EAAnB,CAAd;EACAkB,MAAAA,OAAO,GAAGA,OAAO,CAACC,MAAR,CAAe,CAAf,EAAkBjB,WAAlB,KAAkCgB,OAAO,CAACE,KAAR,CAAc,CAAd,EAAiBF,OAAO,CAACG,MAAzB,CAA5C;EACAV,MAAAA,UAAU,CAACO,OAAD,CAAV,GAAsBxB,aAAa,CAACW,OAAO,CAACS,OAAR,CAAgBf,GAAhB,CAAD,CAAnC;EACD,KANH;EAQA,WAAOY,UAAP;EACD,GAzBiB;;EA2BlBW,EAAAA,gBAAgB,CAACjB,OAAD,EAAUN,GAAV,EAAe;EAC7B,WAAOL,aAAa,CAACW,OAAO,CAACkB,YAAR,CAAsB,WAAUzB,gBAAgB,CAACC,GAAD,CAAM,EAAtD,CAAD,CAApB;EACD,GA7BiB;;EA+BlByB,EAAAA,MAAM,CAACnB,OAAD,EAAU;EACd,UAAMoB,IAAI,GAAGpB,OAAO,CAACqB,qBAAR,EAAb;EAEA,WAAO;EACLC,MAAAA,GAAG,EAAEF,IAAI,CAACE,GAAL,GAAWC,QAAQ,CAACC,IAAT,CAAcC,SADzB;EAELC,MAAAA,IAAI,EAAEN,IAAI,CAACM,IAAL,GAAYH,QAAQ,CAACC,IAAT,CAAcG;EAF3B,KAAP;EAID,GAtCiB;;EAwClBC,EAAAA,QAAQ,CAAC5B,OAAD,EAAU;EAChB,WAAO;EACLsB,MAAAA,GAAG,EAAEtB,OAAO,CAAC6B,SADR;EAELH,MAAAA,IAAI,EAAE1B,OAAO,CAAC8B;EAFT,KAAP;EAID;;EA7CiB;;;;;;;;"}

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap selector-engine.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap selector-engine.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -15,7 +15,7 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/selector-engine.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -25,37 +25,23 @@
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NODE_TEXT = 3; const NODE_TEXT = 3;
var SelectorEngine = { const SelectorEngine = {
find: function find(selector, element) { find(selector, element = document.documentElement) {
var _ref; return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
if (element === void 0) {
element = document.documentElement;
}
return (_ref = []).concat.apply(
_ref,
Element.prototype.querySelectorAll.call(element, selector)
);
}, },
findOne: function findOne(selector, element) {
if (element === void 0) {
element = document.documentElement;
}
findOne(selector, element = document.documentElement) {
return Element.prototype.querySelector.call(element, selector); return Element.prototype.querySelector.call(element, selector);
}, },
children: function children(element, selector) {
var _ref2;
return (_ref2 = []).concat.apply(_ref2, element.children).filter(function (child) { children(element, selector) {
return child.matches(selector); return [].concat(...element.children).filter((child) => child.matches(selector));
});
}, },
parents: function parents(element, selector) {
var parents = []; parents(element, selector) {
var ancestor = element.parentNode; const parents = [];
let ancestor = element.parentNode;
while ( while (
ancestor && ancestor &&
@ -71,8 +57,9 @@
return parents; return parents;
}, },
prev: function prev(element, selector) {
var previous = element.previousElementSibling; prev(element, selector) {
let previous = element.previousElementSibling;
while (previous) { while (previous) {
if (previous.matches(selector)) { if (previous.matches(selector)) {
@ -84,8 +71,9 @@
return []; return [];
}, },
next: function next(element, selector) {
var next = element.nextElementSibling; next(element, selector) {
let next = element.nextElementSibling;
while (next) { while (next) {
if (next.matches(selector)) { if (next.matches(selector)) {

View File

@ -1 +1 @@
{"version":3,"file":"selector-engine.js","sources":["../../src/dom/selector-engine.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta2): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n }\n}\n\nexport default SelectorEngine\n"],"names":["NODE_TEXT","SelectorEngine","find","selector","element","document","documentElement","concat","Element","prototype","querySelectorAll","call","findOne","querySelector","children","filter","child","matches","parents","ancestor","parentNode","nodeType","Node","ELEMENT_NODE","push","prev","previous","previousElementSibling","next","nextElementSibling"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EAEA,IAAMA,SAAS,GAAG,CAAlB;MAEMC,cAAc,GAAG;EACrBC,EAAAA,IADqB,gBAChBC,QADgB,EACNC,OADM,EAC8B;EAAA;;EAAA,QAApCA,OAAoC;EAApCA,MAAAA,OAAoC,GAA1BC,QAAQ,CAACC,eAAiB;EAAA;;EACjD,WAAO,YAAGC,MAAH,aAAaC,OAAO,CAACC,SAAR,CAAkBC,gBAAlB,CAAmCC,IAAnC,CAAwCP,OAAxC,EAAiDD,QAAjD,CAAb,CAAP;EACD,GAHoB;EAKrBS,EAAAA,OALqB,mBAKbT,QALa,EAKHC,OALG,EAKiC;EAAA,QAApCA,OAAoC;EAApCA,MAAAA,OAAoC,GAA1BC,QAAQ,CAACC,eAAiB;EAAA;;EACpD,WAAOE,OAAO,CAACC,SAAR,CAAkBI,aAAlB,CAAgCF,IAAhC,CAAqCP,OAArC,EAA8CD,QAA9C,CAAP;EACD,GAPoB;EASrBW,EAAAA,QATqB,oBASZV,OATY,EASHD,QATG,EASO;EAAA;;EAC1B,WAAO,aAAGI,MAAH,cAAaH,OAAO,CAACU,QAArB,EACJC,MADI,CACG,UAAAC,KAAK;EAAA,aAAIA,KAAK,CAACC,OAAN,CAAcd,QAAd,CAAJ;EAAA,KADR,CAAP;EAED,GAZoB;EAcrBe,EAAAA,OAdqB,mBAcbd,OAda,EAcJD,QAdI,EAcM;EACzB,QAAMe,OAAO,GAAG,EAAhB;EAEA,QAAIC,QAAQ,GAAGf,OAAO,CAACgB,UAAvB;;EAEA,WAAOD,QAAQ,IAAIA,QAAQ,CAACE,QAAT,KAAsBC,IAAI,CAACC,YAAvC,IAAuDJ,QAAQ,CAACE,QAAT,KAAsBrB,SAApF,EAA+F;EAC7F,UAAImB,QAAQ,CAACF,OAAT,CAAiBd,QAAjB,CAAJ,EAAgC;EAC9Be,QAAAA,OAAO,CAACM,IAAR,CAAaL,QAAb;EACD;;EAEDA,MAAAA,QAAQ,GAAGA,QAAQ,CAACC,UAApB;EACD;;EAED,WAAOF,OAAP;EACD,GA5BoB;EA8BrBO,EAAAA,IA9BqB,gBA8BhBrB,OA9BgB,EA8BPD,QA9BO,EA8BG;EACtB,QAAIuB,QAAQ,GAAGtB,OAAO,CAACuB,sBAAvB;;EAEA,WAAOD,QAAP,EAAiB;EACf,UAAIA,QAAQ,CAACT,OAAT,CAAiBd,QAAjB,CAAJ,EAAgC;EAC9B,eAAO,CAACuB,QAAD,CAAP;EACD;;EAEDA,MAAAA,QAAQ,GAAGA,QAAQ,CAACC,sBAApB;EACD;;EAED,WAAO,EAAP;EACD,GA1CoB;EA4CrBC,EAAAA,IA5CqB,gBA4ChBxB,OA5CgB,EA4CPD,QA5CO,EA4CG;EACtB,QAAIyB,IAAI,GAAGxB,OAAO,CAACyB,kBAAnB;;EAEA,WAAOD,IAAP,EAAa;EACX,UAAIA,IAAI,CAACX,OAAL,CAAad,QAAb,CAAJ,EAA4B;EAC1B,eAAO,CAACyB,IAAD,CAAP;EACD;;EAEDA,MAAAA,IAAI,GAAGA,IAAI,CAACC,kBAAZ;EACD;;EAED,WAAO,EAAP;EACD;EAxDoB;;;;;;;;"} {"version":3,"file":"selector-engine.js","sources":["../../src/dom/selector-engine.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.0.0-beta3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NODE_TEXT = 3\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children)\n .filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n\n let ancestor = element.parentNode\n\n while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n if (ancestor.matches(selector)) {\n parents.push(ancestor)\n }\n\n ancestor = ancestor.parentNode\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n }\n}\n\nexport default SelectorEngine\n"],"names":["NODE_TEXT","SelectorEngine","find","selector","element","document","documentElement","concat","Element","prototype","querySelectorAll","call","findOne","querySelector","children","filter","child","matches","parents","ancestor","parentNode","nodeType","Node","ELEMENT_NODE","push","prev","previous","previousElementSibling","next","nextElementSibling"],"mappings":";;;;;;;;;;;EAAA;EACA;EACA;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EAEA,MAAMA,SAAS,GAAG,CAAlB;QAEMC,cAAc,GAAG;EACrBC,EAAAA,IAAI,CAACC,QAAD,EAAWC,OAAO,GAAGC,QAAQ,CAACC,eAA9B,EAA+C;EACjD,WAAO,GAAGC,MAAH,CAAU,GAAGC,OAAO,CAACC,SAAR,CAAkBC,gBAAlB,CAAmCC,IAAnC,CAAwCP,OAAxC,EAAiDD,QAAjD,CAAb,CAAP;EACD,GAHoB;;EAKrBS,EAAAA,OAAO,CAACT,QAAD,EAAWC,OAAO,GAAGC,QAAQ,CAACC,eAA9B,EAA+C;EACpD,WAAOE,OAAO,CAACC,SAAR,CAAkBI,aAAlB,CAAgCF,IAAhC,CAAqCP,OAArC,EAA8CD,QAA9C,CAAP;EACD,GAPoB;;EASrBW,EAAAA,QAAQ,CAACV,OAAD,EAAUD,QAAV,EAAoB;EAC1B,WAAO,GAAGI,MAAH,CAAU,GAAGH,OAAO,CAACU,QAArB,EACJC,MADI,CACGC,KAAK,IAAIA,KAAK,CAACC,OAAN,CAAcd,QAAd,CADZ,CAAP;EAED,GAZoB;;EAcrBe,EAAAA,OAAO,CAACd,OAAD,EAAUD,QAAV,EAAoB;EACzB,UAAMe,OAAO,GAAG,EAAhB;EAEA,QAAIC,QAAQ,GAAGf,OAAO,CAACgB,UAAvB;;EAEA,WAAOD,QAAQ,IAAIA,QAAQ,CAACE,QAAT,KAAsBC,IAAI,CAACC,YAAvC,IAAuDJ,QAAQ,CAACE,QAAT,KAAsBrB,SAApF,EAA+F;EAC7F,UAAImB,QAAQ,CAACF,OAAT,CAAiBd,QAAjB,CAAJ,EAAgC;EAC9Be,QAAAA,OAAO,CAACM,IAAR,CAAaL,QAAb;EACD;;EAEDA,MAAAA,QAAQ,GAAGA,QAAQ,CAACC,UAApB;EACD;;EAED,WAAOF,OAAP;EACD,GA5BoB;;EA8BrBO,EAAAA,IAAI,CAACrB,OAAD,EAAUD,QAAV,EAAoB;EACtB,QAAIuB,QAAQ,GAAGtB,OAAO,CAACuB,sBAAvB;;EAEA,WAAOD,QAAP,EAAiB;EACf,UAAIA,QAAQ,CAACT,OAAT,CAAiBd,QAAjB,CAAJ,EAAgC;EAC9B,eAAO,CAACuB,QAAD,CAAP;EACD;;EAEDA,MAAAA,QAAQ,GAAGA,QAAQ,CAACC,sBAApB;EACD;;EAED,WAAO,EAAP;EACD,GA1CoB;;EA4CrBC,EAAAA,IAAI,CAACxB,OAAD,EAAUD,QAAV,EAAoB;EACtB,QAAIyB,IAAI,GAAGxB,OAAO,CAACyB,kBAAnB;;EAEA,WAAOD,IAAP,EAAa;EACX,UAAIA,IAAI,CAACX,OAAL,CAAad,QAAb,CAAJ,EAA4B;EAC1B,eAAO,CAACyB,IAAD,CAAP;EACD;;EAEDA,MAAAA,IAAI,GAAGA,IAAI,CAACC,kBAAZ;EACD;;EAED,WAAO,EAAP;EACD;;EAxDoB;;;;;;;;"}

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap dropdown.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap dropdown.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -71,70 +71,16 @@
var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine); var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_extends =
Object.assign ||
function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var toType = function toType(obj) { const toType = (obj) => {
if (obj === null || obj === undefined) { if (obj === null || obj === undefined) {
return '' + obj; return `${obj}`;
} }
return {}.toString return {}.toString
@ -143,11 +89,11 @@
.toLowerCase(); .toLowerCase();
}; };
var getSelector = function getSelector(element) { const getSelector = (element) => {
var selector = element.getAttribute('data-bs-target'); let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, let hrefAttr = 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, // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
// `document.querySelector` will rightfully complain it is invalid. // `document.querySelector` will rightfully complain it is invalid.
// See https://github.com/twbs/bootstrap/issues/32273 // See https://github.com/twbs/bootstrap/issues/32273
@ -166,40 +112,37 @@
return selector; return selector;
}; };
var getElementFromSelector = function getElementFromSelector(element) { const getElementFromSelector = (element) => {
var selector = getSelector(element); const selector = getSelector(element);
return selector ? document.querySelector(selector) : null; return selector ? document.querySelector(selector) : null;
}; };
var isElement = function isElement(obj) { const isElement = (obj) => (obj[0] || obj).nodeType;
return (obj[0] || obj).nodeType;
};
var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) { const typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach(function (property) { Object.keys(configTypes).forEach((property) => {
var expectedTypes = configTypes[property]; const expectedTypes = configTypes[property];
var value = config[property]; const value = config[property];
var valueType = value && isElement(value) ? 'element' : toType(value); const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError( throw new TypeError(
componentName.toUpperCase() + `${componentName.toUpperCase()}: ` +
': ' + `Option "${property}" provided type "${valueType}" ` +
('Option "' + property + '" provided type "' + valueType + '" ') + `but expected type "${expectedTypes}".`
('but expected type "' + expectedTypes + '".')
); );
} }
}); });
}; };
var isVisible = function isVisible(element) { const isVisible = (element) => {
if (!element) { if (!element) {
return false; return false;
} }
if (element.style && element.parentNode && element.parentNode.style) { if (element.style && element.parentNode && element.parentNode.style) {
var elementStyle = getComputedStyle(element); const elementStyle = getComputedStyle(element);
var parentNodeStyle = getComputedStyle(element.parentNode); const parentNodeStyle = getComputedStyle(element.parentNode);
return ( return (
elementStyle.display !== 'none' && elementStyle.display !== 'none' &&
parentNodeStyle.display !== 'none' && parentNodeStyle.display !== 'none' &&
@ -210,13 +153,10 @@
return false; return false;
}; };
var noop = function noop() { const noop = () => function () {};
return function () {};
};
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -225,7 +165,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -233,19 +173,19 @@
} }
}; };
var isRTL = document.documentElement.dir === 'rtl'; const isRTL = () => document.documentElement.dir === 'rtl';
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(function () { onDOMContentLoaded(() => {
var $ = getjQuery(); const $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -253,60 +193,63 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'dropdown'; const NAME = 'dropdown';
var DATA_KEY = 'bs.dropdown'; const DATA_KEY = 'bs.dropdown';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var DATA_API_KEY = '.data-api'; const DATA_API_KEY = '.data-api';
var ESCAPE_KEY = 'Escape'; const ESCAPE_KEY = 'Escape';
var SPACE_KEY = 'Space'; const SPACE_KEY = 'Space';
var TAB_KEY = 'Tab'; const TAB_KEY = 'Tab';
var ARROW_UP_KEY = 'ArrowUp'; const ARROW_UP_KEY = 'ArrowUp';
var ARROW_DOWN_KEY = 'ArrowDown'; const ARROW_DOWN_KEY = 'ArrowDown';
var RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEY + '|' + ARROW_DOWN_KEY + '|' + ESCAPE_KEY); const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`);
var EVENT_HIDE = 'hide' + EVENT_KEY; const EVENT_HIDE = `hide${EVENT_KEY}`;
var EVENT_HIDDEN = 'hidden' + EVENT_KEY; const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
var EVENT_SHOW = 'show' + EVENT_KEY; const EVENT_SHOW = `show${EVENT_KEY}`;
var EVENT_SHOWN = 'shown' + EVENT_KEY; const EVENT_SHOWN = `shown${EVENT_KEY}`;
var EVENT_CLICK = 'click' + EVENT_KEY; const EVENT_CLICK = `click${EVENT_KEY}`;
var EVENT_CLICK_DATA_API = 'click' + EVENT_KEY + DATA_API_KEY; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
var EVENT_KEYDOWN_DATA_API = 'keydown' + EVENT_KEY + DATA_API_KEY; const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
var EVENT_KEYUP_DATA_API = 'keyup' + EVENT_KEY + DATA_API_KEY; const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
var CLASS_NAME_DISABLED = 'disabled'; const CLASS_NAME_DISABLED = 'disabled';
var CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
var CLASS_NAME_DROPUP = 'dropup'; const CLASS_NAME_DROPUP = 'dropup';
var CLASS_NAME_DROPEND = 'dropend'; const CLASS_NAME_DROPEND = 'dropend';
var CLASS_NAME_DROPSTART = 'dropstart'; const CLASS_NAME_DROPSTART = 'dropstart';
var CLASS_NAME_NAVBAR = 'navbar'; const CLASS_NAME_NAVBAR = 'navbar';
var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
var SELECTOR_FORM_CHILD = '.dropdown form'; const SELECTOR_MENU = '.dropdown-menu';
var SELECTOR_MENU = '.dropdown-menu'; const SELECTOR_NAVBAR_NAV = '.navbar-nav';
var SELECTOR_NAVBAR_NAV = '.navbar-nav'; const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
var PLACEMENT_TOP = isRTL ? 'top-end' : 'top-start'; const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
var PLACEMENT_TOPEND = isRTL ? 'top-start' : 'top-end'; const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
var PLACEMENT_BOTTOM = isRTL ? 'bottom-end' : 'bottom-start'; const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
var PLACEMENT_BOTTOMEND = isRTL ? 'bottom-start' : 'bottom-end'; const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
var PLACEMENT_RIGHT = isRTL ? 'left-start' : 'right-start'; const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
var PLACEMENT_LEFT = isRTL ? 'right-start' : 'left-start'; const Default = {
var Default = {
offset: [0, 2], offset: [0, 2],
flip: true,
boundary: 'clippingParents', boundary: 'clippingParents',
reference: 'toggle', reference: 'toggle',
display: 'dynamic', display: 'dynamic',
popperConfig: null, popperConfig: null,
}; };
var DefaultType = { const DefaultType = {
offset: '(array|string|function)', offset: '(array|string|function)',
flip: 'boolean',
boundary: '(string|element)', boundary: '(string|element)',
reference: '(string|element|object)', reference: '(string|element|object)',
display: 'string', display: 'string',
@ -318,32 +261,35 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Dropdown = /*#__PURE__*/ (function (_BaseComponent) { class Dropdown extends BaseComponent__default['default'] {
_inheritsLoose(Dropdown, _BaseComponent); constructor(element, config) {
super(element);
this._popper = null;
this._config = this._getConfig(config);
this._menu = this._getMenuElement();
this._inNavbar = this._detectNavbar();
function Dropdown(element, config) { this._addEventListeners();
var _this;
_this = _BaseComponent.call(this, element) || this;
_this._popper = null;
_this._config = _this._getConfig(config);
_this._menu = _this._getMenuElement();
_this._inNavbar = _this._detectNavbar();
_this._addEventListeners();
return _this;
} // Getters } // Getters
var _proto = Dropdown.prototype; static get Default() {
return Default;
}
// Public static get DefaultType() {
_proto.toggle = function toggle() { return DefaultType;
}
static get DATA_KEY() {
return DATA_KEY;
} // Public
toggle() {
if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) { if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
return; return;
} }
var isActive = this._element.classList.contains(CLASS_NAME_SHOW); const isActive = this._element.classList.contains(CLASS_NAME_SHOW);
Dropdown.clearMenus(); Dropdown.clearMenus();
@ -352,9 +298,9 @@
} }
this.show(); this.show();
}; }
_proto.show = function show() { show() {
if ( if (
this._element.disabled || this._element.disabled ||
this._element.classList.contains(CLASS_NAME_DISABLED) || this._element.classList.contains(CLASS_NAME_DISABLED) ||
@ -363,11 +309,11 @@
return; return;
} }
var parent = Dropdown.getParentFromElement(this._element); const parent = Dropdown.getParentFromElement(this._element);
var relatedTarget = { const relatedTarget = {
relatedTarget: this._element, relatedTarget: this._element,
}; };
var showEvent = EventHandler__default['default'].trigger( const showEvent = EventHandler__default['default'].trigger(
this._element, this._element,
EVENT_SHOW, EVENT_SHOW,
relatedTarget relatedTarget
@ -384,7 +330,7 @@
throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
} }
var referenceElement = this._element; let referenceElement = this._element;
if (this._config.reference === 'parent') { if (this._config.reference === 'parent') {
referenceElement = parent; referenceElement = parent;
@ -398,12 +344,12 @@
referenceElement = this._config.reference; referenceElement = this._config.reference;
} }
var popperConfig = this._getPopperConfig(); const popperConfig = this._getPopperConfig();
var isDisplayStatic = popperConfig.modifiers.find(function (modifier) { const isDisplayStatic = popperConfig.modifiers.find(
return modifier.name === 'applyStyles' && modifier.enabled === false; (modifier) => modifier.name === 'applyStyles' && modifier.enabled === false
}); );
this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig); this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
if (isDisplayStatic) { if (isDisplayStatic) {
Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static'); Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
@ -414,11 +360,9 @@
// 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 && !parent.closest(SELECTOR_NAVBAR_NAV)) { if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
var _ref; []
.concat(...document.body.children)
(_ref = []).concat.apply(_ref, document.body.children).forEach(function (elem) { .forEach((elem) => EventHandler__default['default'].on(elem, 'mouseover', null, noop()));
return EventHandler__default['default'].on(elem, 'mouseover', null, noop());
});
} }
this._element.focus(); this._element.focus();
@ -430,9 +374,9 @@
this._element.classList.toggle(CLASS_NAME_SHOW); this._element.classList.toggle(CLASS_NAME_SHOW);
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget); EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
}; }
_proto.hide = function hide() { hide() {
if ( if (
this._element.disabled || this._element.disabled ||
this._element.classList.contains(CLASS_NAME_DISABLED) || this._element.classList.contains(CLASS_NAME_DISABLED) ||
@ -441,10 +385,10 @@
return; return;
} }
var relatedTarget = { const relatedTarget = {
relatedTarget: this._element, relatedTarget: this._element,
}; };
var hideEvent = EventHandler__default['default'].trigger( const hideEvent = EventHandler__default['default'].trigger(
this._element, this._element,
EVENT_HIDE, EVENT_HIDE,
relatedTarget relatedTarget
@ -464,11 +408,9 @@
Manipulator__default['default'].removeDataAttribute(this._menu, 'popper'); Manipulator__default['default'].removeDataAttribute(this._menu, 'popper');
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget); EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget);
}; }
_proto.dispose = function dispose() {
_BaseComponent.prototype.dispose.call(this);
dispose() {
EventHandler__default['default'].off(this._element, EVENT_KEY); EventHandler__default['default'].off(this._element, EVENT_KEY);
this._menu = null; this._menu = null;
@ -477,34 +419,31 @@
this._popper = null; this._popper = null;
} }
};
_proto.update = function update() { super.dispose();
}
update() {
this._inNavbar = this._detectNavbar(); this._inNavbar = this._detectNavbar();
if (this._popper) { if (this._popper) {
this._popper.update(); this._popper.update();
} }
}; // Private } // Private
_proto._addEventListeners = function _addEventListeners() { _addEventListeners() {
var _this2 = this; EventHandler__default['default'].on(this._element, EVENT_CLICK, (event) => {
EventHandler__default['default'].on(this._element, EVENT_CLICK, function (event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); this.toggle();
_this2.toggle();
}); });
}; }
_proto._getConfig = function _getConfig(config) { _getConfig(config) {
config = _extends( config = {
{}, ...this.constructor.Default,
this.constructor.Default, ...Manipulator__default['default'].getDataAttributes(this._element),
Manipulator__default['default'].getDataAttributes(this._element), ...config,
config };
);
typeCheckConfig(NAME, config, this.constructor.DefaultType); typeCheckConfig(NAME, config, this.constructor.DefaultType);
if ( if (
@ -514,20 +453,19 @@
) { ) {
// Popper virtual elements require a getBoundingClientRect method // Popper virtual elements require a getBoundingClientRect method
throw new TypeError( throw new TypeError(
NAME.toUpperCase() + `${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`
': Option "reference" provided type "object" without a required "getBoundingClientRect" method.'
); );
} }
return config; return config;
}; }
_proto._getMenuElement = function _getMenuElement() { _getMenuElement() {
return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0]; return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
}; }
_proto._getPlacement = function _getPlacement() { _getPlacement() {
var parentDropdown = this._element.parentNode; const parentDropdown = this._element.parentNode;
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
return PLACEMENT_RIGHT; return PLACEMENT_RIGHT;
@ -537,47 +475,40 @@
return PLACEMENT_LEFT; return PLACEMENT_LEFT;
} // 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
var 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;
}; }
_proto._detectNavbar = function _detectNavbar() { _detectNavbar() {
return this._element.closest('.' + CLASS_NAME_NAVBAR) !== null; return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
}; }
_proto._getOffset = function _getOffset() { _getOffset() {
var _this3 = this; const { offset } = this._config;
var offset = this._config.offset;
if (typeof offset === 'string') { if (typeof offset === 'string') {
return offset.split(',').map(function (val) { return offset.split(',').map((val) => Number.parseInt(val, 10));
return Number.parseInt(val, 10);
});
} }
if (typeof offset === 'function') { if (typeof offset === 'function') {
return function (popperData) { return (popperData) => offset(popperData, this._element);
return offset(popperData, _this3._element);
};
} }
return offset; return offset;
}; }
_proto._getPopperConfig = function _getPopperConfig() { _getPopperConfig() {
var defaultBsPopperConfig = { const defaultBsPopperConfig = {
placement: this._getPlacement(), placement: this._getPlacement(),
modifiers: [ modifiers: [
{ {
name: 'preventOverflow', name: 'preventOverflow',
options: { options: {
altBoundary: this._config.flip,
boundary: this._config.boundary, boundary: this._config.boundary,
}, },
}, },
@ -599,19 +530,18 @@
]; ];
} }
return _extends( return {
{}, ...defaultBsPopperConfig,
defaultBsPopperConfig, ...(typeof this._config.popperConfig === 'function'
typeof this._config.popperConfig === 'function'
? this._config.popperConfig(defaultBsPopperConfig) ? this._config.popperConfig(defaultBsPopperConfig)
: this._config.popperConfig : this._config.popperConfig),
); };
}; // Static } // Static
Dropdown.dropdownInterface = function dropdownInterface(element, config) { static dropdownInterface(element, config) {
var data = Data__default['default'].getData(element, DATA_KEY); let data = Data__default['default'].get(element, DATA_KEY);
var _config = typeof config === 'object' ? config : null; const _config = typeof config === 'object' ? config : null;
if (!data) { if (!data) {
data = new Dropdown(element, _config); data = new Dropdown(element, _config);
@ -619,32 +549,38 @@
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]();
} }
}; }
Dropdown.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
Dropdown.dropdownInterface(this, config); Dropdown.dropdownInterface(this, config);
}); });
}; }
Dropdown.clearMenus = function clearMenus(event) { static clearMenus(event) {
if (event) {
if ( if (
event && event.button === RIGHT_MOUSE_BUTTON ||
(event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) (event.type === 'keyup' && event.key !== TAB_KEY)
) { ) {
return; return;
} }
var toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE); if (/input|select|textarea|form/i.test(event.target.tagName)) {
return;
}
}
for (var i = 0, len = toggles.length; i < len; i++) { const toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
var context = Data__default['default'].getData(toggles[i], DATA_KEY);
var relatedTarget = { for (let i = 0, len = toggles.length; i < len; i++) {
const context = Data__default['default'].get(toggles[i], DATA_KEY);
const relatedTarget = {
relatedTarget: toggles[i], relatedTarget: toggles[i],
}; };
@ -656,22 +592,28 @@
continue; continue;
} }
var dropdownMenu = context._menu; const dropdownMenu = context._menu;
if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) { if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
continue; continue;
} }
if (event) {
// Don't close the menu if the clicked element or one of its parents is the dropdown button
if ([context._element].some((element) => event.composedPath().includes(element))) {
continue;
} // Tab navigation through the dropdown menu shouldn't close the menu
if ( if (
event && event.type === 'keyup' &&
((event.type === 'click' && /input|textarea/i.test(event.target.tagName)) || event.key === TAB_KEY &&
(event.type === 'keyup' && event.key === TAB_KEY)) &&
dropdownMenu.contains(event.target) dropdownMenu.contains(event.target)
) { ) {
continue; continue;
} }
}
var hideEvent = EventHandler__default['default'].trigger( const hideEvent = EventHandler__default['default'].trigger(
toggles[i], toggles[i],
EVENT_HIDE, EVENT_HIDE,
relatedTarget relatedTarget
@ -683,11 +625,11 @@
// 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) {
var _ref2; []
.concat(...document.body.children)
(_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) { .forEach((elem) =>
return EventHandler__default['default'].off(elem, 'mouseover', null, noop()); EventHandler__default['default'].off(elem, 'mouseover', null, noop())
}); );
} }
toggles[i].setAttribute('aria-expanded', 'false'); toggles[i].setAttribute('aria-expanded', 'false');
@ -701,13 +643,13 @@
Manipulator__default['default'].removeDataAttribute(dropdownMenu, 'popper'); Manipulator__default['default'].removeDataAttribute(dropdownMenu, 'popper');
EventHandler__default['default'].trigger(toggles[i], EVENT_HIDDEN, relatedTarget); EventHandler__default['default'].trigger(toggles[i], EVENT_HIDDEN, relatedTarget);
} }
}; }
Dropdown.getParentFromElement = function getParentFromElement(element) { static getParentFromElement(element) {
return getElementFromSelector(element) || element.parentNode; return getElementFromSelector(element) || element.parentNode;
}; }
Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) { static dataApiKeydownHandler(event) {
// If not input/textarea: // If not input/textarea:
// - And not a key in REGEXP_KEYDOWN => not a dropdown command // - And not a key in REGEXP_KEYDOWN => not a dropdown command
// If input/textarea: // If input/textarea:
@ -733,11 +675,11 @@
return; return;
} }
var parent = Dropdown.getParentFromElement(this); const parent = Dropdown.getParentFromElement(this);
var isActive = this.classList.contains(CLASS_NAME_SHOW); const isActive = this.classList.contains(CLASS_NAME_SHOW);
if (event.key === ESCAPE_KEY) { if (event.key === ESCAPE_KEY) {
var button = this.matches(SELECTOR_DATA_TOGGLE) const button = this.matches(SELECTOR_DATA_TOGGLE)
? this ? this
: SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0]; : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
button.focus(); button.focus();
@ -746,12 +688,10 @@
} }
if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) { if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
var _button = this.matches(SELECTOR_DATA_TOGGLE) const button = this.matches(SELECTOR_DATA_TOGGLE)
? this ? this
: SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0]; : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
button.click();
_button.click();
return; return;
} }
@ -760,7 +700,7 @@
return; return;
} }
var items = SelectorEngine__default['default'] const items = SelectorEngine__default['default']
.find(SELECTOR_VISIBLE_ITEMS, parent) .find(SELECTOR_VISIBLE_ITEMS, parent)
.filter(isVisible); .filter(isVisible);
@ -768,7 +708,7 @@
return; return;
} }
var index = items.indexOf(event.target); // Up let index = items.indexOf(event.target); // Up
if (event.key === ARROW_UP_KEY && index > 0) { if (event.key === ARROW_UP_KEY && index > 0) {
index--; index--;
@ -780,31 +720,8 @@
index = index === -1 ? 0 : index; index = index === -1 ? 0 : index;
items[index].focus(); items[index].focus();
}; }
}
_createClass(Dropdown, null, [
{
key: 'Default',
get: function get() {
return Default;
},
},
{
key: 'DefaultType',
get: function get() {
return DefaultType;
},
},
{
key: 'DATA_KEY',
get: function get() {
return DATA_KEY;
},
},
]);
return Dropdown;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Data Api implementation * Data Api implementation
@ -831,16 +748,7 @@
SELECTOR_DATA_TOGGLE, SELECTOR_DATA_TOGGLE,
function (event) { function (event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); Dropdown.dropdownInterface(this);
Dropdown.dropdownInterface(this, 'toggle');
}
);
EventHandler__default['default'].on(
document,
EVENT_CLICK_DATA_API,
SELECTOR_FORM_CHILD,
function (e) {
return e.stopPropagation();
} }
); );
/** /**

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

561
src/js/bootstrap/dist/offcanvas.js vendored Normal file
View File

@ -0,0 +1,561 @@
/*!
* Bootstrap offcanvas.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory(
require('./dom/selector-engine.js'),
require('./dom/manipulator.js'),
require('./dom/data.js'),
require('./dom/event-handler.js'),
require('./base-component.js')
))
: typeof define === 'function' && define.amd
? define([
'./dom/selector-engine',
'./dom/manipulator',
'./dom/data',
'./dom/event-handler',
'./base-component',
], factory)
: ((global = typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.Offcanvas = factory(
global.SelectorEngine,
global.Manipulator,
global.Data,
global.EventHandler,
global.Base
)));
})(this, function (SelectorEngine, Manipulator, Data, EventHandler, BaseComponent) {
'use strict';
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
var Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
var Data__default = /*#__PURE__*/ _interopDefaultLegacy(Data);
var EventHandler__default = /*#__PURE__*/ _interopDefaultLegacy(EventHandler);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): util/index.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
const MILLISECONDS_MULTIPLIER = 1000;
const toType = (obj) => {
if (obj === null || obj === undefined) {
return `${obj}`;
}
return {}.toString
.call(obj)
.match(/\s([a-z]+)/i)[1]
.toLowerCase();
};
const getSelector = (element) => {
let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') {
let hrefAttr = 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 (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {
return null;
} // Just in case some CMS puts out a full URL with the anchor appended
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
hrefAttr = '#' + hrefAttr.split('#')[1];
}
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.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) => {
if (!element) {
return 0;
} // Get transition-duration of the element
let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
const floatTransitionDuration = Number.parseFloat(transitionDuration);
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) {
return 0;
} // If multiple durations are defined, take the first
transitionDuration = transitionDuration.split(',')[0];
transitionDelay = transitionDelay.split(',')[0];
return (
(Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) *
MILLISECONDS_MULTIPLIER
);
};
const isElement = (obj) => (obj[0] || obj).nodeType;
const typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach((property) => {
const expectedTypes = configTypes[property];
const value = config[property];
const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError(
`${componentName.toUpperCase()}: ` +
`Option "${property}" provided type "${valueType}" ` +
`but expected type "${expectedTypes}".`
);
}
});
};
const isVisible = (element) => {
if (!element) {
return false;
}
if (element.style && element.parentNode && element.parentNode.style) {
const elementStyle = getComputedStyle(element);
const parentNodeStyle = getComputedStyle(element.parentNode);
return (
elementStyle.display !== 'none' &&
parentNodeStyle.display !== 'none' &&
elementStyle.visibility !== 'hidden'
);
}
return false;
};
const isDisabled = (element) => {
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true;
}
if (element.classList.contains('disabled')) {
return true;
}
if (typeof element.disabled !== 'undefined') {
return element.disabled;
}
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
};
const getjQuery = () => {
const { jQuery } = window;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery;
}
return null;
};
const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback);
} else {
callback();
}
};
const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
const $ = getjQuery();
/* istanbul ignore if */
if ($) {
const JQUERY_NO_CONFLICT = $.fn[name];
$.fn[name] = plugin.jQueryInterface;
$.fn[name].Constructor = plugin;
$.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface;
};
}
});
};
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): util/scrollBar.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed';
const SELECTOR_STICKY_CONTENT = '.sticky-top';
const getWidth = () => {
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
const documentWidth = document.documentElement.clientWidth;
return Math.abs(window.innerWidth - documentWidth);
};
const hide = (width = getWidth()) => {
document.body.style.overflow = 'hidden';
_setElementAttributes(
SELECTOR_FIXED_CONTENT,
'paddingRight',
(calculatedValue) => calculatedValue + width
);
_setElementAttributes(
SELECTOR_STICKY_CONTENT,
'marginRight',
(calculatedValue) => calculatedValue - width
);
_setElementAttributes('body', 'paddingRight', (calculatedValue) => calculatedValue + width);
};
const _setElementAttributes = (selector, styleProp, callback) => {
const scrollbarWidth = getWidth();
SelectorEngine__default['default'].find(selector).forEach((element) => {
if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
return;
}
const actualValue = element.style[styleProp];
const calculatedValue = window.getComputedStyle(element)[styleProp];
Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px';
});
};
const reset = () => {
document.body.style.overflow = 'auto';
_resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
_resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
_resetElementAttributes('body', 'paddingRight');
};
const _resetElementAttributes = (selector, styleProp) => {
SelectorEngine__default['default'].find(selector).forEach((element) => {
const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
if (typeof value === 'undefined' && element === document.body) {
element.style.removeProperty(styleProp);
} else {
Manipulator__default['default'].removeDataAttribute(element, styleProp);
element.style[styleProp] = value;
}
});
};
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): offcanvas.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const NAME = 'offcanvas';
const DATA_KEY = 'bs.offcanvas';
const EVENT_KEY = `.${DATA_KEY}`;
const DATA_API_KEY = '.data-api';
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
const ESCAPE_KEY = 'Escape';
const Default = {
backdrop: true,
keyboard: true,
scroll: false,
};
const DefaultType = {
backdrop: 'boolean',
keyboard: 'boolean',
scroll: 'boolean',
};
const CLASS_NAME_BACKDROP_BODY = 'offcanvas-backdrop';
const CLASS_NAME_SHOW = 'show';
const CLASS_NAME_TOGGLING = 'offcanvas-toggling';
const OPEN_SELECTOR = '.offcanvas.show';
const ACTIVE_SELECTOR = `${OPEN_SELECTOR}, .${CLASS_NAME_TOGGLING}`;
const EVENT_SHOW = `show${EVENT_KEY}`;
const EVENT_SHOWN = `shown${EVENT_KEY}`;
const EVENT_HIDE = `hide${EVENT_KEY}`;
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="offcanvas"]';
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Offcanvas extends BaseComponent__default['default'] {
constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._isShown = false;
this._addEventListeners();
} // Getters
static get Default() {
return Default;
}
static get DATA_KEY() {
return DATA_KEY;
} // Public
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown) {
return;
}
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
relatedTarget,
});
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
this._element.style.visibility = 'visible';
if (this._config.backdrop) {
document.body.classList.add(CLASS_NAME_BACKDROP_BODY);
}
if (!this._config.scroll) {
hide();
}
this._element.classList.add(CLASS_NAME_TOGGLING);
this._element.removeAttribute('aria-hidden');
this._element.setAttribute('aria-modal', true);
this._element.setAttribute('role', 'dialog');
this._element.classList.add(CLASS_NAME_SHOW);
const completeCallBack = () => {
this._element.classList.remove(CLASS_NAME_TOGGLING);
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
relatedTarget,
});
this._enforceFocusOnElement(this._element);
};
setTimeout(completeCallBack, getTransitionDurationFromElement(this._element));
}
hide() {
if (!this._isShown) {
return;
}
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) {
return;
}
this._element.classList.add(CLASS_NAME_TOGGLING);
EventHandler__default['default'].off(document, EVENT_FOCUSIN);
this._element.blur();
this._isShown = false;
this._element.classList.remove(CLASS_NAME_SHOW);
const completeCallback = () => {
this._element.setAttribute('aria-hidden', true);
this._element.removeAttribute('aria-modal');
this._element.removeAttribute('role');
this._element.style.visibility = 'hidden';
if (this._config.backdrop) {
document.body.classList.remove(CLASS_NAME_BACKDROP_BODY);
}
if (!this._config.scroll) {
reset();
}
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
this._element.classList.remove(CLASS_NAME_TOGGLING);
};
setTimeout(completeCallback, getTransitionDurationFromElement(this._element));
} // Private
_getConfig(config) {
config = {
...Default,
...Manipulator__default['default'].getDataAttributes(this._element),
...(typeof config === 'object' ? config : {}),
};
typeCheckConfig(NAME, config, DefaultType);
return config;
}
_enforceFocusOnElement(element) {
EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
EventHandler__default['default'].on(document, EVENT_FOCUSIN, (event) => {
if (
document !== event.target &&
element !== event.target &&
!element.contains(event.target)
) {
element.focus();
}
});
element.focus();
}
_addEventListeners() {
EventHandler__default['default'].on(
this._element,
EVENT_CLICK_DISMISS,
SELECTOR_DATA_DISMISS,
() => this.hide()
);
EventHandler__default['default'].on(document, 'keydown', (event) => {
if (this._config.keyboard && event.key === ESCAPE_KEY) {
this.hide();
}
});
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, (event) => {
const target = SelectorEngine__default['default'].findOne(
getSelectorFromElement(event.target)
);
if (!this._element.contains(event.target) && target !== this._element) {
this.hide();
}
});
} // Static
static jQueryInterface(config) {
return this.each(function () {
const data =
Data__default['default'].get(this, DATA_KEY) ||
new Offcanvas(this, typeof config === 'object' ? config : {});
if (typeof config !== 'string') {
return;
}
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
EventHandler__default['default'].on(
document,
EVENT_CLICK_DATA_API,
SELECTOR_DATA_TOGGLE,
function (event) {
const target = getElementFromSelector(this);
if (['A', 'AREA'].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
EventHandler__default['default'].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 allReadyOpen = SelectorEngine__default['default'].findOne(ACTIVE_SELECTOR);
if (allReadyOpen && allReadyOpen !== target) {
return;
}
const data = Data__default['default'].get(target, DATA_KEY) || new Offcanvas(target);
data.toggle(this);
}
);
EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => {
SelectorEngine__default['default']
.find(OPEN_SELECTOR)
.forEach((el) => (Data__default['default'].get(el, DATA_KEY) || new Offcanvas(el)).show());
});
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
defineJQueryPlugin(NAME, Offcanvas);
return Offcanvas;
});
//# sourceMappingURL=offcanvas.js.map

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap popover.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap popover.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -25,70 +25,15 @@
var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine); var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
var Tooltip__default = /*#__PURE__*/ _interopDefaultLegacy(Tooltip); var Tooltip__default = /*#__PURE__*/ _interopDefaultLegacy(Tooltip);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_extends =
Object.assign ||
function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -97,7 +42,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -105,19 +50,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -125,19 +68,25 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'popover'; const NAME = 'popover';
var DATA_KEY = 'bs.popover'; const DATA_KEY = 'bs.popover';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var CLASS_PREFIX = 'bs-popover'; const CLASS_PREFIX = 'bs-popover';
var BSCLS_PREFIX_REGEX = new RegExp('(^|\\s)' + CLASS_PREFIX + '\\S+', 'g'); const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
const Default = {
var Default = _extends({}, Tooltip__default['default'].Default, { ...Tooltip__default['default'].Default,
placement: 'right', placement: 'right',
offset: [0, 8], offset: [0, 8],
trigger: 'click', trigger: 'click',
@ -148,57 +97,72 @@
'<h3 class="popover-header"></h3>' + '<h3 class="popover-header"></h3>' +
'<div class="popover-body"></div>' + '<div class="popover-body"></div>' +
'</div>', '</div>',
});
var DefaultType = _extends({}, Tooltip__default['default'].DefaultType, {
content: '(string|element|function)',
});
var Event = {
HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown' + EVENT_KEY,
INSERTED: 'inserted' + EVENT_KEY,
CLICK: 'click' + EVENT_KEY,
FOCUSIN: 'focusin' + EVENT_KEY,
FOCUSOUT: 'focusout' + EVENT_KEY,
MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave' + EVENT_KEY,
}; };
var CLASS_NAME_FADE = 'fade'; const DefaultType = {
var CLASS_NAME_SHOW = 'show'; ...Tooltip__default['default'].DefaultType,
var SELECTOR_TITLE = '.popover-header'; content: '(string|element|function)',
var SELECTOR_CONTENT = '.popover-body'; };
const Event = {
HIDE: `hide${EVENT_KEY}`,
HIDDEN: `hidden${EVENT_KEY}`,
SHOW: `show${EVENT_KEY}`,
SHOWN: `shown${EVENT_KEY}`,
INSERTED: `inserted${EVENT_KEY}`,
CLICK: `click${EVENT_KEY}`,
FOCUSIN: `focusin${EVENT_KEY}`,
FOCUSOUT: `focusout${EVENT_KEY}`,
MOUSEENTER: `mouseenter${EVENT_KEY}`,
MOUSELEAVE: `mouseleave${EVENT_KEY}`,
};
const CLASS_NAME_FADE = 'fade';
const CLASS_NAME_SHOW = 'show';
const SELECTOR_TITLE = '.popover-header';
const SELECTOR_CONTENT = '.popover-body';
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Class Definition * Class Definition
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Popover = /*#__PURE__*/ (function (_Tooltip) { class Popover extends Tooltip__default['default'] {
_inheritsLoose(Popover, _Tooltip); // Getters
static get Default() {
function Popover() { return Default;
return _Tooltip.apply(this, arguments) || this;
} }
var _proto = Popover.prototype; static get NAME() {
return NAME;
}
// Overrides static get DATA_KEY() {
_proto.isWithContent = function isWithContent() { return DATA_KEY;
}
static get Event() {
return Event;
}
static get EVENT_KEY() {
return EVENT_KEY;
}
static get DefaultType() {
return DefaultType;
} // Overrides
isWithContent() {
return this.getTitle() || this._getContent(); return this.getTitle() || this._getContent();
}; }
_proto.setContent = function setContent() { setContent() {
var tip = this.getTipElement(); // we use append for html objects to maintain js events const tip = this.getTipElement(); // we use append for html objects to maintain js events
this.setElementContent( this.setElementContent(
SelectorEngine__default['default'].findOne(SELECTOR_TITLE, tip), SelectorEngine__default['default'].findOne(SELECTOR_TITLE, tip),
this.getTitle() this.getTitle()
); );
var content = this._getContent(); let content = this._getContent();
if (typeof content === 'function') { if (typeof content === 'function') {
content = content.call(this._element); content = content.call(this._element);
@ -209,36 +173,30 @@
content content
); );
tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW); tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);
}; // Private } // Private
_proto._addAttachmentClass = function _addAttachmentClass(attachment) { _addAttachmentClass(attachment) {
this.getTipElement().classList.add(CLASS_PREFIX + '-' + this.updateAttachment(attachment)); this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
}; }
_proto._getContent = function _getContent() { _getContent() {
return this._element.getAttribute('data-bs-content') || this.config.content; return this._element.getAttribute('data-bs-content') || this.config.content;
}; }
_proto._cleanTipClass = function _cleanTipClass() { _cleanTipClass() {
var tip = this.getTipElement(); const tip = this.getTipElement();
var tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX); const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
if (tabClass !== null && tabClass.length > 0) { if (tabClass !== null && tabClass.length > 0) {
tabClass tabClass.map((token) => token.trim()).forEach((tClass) => tip.classList.remove(tClass));
.map(function (token) {
return token.trim();
})
.forEach(function (tClass) {
return tip.classList.remove(tClass);
});
} }
}; // Static } // Static
Popover.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
var data = Data__default['default'].getData(this, DATA_KEY); let data = Data__default['default'].get(this, DATA_KEY);
var _config = typeof config === 'object' ? config : null; const _config = typeof config === 'object' ? config : null;
if (!data && /dispose|hide/.test(config)) { if (!data && /dispose|hide/.test(config)) {
return; return;
@ -246,61 +204,19 @@
if (!data) { if (!data) {
data = new Popover(this, _config); data = new Popover(this, _config);
Data__default['default'].setData(this, DATA_KEY, data); Data__default['default'].set(this, DATA_KEY, data);
} }
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]();
} }
}); });
}; }
}
_createClass(Popover, null, [
{
key: 'Default',
// Getters
get: function get() {
return Default;
},
},
{
key: 'NAME',
get: function get() {
return NAME;
},
},
{
key: 'DATA_KEY',
get: function get() {
return DATA_KEY;
},
},
{
key: 'Event',
get: function get() {
return Event;
},
},
{
key: 'EVENT_KEY',
get: function get() {
return EVENT_KEY;
},
},
{
key: 'DefaultType',
get: function get() {
return DefaultType;
},
},
]);
return Popover;
})(Tooltip__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* jQuery * jQuery

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap scrollspy.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap scrollspy.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -41,71 +41,17 @@
var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine); var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_extends =
Object.assign ||
function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var MAX_UID = 1000000; const MAX_UID = 1000000;
var toType = function toType(obj) { const toType = (obj) => {
if (obj === null || obj === undefined) { if (obj === null || obj === undefined) {
return '' + obj; return `${obj}`;
} }
return {}.toString return {}.toString
@ -119,7 +65,7 @@
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var getUID = function getUID(prefix) { const getUID = (prefix) => {
do { do {
prefix += Math.floor(Math.random() * MAX_UID); prefix += Math.floor(Math.random() * MAX_UID);
} while (document.getElementById(prefix)); } while (document.getElementById(prefix));
@ -127,11 +73,11 @@
return prefix; return prefix;
}; };
var getSelector = function getSelector(element) { const getSelector = (element) => {
var selector = element.getAttribute('data-bs-target'); let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, let hrefAttr = 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, // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
// `document.querySelector` will rightfully complain it is invalid. // `document.querySelector` will rightfully complain it is invalid.
// See https://github.com/twbs/bootstrap/issues/32273 // See https://github.com/twbs/bootstrap/issues/32273
@ -150,8 +96,8 @@
return selector; return selector;
}; };
var getSelectorFromElement = function getSelectorFromElement(element) { const getSelectorFromElement = (element) => {
var selector = getSelector(element); const selector = getSelector(element);
if (selector) { if (selector) {
return document.querySelector(selector) ? selector : null; return document.querySelector(selector) ? selector : null;
@ -160,30 +106,26 @@
return null; return null;
}; };
var isElement = function isElement(obj) { const isElement = (obj) => (obj[0] || obj).nodeType;
return (obj[0] || obj).nodeType;
};
var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) { const typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach(function (property) { Object.keys(configTypes).forEach((property) => {
var expectedTypes = configTypes[property]; const expectedTypes = configTypes[property];
var value = config[property]; const value = config[property];
var valueType = value && isElement(value) ? 'element' : toType(value); const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError( throw new TypeError(
componentName.toUpperCase() + `${componentName.toUpperCase()}: ` +
': ' + `Option "${property}" provided type "${valueType}" ` +
('Option "' + property + '" provided type "' + valueType + '" ') + `but expected type "${expectedTypes}".`
('but expected type "' + expectedTypes + '".')
); );
} }
}); });
}; };
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -192,7 +134,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -200,19 +142,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -220,105 +160,94 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'scrollspy'; const NAME = 'scrollspy';
var DATA_KEY = 'bs.scrollspy'; const DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var DATA_API_KEY = '.data-api'; const DATA_API_KEY = '.data-api';
var Default = { const Default = {
offset: 10, offset: 10,
method: 'auto', method: 'auto',
target: '', target: '',
}; };
var DefaultType = { const DefaultType = {
offset: 'number', offset: 'number',
method: 'string', method: 'string',
target: '(string|element)', target: '(string|element)',
}; };
var EVENT_ACTIVATE = 'activate' + EVENT_KEY; const EVENT_ACTIVATE = `activate${EVENT_KEY}`;
var EVENT_SCROLL = 'scroll' + EVENT_KEY; const EVENT_SCROLL = `scroll${EVENT_KEY}`;
var EVENT_LOAD_DATA_API = 'load' + EVENT_KEY + DATA_API_KEY; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
var CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
var SELECTOR_NAV_LINKS = '.nav-link'; const SELECTOR_NAV_LINKS = '.nav-link';
var SELECTOR_NAV_ITEMS = '.nav-item'; const SELECTOR_NAV_ITEMS = '.nav-item';
var SELECTOR_LIST_ITEMS = '.list-group-item'; const SELECTOR_LIST_ITEMS = '.list-group-item';
var SELECTOR_DROPDOWN = '.dropdown'; const SELECTOR_DROPDOWN = '.dropdown';
var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
var METHOD_OFFSET = 'offset'; const METHOD_OFFSET = 'offset';
var METHOD_POSITION = 'position'; const METHOD_POSITION = 'position';
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Class Definition * Class Definition
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var ScrollSpy = /*#__PURE__*/ (function (_BaseComponent) { class ScrollSpy extends BaseComponent__default['default'] {
_inheritsLoose(ScrollSpy, _BaseComponent); constructor(element, config) {
super(element);
this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
this._config = this._getConfig(config);
this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
this._offsets = [];
this._targets = [];
this._activeTarget = null;
this._scrollHeight = 0;
EventHandler__default['default'].on(this._scrollElement, EVENT_SCROLL, () => this._process());
this.refresh();
function ScrollSpy(element, config) { this._process();
var _this;
_this = _BaseComponent.call(this, element) || this;
_this._scrollElement = element.tagName === 'BODY' ? window : element;
_this._config = _this._getConfig(config);
_this._selector =
_this._config.target +
' ' +
SELECTOR_NAV_LINKS +
', ' +
_this._config.target +
' ' +
SELECTOR_LIST_ITEMS +
', ' +
_this._config.target +
' .' +
CLASS_NAME_DROPDOWN_ITEM;
_this._offsets = [];
_this._targets = [];
_this._activeTarget = null;
_this._scrollHeight = 0;
EventHandler__default['default'].on(_this._scrollElement, EVENT_SCROLL, function () {
return _this._process();
});
_this.refresh();
_this._process();
return _this;
} // Getters } // Getters
var _proto = ScrollSpy.prototype; static get Default() {
return Default;
}
// Public static get DATA_KEY() {
_proto.refresh = function refresh() { return DATA_KEY;
var _this2 = this; } // Public
var autoMethod = refresh() {
const autoMethod =
this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
this._offsets = []; this._offsets = [];
this._targets = []; this._targets = [];
this._scrollHeight = this._getScrollHeight(); this._scrollHeight = this._getScrollHeight();
var targets = SelectorEngine__default['default'].find(this._selector); const targets = SelectorEngine__default['default'].find(this._selector);
targets targets
.map(function (element) { .map((element) => {
var targetSelector = getSelectorFromElement(element); const targetSelector = getSelectorFromElement(element);
var target = targetSelector const target = targetSelector
? SelectorEngine__default['default'].findOne(targetSelector) ? SelectorEngine__default['default'].findOne(targetSelector)
: null; : null;
if (target) { if (target) {
var targetBCR = target.getBoundingClientRect(); const targetBCR = target.getBoundingClientRect();
if (targetBCR.width || targetBCR.height) { if (targetBCR.width || targetBCR.height) {
return [ return [
@ -330,22 +259,17 @@
return null; return null;
}) })
.filter(function (item) { .filter((item) => item)
return item; .sort((a, b) => a[0] - b[0])
}) .forEach((item) => {
.sort(function (a, b) { this._offsets.push(item[0]);
return a[0] - b[0];
})
.forEach(function (item) {
_this2._offsets.push(item[0]);
_this2._targets.push(item[1]); this._targets.push(item[1]);
}); });
}; }
_proto.dispose = function dispose() {
_BaseComponent.prototype.dispose.call(this);
dispose() {
super.dispose();
EventHandler__default['default'].off(this._scrollElement, EVENT_KEY); EventHandler__default['default'].off(this._scrollElement, EVENT_KEY);
this._scrollElement = null; this._scrollElement = null;
this._config = null; this._config = null;
@ -354,58 +278,58 @@
this._targets = null; this._targets = null;
this._activeTarget = null; this._activeTarget = null;
this._scrollHeight = null; this._scrollHeight = null;
}; // Private } // Private
_proto._getConfig = function _getConfig(config) { _getConfig(config) {
config = _extends({}, Default, typeof config === 'object' && config ? config : {}); config = { ...Default, ...(typeof config === 'object' && config ? config : {}) };
if (typeof config.target !== 'string' && isElement(config.target)) { if (typeof config.target !== 'string' && isElement(config.target)) {
var id = config.target.id; let { id } = config.target;
if (!id) { if (!id) {
id = getUID(NAME); id = getUID(NAME);
config.target.id = id; config.target.id = id;
} }
config.target = '#' + id; config.target = `#${id}`;
} }
typeCheckConfig(NAME, config, DefaultType); typeCheckConfig(NAME, config, DefaultType);
return config; return config;
}; }
_proto._getScrollTop = function _getScrollTop() { _getScrollTop() {
return this._scrollElement === window return this._scrollElement === window
? this._scrollElement.pageYOffset ? this._scrollElement.pageYOffset
: this._scrollElement.scrollTop; : this._scrollElement.scrollTop;
}; }
_proto._getScrollHeight = function _getScrollHeight() { _getScrollHeight() {
return ( return (
this._scrollElement.scrollHeight || this._scrollElement.scrollHeight ||
Math.max(document.body.scrollHeight, document.documentElement.scrollHeight) Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)
); );
}; }
_proto._getOffsetHeight = function _getOffsetHeight() { _getOffsetHeight() {
return this._scrollElement === window return this._scrollElement === window
? window.innerHeight ? window.innerHeight
: this._scrollElement.getBoundingClientRect().height; : this._scrollElement.getBoundingClientRect().height;
}; }
_proto._process = function _process() { _process() {
var scrollTop = this._getScrollTop() + this._config.offset; const scrollTop = this._getScrollTop() + this._config.offset;
var scrollHeight = this._getScrollHeight(); const scrollHeight = this._getScrollHeight();
var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
if (this._scrollHeight !== scrollHeight) { if (this._scrollHeight !== scrollHeight) {
this.refresh(); this.refresh();
} }
if (scrollTop >= maxScroll) { if (scrollTop >= maxScroll) {
var target = this._targets[this._targets.length - 1]; const target = this._targets[this._targets.length - 1];
if (this._activeTarget !== target) { if (this._activeTarget !== target) {
this._activate(target); this._activate(target);
@ -422,8 +346,8 @@
return; return;
} }
for (var i = this._offsets.length; i--; ) { for (let i = this._offsets.length; i--; ) {
var isActiveTarget = const isActiveTarget =
this._activeTarget !== this._targets[i] && this._activeTarget !== this._targets[i] &&
scrollTop >= this._offsets[i] && scrollTop >= this._offsets[i] &&
(typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
@ -432,20 +356,18 @@
this._activate(this._targets[i]); this._activate(this._targets[i]);
} }
} }
}; }
_proto._activate = function _activate(target) { _activate(target) {
this._activeTarget = target; this._activeTarget = target;
this._clear(); this._clear();
var queries = this._selector.split(',').map(function (selector) { const queries = this._selector
return ( .split(',')
selector + '[data-bs-target="' + target + '"],' + selector + '[href="' + target + '"]' .map((selector) => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
);
});
var link = SelectorEngine__default['default'].findOne(queries.join(',')); const link = SelectorEngine__default['default'].findOne(queries.join(','));
if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
SelectorEngine__default['default'] SelectorEngine__default['default']
@ -457,23 +379,19 @@
link.classList.add(CLASS_NAME_ACTIVE); link.classList.add(CLASS_NAME_ACTIVE);
SelectorEngine__default['default'] SelectorEngine__default['default']
.parents(link, SELECTOR_NAV_LIST_GROUP) .parents(link, SELECTOR_NAV_LIST_GROUP)
.forEach(function (listGroup) { .forEach((listGroup) => {
// 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
SelectorEngine__default['default'] SelectorEngine__default['default']
.prev(listGroup, SELECTOR_NAV_LINKS + ', ' + SELECTOR_LIST_ITEMS) .prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)
.forEach(function (item) { .forEach((item) => item.classList.add(CLASS_NAME_ACTIVE)); // Handle special case when .nav-link is inside .nav-item
return item.classList.add(CLASS_NAME_ACTIVE);
}); // Handle special case when .nav-link is inside .nav-item
SelectorEngine__default['default'] SelectorEngine__default['default']
.prev(listGroup, SELECTOR_NAV_ITEMS) .prev(listGroup, SELECTOR_NAV_ITEMS)
.forEach(function (navItem) { .forEach((navItem) => {
SelectorEngine__default['default'] SelectorEngine__default['default']
.children(navItem, SELECTOR_NAV_LINKS) .children(navItem, SELECTOR_NAV_LINKS)
.forEach(function (item) { .forEach((item) => item.classList.add(CLASS_NAME_ACTIVE));
return item.classList.add(CLASS_NAME_ACTIVE);
});
}); });
}); });
} }
@ -481,24 +399,20 @@
EventHandler__default['default'].trigger(this._scrollElement, EVENT_ACTIVATE, { EventHandler__default['default'].trigger(this._scrollElement, EVENT_ACTIVATE, {
relatedTarget: target, relatedTarget: target,
}); });
}; }
_proto._clear = function _clear() { _clear() {
SelectorEngine__default['default'] SelectorEngine__default['default']
.find(this._selector) .find(this._selector)
.filter(function (node) { .filter((node) => node.classList.contains(CLASS_NAME_ACTIVE))
return node.classList.contains(CLASS_NAME_ACTIVE); .forEach((node) => node.classList.remove(CLASS_NAME_ACTIVE));
}) } // Static
.forEach(function (node) {
return node.classList.remove(CLASS_NAME_ACTIVE);
});
}; // Static
ScrollSpy.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
var data = Data__default['default'].getData(this, DATA_KEY); let data = Data__default['default'].get(this, DATA_KEY);
var _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data) { if (!data) {
data = new ScrollSpy(this, _config); data = new ScrollSpy(this, _config);
@ -506,41 +420,24 @@
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]();
} }
}); });
}; }
}
_createClass(ScrollSpy, null, [
{
key: 'Default',
get: function get() {
return Default;
},
},
{
key: 'DATA_KEY',
get: function get() {
return DATA_KEY;
},
},
]);
return ScrollSpy;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Data Api implementation * Data Api implementation
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, function () { EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => {
SelectorEngine__default['default'].find(SELECTOR_DATA_SPY).forEach(function (spy) { SelectorEngine__default['default']
return new ScrollSpy(spy, Manipulator__default['default'].getDataAttributes(spy)); .find(SELECTOR_DATA_SPY)
}); .forEach((spy) => new ScrollSpy(spy, Manipulator__default['default'].getDataAttributes(spy)));
}); });
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap tab.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap tab.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -32,54 +32,20 @@
var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine); var SelectorEngine__default = /*#__PURE__*/ _interopDefaultLegacy(SelectorEngine);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var MILLISECONDS_MULTIPLIER = 1000; const MILLISECONDS_MULTIPLIER = 1000;
var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp) const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
var getSelector = function getSelector(element) { const getSelector = (element) => {
var selector = element.getAttribute('data-bs-target'); let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, let hrefAttr = 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, // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
// `document.querySelector` will rightfully complain it is invalid. // `document.querySelector` will rightfully complain it is invalid.
// See https://github.com/twbs/bootstrap/issues/32273 // See https://github.com/twbs/bootstrap/issues/32273
@ -98,22 +64,19 @@
return selector; return selector;
}; };
var getElementFromSelector = function getElementFromSelector(element) { const getElementFromSelector = (element) => {
var selector = getSelector(element); const selector = getSelector(element);
return selector ? document.querySelector(selector) : null; return selector ? document.querySelector(selector) : null;
}; };
var getTransitionDurationFromElement = function 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
var _window$getComputedSt = window.getComputedStyle(element), let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
transitionDuration = _window$getComputedSt.transitionDuration, const floatTransitionDuration = Number.parseFloat(transitionDuration);
transitionDelay = _window$getComputedSt.transitionDelay; const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
var floatTransitionDuration = Number.parseFloat(transitionDuration);
var floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) { if (!floatTransitionDuration && !floatTransitionDelay) {
return 0; return 0;
@ -127,14 +90,14 @@
); );
}; };
var triggerTransitionEnd = function triggerTransitionEnd(element) { const triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END)); element.dispatchEvent(new Event(TRANSITION_END));
}; };
var emulateTransitionEnd = function emulateTransitionEnd(element, duration) { const emulateTransitionEnd = (element, duration) => {
var called = false; let called = false;
var durationPadding = 5; const durationPadding = 5;
var emulatedDuration = duration + durationPadding; const emulatedDuration = duration + durationPadding;
function listener() { function listener() {
called = true; called = true;
@ -142,20 +105,33 @@
} }
element.addEventListener(TRANSITION_END, listener); element.addEventListener(TRANSITION_END, listener);
setTimeout(function () { setTimeout(() => {
if (!called) { if (!called) {
triggerTransitionEnd(element); triggerTransitionEnd(element);
} }
}, emulatedDuration); }, emulatedDuration);
}; };
var reflow = function reflow(element) { const isDisabled = (element) => {
return element.offsetHeight; if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true;
}
if (element.classList.contains('disabled')) {
return true;
}
if (typeof element.disabled !== 'undefined') {
return element.disabled;
}
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
}; };
var getjQuery = function getjQuery() { const reflow = (element) => element.offsetHeight;
var _window = window,
jQuery = _window.jQuery; const getjQuery = () => {
const { jQuery } = window;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -164,7 +140,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -172,19 +148,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -192,69 +166,68 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'tab'; const NAME = 'tab';
var DATA_KEY = 'bs.tab'; const DATA_KEY = 'bs.tab';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var DATA_API_KEY = '.data-api'; const DATA_API_KEY = '.data-api';
var EVENT_HIDE = 'hide' + EVENT_KEY; const EVENT_HIDE = `hide${EVENT_KEY}`;
var EVENT_HIDDEN = 'hidden' + EVENT_KEY; const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
var EVENT_SHOW = 'show' + EVENT_KEY; const EVENT_SHOW = `show${EVENT_KEY}`;
var EVENT_SHOWN = 'shown' + EVENT_KEY; const EVENT_SHOWN = `shown${EVENT_KEY}`;
var EVENT_CLICK_DATA_API = 'click' + EVENT_KEY + DATA_API_KEY; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
var CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'; const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
var CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
var CLASS_NAME_DISABLED = 'disabled'; const CLASS_NAME_FADE = 'fade';
var CLASS_NAME_FADE = 'fade'; const CLASS_NAME_SHOW = 'show';
var CLASS_NAME_SHOW = 'show'; const SELECTOR_DROPDOWN = '.dropdown';
var SELECTOR_DROPDOWN = '.dropdown'; const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
var SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'; const SELECTOR_ACTIVE = '.active';
var SELECTOR_ACTIVE = '.active'; const SELECTOR_ACTIVE_UL = ':scope > li > .active';
var SELECTOR_ACTIVE_UL = ':scope > li > .active'; const SELECTOR_DATA_TOGGLE =
var SELECTOR_DATA_TOGGLE =
'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
var SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'; const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
var SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active'; const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Class Definition * Class Definition
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Tab = /*#__PURE__*/ (function (_BaseComponent) { class Tab extends BaseComponent__default['default'] {
_inheritsLoose(Tab, _BaseComponent); // Getters
static get DATA_KEY() {
function Tab() { return DATA_KEY;
return _BaseComponent.apply(this, arguments) || this; } // Public
}
var _proto = Tab.prototype;
// Public
_proto.show = function show() {
var _this = this;
show() {
if ( if (
(this._element.parentNode && (this._element.parentNode &&
this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
this._element.classList.contains(CLASS_NAME_ACTIVE)) || this._element.classList.contains(CLASS_NAME_ACTIVE)) ||
this._element.classList.contains(CLASS_NAME_DISABLED) isDisabled(this._element)
) { ) {
return; return;
} }
var previous; let previous;
var target = getElementFromSelector(this._element); const target = getElementFromSelector(this._element);
var listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP); const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
if (listElement) { if (listElement) {
var itemSelector = const itemSelector =
listElement.nodeName === 'UL' || listElement.nodeName === 'OL' listElement.nodeName === 'UL' || listElement.nodeName === 'OL'
? SELECTOR_ACTIVE_UL ? SELECTOR_ACTIVE_UL
: SELECTOR_ACTIVE; : SELECTOR_ACTIVE;
@ -262,12 +235,12 @@
previous = previous[previous.length - 1]; previous = previous[previous.length - 1];
} }
var hideEvent = previous const hideEvent = previous
? EventHandler__default['default'].trigger(previous, EVENT_HIDE, { ? EventHandler__default['default'].trigger(previous, EVENT_HIDE, {
relatedTarget: this._element, relatedTarget: this._element,
}) })
: null; : null;
var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, { const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
relatedTarget: previous, relatedTarget: previous,
}); });
@ -277,11 +250,11 @@
this._activate(this._element, listElement); this._activate(this._element, listElement);
var complete = function complete() { const complete = () => {
EventHandler__default['default'].trigger(previous, EVENT_HIDDEN, { EventHandler__default['default'].trigger(previous, EVENT_HIDDEN, {
relatedTarget: _this._element, relatedTarget: this._element,
}); });
EventHandler__default['default'].trigger(_this._element, EVENT_SHOWN, { EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
relatedTarget: previous, relatedTarget: previous,
}); });
}; };
@ -291,36 +264,32 @@
} else { } else {
complete(); complete();
} }
}; // Private } // Private
_proto._activate = function _activate(element, container, callback) { _activate(element, container, callback) {
var _this2 = this; const activeElements =
var activeElements =
container && (container.nodeName === 'UL' || container.nodeName === 'OL') container && (container.nodeName === 'UL' || container.nodeName === 'OL')
? SelectorEngine__default['default'].find(SELECTOR_ACTIVE_UL, container) ? SelectorEngine__default['default'].find(SELECTOR_ACTIVE_UL, container)
: SelectorEngine__default['default'].children(container, SELECTOR_ACTIVE); : SelectorEngine__default['default'].children(container, SELECTOR_ACTIVE);
var active = activeElements[0]; const active = activeElements[0];
var isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE); const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE);
var complete = function complete() { const complete = () => this._transitionComplete(element, active, callback);
return _this2._transitionComplete(element, active, callback);
};
if (active && isTransitioning) { if (active && isTransitioning) {
var transitionDuration = getTransitionDurationFromElement(active); const transitionDuration = getTransitionDurationFromElement(active);
active.classList.remove(CLASS_NAME_SHOW); active.classList.remove(CLASS_NAME_SHOW);
EventHandler__default['default'].one(active, 'transitionend', complete); EventHandler__default['default'].one(active, 'transitionend', complete);
emulateTransitionEnd(active, transitionDuration); emulateTransitionEnd(active, transitionDuration);
} else { } else {
complete(); complete();
} }
}; }
_proto._transitionComplete = function _transitionComplete(element, active, callback) { _transitionComplete(element, active, callback) {
if (active) { if (active) {
active.classList.remove(CLASS_NAME_ACTIVE); active.classList.remove(CLASS_NAME_ACTIVE);
var dropdownChild = SelectorEngine__default['default'].findOne( const dropdownChild = SelectorEngine__default['default'].findOne(
SELECTOR_DROPDOWN_ACTIVE_CHILD, SELECTOR_DROPDOWN_ACTIVE_CHILD,
active.parentNode active.parentNode
); );
@ -347,14 +316,12 @@
} }
if (element.parentNode && element.parentNode.classList.contains(CLASS_NAME_DROPDOWN_MENU)) { if (element.parentNode && element.parentNode.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
var dropdownElement = element.closest(SELECTOR_DROPDOWN); const dropdownElement = element.closest(SELECTOR_DROPDOWN);
if (dropdownElement) { if (dropdownElement) {
SelectorEngine__default['default'] SelectorEngine__default['default']
.find(SELECTOR_DROPDOWN_TOGGLE) .find(SELECTOR_DROPDOWN_TOGGLE)
.forEach(function (dropdown) { .forEach((dropdown) => dropdown.classList.add(CLASS_NAME_ACTIVE));
return dropdown.classList.add(CLASS_NAME_ACTIVE);
});
} }
element.setAttribute('aria-expanded', true); element.setAttribute('aria-expanded', true);
@ -363,34 +330,22 @@
if (callback) { if (callback) {
callback(); callback();
} }
}; // Static } // Static
Tab.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
var data = Data__default['default'].getData(this, DATA_KEY) || new Tab(this); const data = Data__default['default'].get(this, DATA_KEY) || new Tab(this);
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]();
} }
}); });
}; }
}
_createClass(Tab, null, [
{
key: 'DATA_KEY',
// Getters
get: function get() {
return DATA_KEY;
},
},
]);
return Tab;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Data Api implementation * Data Api implementation
@ -403,7 +358,7 @@
SELECTOR_DATA_TOGGLE, SELECTOR_DATA_TOGGLE,
function (event) { function (event) {
event.preventDefault(); event.preventDefault();
var data = Data__default['default'].getData(this, DATA_KEY) || new Tab(this); const data = Data__default['default'].get(this, DATA_KEY) || new Tab(this);
data.show(); data.show();
} }
); );

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/*! /*!
* Bootstrap toast.js v5.0.0-beta2 (https://getbootstrap.com/) * Bootstrap toast.js v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Copyright 2011-2021 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)
*/ */
@ -32,72 +32,18 @@
var Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator); var Manipulator__default = /*#__PURE__*/ _interopDefaultLegacy(Manipulator);
var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent); var BaseComponent__default = /*#__PURE__*/ _interopDefaultLegacy(BaseComponent);
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ('value' in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _extends() {
_extends =
Object.assign ||
function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf =
Object.setPrototypeOf ||
function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
var MILLISECONDS_MULTIPLIER = 1000; const MILLISECONDS_MULTIPLIER = 1000;
var TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp) const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
var toType = function toType(obj) { const toType = (obj) => {
if (obj === null || obj === undefined) { if (obj === null || obj === undefined) {
return '' + obj; return `${obj}`;
} }
return {}.toString return {}.toString
@ -106,17 +52,14 @@
.toLowerCase(); .toLowerCase();
}; };
var getTransitionDurationFromElement = function 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
var _window$getComputedSt = window.getComputedStyle(element), let { transitionDuration, transitionDelay } = window.getComputedStyle(element);
transitionDuration = _window$getComputedSt.transitionDuration, const floatTransitionDuration = Number.parseFloat(transitionDuration);
transitionDelay = _window$getComputedSt.transitionDelay; const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
var floatTransitionDuration = Number.parseFloat(transitionDuration);
var floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
if (!floatTransitionDuration && !floatTransitionDelay) { if (!floatTransitionDuration && !floatTransitionDelay) {
return 0; return 0;
@ -130,18 +73,16 @@
); );
}; };
var triggerTransitionEnd = function triggerTransitionEnd(element) { const triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END)); element.dispatchEvent(new Event(TRANSITION_END));
}; };
var isElement = function isElement(obj) { const isElement = (obj) => (obj[0] || obj).nodeType;
return (obj[0] || obj).nodeType;
};
var emulateTransitionEnd = function emulateTransitionEnd(element, duration) { const emulateTransitionEnd = (element, duration) => {
var called = false; let called = false;
var durationPadding = 5; const durationPadding = 5;
var emulatedDuration = duration + durationPadding; const emulatedDuration = duration + durationPadding;
function listener() { function listener() {
called = true; called = true;
@ -149,37 +90,33 @@
} }
element.addEventListener(TRANSITION_END, listener); element.addEventListener(TRANSITION_END, listener);
setTimeout(function () { setTimeout(() => {
if (!called) { if (!called) {
triggerTransitionEnd(element); triggerTransitionEnd(element);
} }
}, emulatedDuration); }, emulatedDuration);
}; };
var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) { const typeCheckConfig = (componentName, config, configTypes) => {
Object.keys(configTypes).forEach(function (property) { Object.keys(configTypes).forEach((property) => {
var expectedTypes = configTypes[property]; const expectedTypes = configTypes[property];
var value = config[property]; const value = config[property];
var valueType = value && isElement(value) ? 'element' : toType(value); const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError( throw new TypeError(
componentName.toUpperCase() + `${componentName.toUpperCase()}: ` +
': ' + `Option "${property}" provided type "${valueType}" ` +
('Option "' + property + '" provided type "' + valueType + '" ') + `but expected type "${expectedTypes}".`
('but expected type "' + expectedTypes + '".')
); );
} }
}); });
}; };
var reflow = function reflow(element) { const reflow = (element) => element.offsetHeight;
return element.offsetHeight;
};
var getjQuery = function getjQuery() { const getjQuery = () => {
var _window = window, const { jQuery } = window;
jQuery = _window.jQuery;
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
return jQuery; return jQuery;
@ -188,7 +125,7 @@
return null; return null;
}; };
var onDOMContentLoaded = function onDOMContentLoaded(callback) { const onDOMContentLoaded = (callback) => {
if (document.readyState === 'loading') { if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', callback); document.addEventListener('DOMContentLoaded', callback);
} else { } else {
@ -196,19 +133,17 @@
} }
}; };
document.documentElement.dir === 'rtl'; const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => {
var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) { const $ = getjQuery();
onDOMContentLoaded(function () {
var $ = getjQuery();
/* istanbul ignore if */ /* istanbul ignore if */
if ($) { if ($) {
var 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 = function () { $.fn[name].noConflict = () => {
$.fn[name] = JQUERY_NO_CONFLICT; $.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface; return plugin.jQueryInterface;
}; };
@ -216,63 +151,70 @@
}); });
}; };
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Constants * Constants
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var NAME = 'toast'; const NAME = 'toast';
var DATA_KEY = 'bs.toast'; const DATA_KEY = 'bs.toast';
var EVENT_KEY = '.' + DATA_KEY; const EVENT_KEY = `.${DATA_KEY}`;
var EVENT_CLICK_DISMISS = 'click.dismiss' + EVENT_KEY; const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
var EVENT_HIDE = 'hide' + EVENT_KEY; const EVENT_HIDE = `hide${EVENT_KEY}`;
var EVENT_HIDDEN = 'hidden' + EVENT_KEY; const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
var EVENT_SHOW = 'show' + EVENT_KEY; const EVENT_SHOW = `show${EVENT_KEY}`;
var EVENT_SHOWN = 'shown' + EVENT_KEY; const EVENT_SHOWN = `shown${EVENT_KEY}`;
var CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
var CLASS_NAME_HIDE = 'hide'; const CLASS_NAME_HIDE = 'hide';
var CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
var CLASS_NAME_SHOWING = 'showing'; const CLASS_NAME_SHOWING = 'showing';
var DefaultType = { const DefaultType = {
animation: 'boolean', animation: 'boolean',
autohide: 'boolean', autohide: 'boolean',
delay: 'number', delay: 'number',
}; };
var Default = { const Default = {
animation: true, animation: true,
autohide: true, autohide: true,
delay: 5000, delay: 5000,
}; };
var SELECTOR_DATA_DISMISS = '[data-bs-dismiss="toast"]'; const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="toast"]';
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* Class Definition * Class Definition
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
var Toast = /*#__PURE__*/ (function (_BaseComponent) { class Toast extends BaseComponent__default['default'] {
_inheritsLoose(Toast, _BaseComponent); constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._timeout = null;
function Toast(element, config) { this._setListeners();
var _this;
_this = _BaseComponent.call(this, element) || this;
_this._config = _this._getConfig(config);
_this._timeout = null;
_this._setListeners();
return _this;
} // Getters } // Getters
var _proto = Toast.prototype; static get DefaultType() {
return DefaultType;
}
// Public static get Default() {
_proto.show = function show() { return Default;
var _this2 = this; }
var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW); static get DATA_KEY() {
return DATA_KEY;
} // Public
show() {
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
if (showEvent.defaultPrevented) { if (showEvent.defaultPrevented) {
return; return;
@ -284,17 +226,17 @@
this._element.classList.add(CLASS_NAME_FADE); this._element.classList.add(CLASS_NAME_FADE);
} }
var complete = function complete() { const complete = () => {
_this2._element.classList.remove(CLASS_NAME_SHOWING); this._element.classList.remove(CLASS_NAME_SHOWING);
_this2._element.classList.add(CLASS_NAME_SHOW); this._element.classList.add(CLASS_NAME_SHOW);
EventHandler__default['default'].trigger(_this2._element, EVENT_SHOWN); EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
if (_this2._config.autohide) { if (this._config.autohide) {
_this2._timeout = setTimeout(function () { this._timeout = setTimeout(() => {
_this2.hide(); this.hide();
}, _this2._config.delay); }, this._config.delay);
} }
}; };
@ -305,45 +247,43 @@
this._element.classList.add(CLASS_NAME_SHOWING); this._element.classList.add(CLASS_NAME_SHOWING);
if (this._config.animation) { if (this._config.animation) {
var transitionDuration = getTransitionDurationFromElement(this._element); const transitionDuration = getTransitionDurationFromElement(this._element);
EventHandler__default['default'].one(this._element, 'transitionend', complete); EventHandler__default['default'].one(this._element, 'transitionend', complete);
emulateTransitionEnd(this._element, transitionDuration); emulateTransitionEnd(this._element, transitionDuration);
} else { } else {
complete(); complete();
} }
}; }
_proto.hide = function hide() {
var _this3 = this;
hide() {
if (!this._element.classList.contains(CLASS_NAME_SHOW)) { if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
return; return;
} }
var hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE); const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
return; return;
} }
var complete = function complete() { const complete = () => {
_this3._element.classList.add(CLASS_NAME_HIDE); this._element.classList.add(CLASS_NAME_HIDE);
EventHandler__default['default'].trigger(_this3._element, EVENT_HIDDEN); EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
}; };
this._element.classList.remove(CLASS_NAME_SHOW); this._element.classList.remove(CLASS_NAME_SHOW);
if (this._config.animation) { if (this._config.animation) {
var transitionDuration = getTransitionDurationFromElement(this._element); const transitionDuration = getTransitionDurationFromElement(this._element);
EventHandler__default['default'].one(this._element, 'transitionend', complete); EventHandler__default['default'].one(this._element, 'transitionend', complete);
emulateTransitionEnd(this._element, transitionDuration); emulateTransitionEnd(this._element, transitionDuration);
} else { } else {
complete(); complete();
} }
}; }
_proto.dispose = function dispose() { dispose() {
this._clearTimeout(); this._clearTimeout();
if (this._element.classList.contains(CLASS_NAME_SHOW)) { if (this._element.classList.contains(CLASS_NAME_SHOW)) {
@ -351,46 +291,39 @@
} }
EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS); EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS);
super.dispose();
_BaseComponent.prototype.dispose.call(this);
this._config = null; this._config = null;
}; // Private } // Private
_proto._getConfig = function _getConfig(config) { _getConfig(config) {
config = _extends( config = {
{}, ...Default,
Default, ...Manipulator__default['default'].getDataAttributes(this._element),
Manipulator__default['default'].getDataAttributes(this._element), ...(typeof config === 'object' && config ? config : {}),
typeof config === 'object' && config ? config : {} };
);
typeCheckConfig(NAME, config, this.constructor.DefaultType); typeCheckConfig(NAME, config, this.constructor.DefaultType);
return config; return config;
}; }
_proto._setListeners = function _setListeners() {
var _this4 = this;
_setListeners() {
EventHandler__default['default'].on( EventHandler__default['default'].on(
this._element, this._element,
EVENT_CLICK_DISMISS, EVENT_CLICK_DISMISS,
SELECTOR_DATA_DISMISS, SELECTOR_DATA_DISMISS,
function () { () => this.hide()
return _this4.hide();
}
); );
}; }
_proto._clearTimeout = function _clearTimeout() { _clearTimeout() {
clearTimeout(this._timeout); clearTimeout(this._timeout);
this._timeout = null; this._timeout = null;
}; // Static } // Static
Toast.jQueryInterface = function jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
var data = Data__default['default'].getData(this, DATA_KEY); let data = Data__default['default'].get(this, DATA_KEY);
var _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data) { if (!data) {
data = new Toast(this, _config); data = new Toast(this, _config);
@ -398,37 +331,14 @@
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);
} }
}); });
}; }
}
_createClass(Toast, null, [
{
key: 'DefaultType',
get: function get() {
return DefaultType;
},
},
{
key: 'Default',
get: function get() {
return Default;
},
},
{
key: 'DATA_KEY',
get: function get() {
return DATA_KEY;
},
},
]);
return Toast;
})(BaseComponent__default['default']);
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
* jQuery * jQuery

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): alert.js * Bootstrap (v5.0.0-beta3): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -98,7 +98,7 @@ class Alert extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
if (!data) { if (!data) {
data = new Alert(this); data = new Alert(this);
@ -126,6 +126,7 @@ class Alert extends BaseComponent {
* Data Api implementation * Data Api implementation
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert())); EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()));
/** /**

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): base-component.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -13,27 +13,29 @@ import Data from './dom/data';
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const VERSION = '5.0.0-beta2'; const VERSION = '5.0.0-beta3';
class BaseComponent { class BaseComponent {
constructor(element) { constructor(element) {
element = typeof element === 'string' ? document.querySelector(element) : element;
if (!element) { if (!element) {
return; return;
} }
this._element = element; this._element = element;
Data.setData(element, this.constructor.DATA_KEY, this); Data.set(this._element, this.constructor.DATA_KEY, this);
} }
dispose() { dispose() {
Data.removeData(this._element, this.constructor.DATA_KEY); Data.remove(this._element, this.constructor.DATA_KEY);
this._element = null; this._element = null;
} }
/** Static */ /** Static */
static getInstance(element) { static getInstance(element) {
return Data.getData(element, this.DATA_KEY); return Data.get(element, this.DATA_KEY);
} }
static get VERSION() { static get VERSION() {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): button.js * Bootstrap (v5.0.0-beta3): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -51,7 +51,7 @@ class Button extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
if (!data) { if (!data) {
data = new Button(this); data = new Button(this);
@ -75,7 +75,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) =>
const button = event.target.closest(SELECTOR_DATA_TOGGLE); const button = event.target.closest(SELECTOR_DATA_TOGGLE);
let data = Data.getData(button, DATA_KEY); let data = Data.get(button, DATA_KEY);
if (!data) { if (!data) {
data = new Button(button); data = new Button(button);
} }

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): carousel.js * Bootstrap (v5.0.0-beta3): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -10,8 +10,8 @@ import {
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
isVisible,
isRTL, isRTL,
isVisible,
reflow, reflow,
triggerTransitionEnd, triggerTransitionEnd,
typeCheckConfig, typeCheckConfig,
@ -56,8 +56,8 @@ const DefaultType = {
touch: 'boolean', touch: 'boolean',
}; };
const DIRECTION_NEXT = 'next'; const ORDER_NEXT = 'next';
const DIRECTION_PREV = 'prev'; const ORDER_PREV = 'prev';
const DIRECTION_LEFT = 'left'; const DIRECTION_LEFT = 'left';
const DIRECTION_RIGHT = 'right'; const DIRECTION_RIGHT = 'right';
@ -138,7 +138,7 @@ class Carousel extends BaseComponent {
next() { next() {
if (!this._isSliding) { if (!this._isSliding) {
this._slide(DIRECTION_NEXT); this._slide(ORDER_NEXT);
} }
} }
@ -152,7 +152,7 @@ class Carousel extends BaseComponent {
prev() { prev() {
if (!this._isSliding) { if (!this._isSliding) {
this._slide(DIRECTION_PREV); this._slide(ORDER_PREV);
} }
} }
@ -209,13 +209,12 @@ class Carousel extends BaseComponent {
return; return;
} }
const direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV; const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
this._slide(direction, this._items[index]); this._slide(order, this._items[index]);
} }
dispose() { dispose() {
super.dispose();
EventHandler.off(this._element, EVENT_KEY); EventHandler.off(this._element, EVENT_KEY);
this._items = null; this._items = null;
@ -225,6 +224,8 @@ class Carousel extends BaseComponent {
this._isSliding = null; this._isSliding = null;
this._activeElement = null; this._activeElement = null;
this._indicatorsElement = null; this._indicatorsElement = null;
super.dispose();
} }
// Private // Private
@ -249,23 +250,11 @@ class Carousel extends BaseComponent {
this.touchDeltaX = 0; this.touchDeltaX = 0;
// swipe left if (!direction) {
if (direction > 0) { return;
if (isRTL) {
this.next();
} else {
this.prev();
}
} }
// swipe right this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);
if (direction < 0) {
if (isRTL) {
this.prev();
} else {
this.next();
}
}
} }
_addEventListeners() { _addEventListeners() {
@ -297,11 +286,8 @@ class Carousel extends BaseComponent {
const move = (event) => { const move = (event) => {
// ensure swiping with one touch and not pinching // ensure swiping with one touch and not pinching
if (event.touches && event.touches.length > 1) { this.touchDeltaX =
this.touchDeltaX = 0; event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;
} else {
this.touchDeltaX = event.touches[0].clientX - this.touchStartX;
}
}; };
const end = (event) => { const end = (event) => {
@ -357,18 +343,10 @@ class Carousel extends BaseComponent {
if (event.key === ARROW_LEFT_KEY) { if (event.key === ARROW_LEFT_KEY) {
event.preventDefault(); event.preventDefault();
if (isRTL) { this._slide(DIRECTION_LEFT);
this.next();
} else {
this.prev();
}
} else if (event.key === ARROW_RIGHT_KEY) { } else if (event.key === ARROW_RIGHT_KEY) {
event.preventDefault(); event.preventDefault();
if (isRTL) { this._slide(DIRECTION_RIGHT);
this.prev();
} else {
this.next();
}
} }
} }
@ -379,19 +357,19 @@ class Carousel extends BaseComponent {
return this._items.indexOf(element); return this._items.indexOf(element);
} }
_getItemByDirection(direction, activeElement) { _getItemByOrder(order, activeElement) {
const isNextDirection = direction === DIRECTION_NEXT; const isNext = order === ORDER_NEXT;
const isPrevDirection = direction === DIRECTION_PREV; const isPrev = order === ORDER_PREV;
const activeIndex = this._getItemIndex(activeElement); const activeIndex = this._getItemIndex(activeElement);
const lastItemIndex = this._items.length - 1; const lastItemIndex = this._items.length - 1;
const isGoingToWrap = const isGoingToWrap =
(isPrevDirection && activeIndex === 0) || (isNextDirection && activeIndex === lastItemIndex); (isPrev && activeIndex === 0) || (isNext && activeIndex === lastItemIndex);
if (isGoingToWrap && !this._config.wrap) { if (isGoingToWrap && !this._config.wrap) {
return activeElement; return activeElement;
} }
const delta = direction === DIRECTION_PREV ? -1 : 1; const delta = isPrev ? -1 : 1;
const itemIndex = (activeIndex + delta) % this._items.length; const itemIndex = (activeIndex + delta) % this._items.length;
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
@ -451,18 +429,19 @@ class Carousel extends BaseComponent {
} }
} }
_slide(direction, element) { _slide(directionOrOrder, element) {
const order = this._directionToOrder(directionOrOrder);
const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
const activeElementIndex = this._getItemIndex(activeElement); const activeElementIndex = this._getItemIndex(activeElement);
const nextElement = const nextElement = element || this._getItemByOrder(order, activeElement);
element || (activeElement && this._getItemByDirection(direction, activeElement));
const nextElementIndex = this._getItemIndex(nextElement); const nextElementIndex = this._getItemIndex(nextElement);
const isCycling = Boolean(this._interval); const isCycling = Boolean(this._interval);
const directionalClassName = direction === DIRECTION_NEXT ? CLASS_NAME_START : CLASS_NAME_END; const isNext = order === ORDER_NEXT;
const orderClassName = direction === DIRECTION_NEXT ? CLASS_NAME_NEXT : CLASS_NAME_PREV; const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
const eventDirectionName = direction === DIRECTION_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT; const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
const eventDirectionName = this._orderToDirection(order);
if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) { if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
this._isSliding = false; this._isSliding = false;
@ -535,10 +514,34 @@ class Carousel extends BaseComponent {
} }
} }
_directionToOrder(direction) {
if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
return direction;
}
if (isRTL()) {
return direction === DIRECTION_RIGHT ? ORDER_PREV : ORDER_NEXT;
}
return direction === DIRECTION_RIGHT ? ORDER_NEXT : ORDER_PREV;
}
_orderToDirection(order) {
if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
return order;
}
if (isRTL()) {
return order === ORDER_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT;
}
return order === ORDER_NEXT ? DIRECTION_RIGHT : DIRECTION_LEFT;
}
// Static // Static
static carouselInterface(element, config) { static carouselInterface(element, config) {
let data = Data.getData(element, DATA_KEY); let data = Data.get(element, DATA_KEY);
let _config = { let _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(element), ...Manipulator.getDataAttributes(element),
@ -597,7 +600,7 @@ class Carousel extends BaseComponent {
Carousel.carouselInterface(target, config); Carousel.carouselInterface(target, config);
if (slideIndex) { if (slideIndex) {
Data.getData(target, DATA_KEY).to(slideIndex); Data.get(target, DATA_KEY).to(slideIndex);
} }
event.preventDefault(); event.preventDefault();
@ -616,7 +619,7 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
for (let i = 0, len = carousels.length; i < len; i++) { for (let i = 0, len = carousels.length; i < len; i++) {
Carousel.carouselInterface(carousels[i], Data.getData(carousels[i], DATA_KEY)); Carousel.carouselInterface(carousels[i], Data.get(carousels[i], DATA_KEY));
} }
}); });

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): collapse.js * Bootstrap (v5.0.0-beta3): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -72,8 +72,8 @@ class Collapse extends BaseComponent {
this._isTransitioning = false; this._isTransitioning = false;
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._triggerArray = SelectorEngine.find( this._triggerArray = SelectorEngine.find(
`${SELECTOR_DATA_TOGGLE}[href="#${element.id}"],` + `${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` +
`${SELECTOR_DATA_TOGGLE}[data-mdb-target="#${element.id}"]` `${SELECTOR_DATA_TOGGLE}[data-mdb-target="#${this._element.id}"]`
); );
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE); const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
@ -82,7 +82,7 @@ class Collapse extends BaseComponent {
const elem = toggleList[i]; const elem = toggleList[i];
const selector = getSelectorFromElement(elem); const selector = getSelectorFromElement(elem);
const filterElement = SelectorEngine.find(selector).filter( const filterElement = SelectorEngine.find(selector).filter(
(foundElem) => foundElem === element (foundElem) => foundElem === this._element
); );
if (selector !== null && filterElement.length) { if (selector !== null && filterElement.length) {
@ -147,7 +147,7 @@ class Collapse extends BaseComponent {
const container = SelectorEngine.findOne(this._selector); const container = SelectorEngine.findOne(this._selector);
if (actives) { if (actives) {
const tempActiveData = actives.find((elem) => container !== elem); const tempActiveData = actives.find((elem) => container !== elem);
activesData = tempActiveData ? Data.getData(tempActiveData, DATA_KEY) : null; activesData = tempActiveData ? Data.get(tempActiveData, DATA_KEY) : null;
if (activesData && activesData._isTransitioning) { if (activesData && activesData._isTransitioning) {
return; return;
@ -166,7 +166,7 @@ class Collapse extends BaseComponent {
} }
if (!activesData) { if (!activesData) {
Data.setData(elemActive, DATA_KEY, null); Data.set(elemActive, DATA_KEY, null);
} }
}); });
} }
@ -328,7 +328,7 @@ class Collapse extends BaseComponent {
// Static // Static
static collapseInterface(element, config) { static collapseInterface(element, config) {
let data = Data.getData(element, DATA_KEY); let data = Data.get(element, DATA_KEY);
const _config = { const _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(element), ...Manipulator.getDataAttributes(element),
@ -379,7 +379,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
const selectorElements = SelectorEngine.find(selector); const selectorElements = SelectorEngine.find(selector);
selectorElements.forEach((element) => { selectorElements.forEach((element) => {
const data = Data.getData(element, DATA_KEY); const data = Data.get(element, DATA_KEY);
let config; let config;
if (data) { if (data) {
// update parent attribute // update parent attribute

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/data.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -11,57 +11,51 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const mapData = (() => { const elementMap = new Map();
const storeData = {};
let id = 1; export default {
return { set(element, key, instance) {
set(element, key, data) { if (!elementMap.has(element)) {
if (typeof element.bsKey === 'undefined') { elementMap.set(element, new Map());
element.bsKey = {
key,
id,
};
id++;
} }
storeData[element.bsKey.id] = data; const instanceMap = elementMap.get(element);
},
get(element, key) {
if (!element || typeof element.bsKey === 'undefined') {
return null;
}
const keyProperties = element.bsKey; // make it clear we only want one instance per element
if (keyProperties.key === key) { // can be removed later when multiple key/instances are fine to be used
return storeData[keyProperties.id]; if (!instanceMap.has(key) && instanceMap.size !== 0) {
} // eslint-disable-next-line no-console
console.error(
return null; `Bootstrap doesn't allow more than one instance per element. Bound instance: ${
}, Array.from(instanceMap.keys())[0]
delete(element, key) { }.`
if (typeof element.bsKey === 'undefined') { );
return; return;
} }
const keyProperties = element.bsKey; instanceMap.set(key, instance);
if (keyProperties.key === key) { },
delete storeData[keyProperties.id];
delete element.bsKey; get(element, key) {
if (elementMap.has(element)) {
return elementMap.get(element).get(key) || null;
}
return null;
},
remove(element, key) {
if (!elementMap.has(element)) {
return;
}
const instanceMap = elementMap.get(element);
instanceMap.delete(key);
// free up element references if there are no instances left for an element
if (instanceMap.size === 0) {
elementMap.delete(element);
} }
}, },
}; };
})();
const Data = {
setData(instance, key, data) {
mapData.set(instance, key, data);
},
getData(instance, key) {
return mapData.get(instance, key);
},
removeData(instance, key) {
mapData.delete(instance, key);
},
};
export default Data;

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/event-handler.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -112,6 +112,7 @@ function bootstrapDelegationHandler(element, selector, fn) {
event.delegateTarget = target; event.delegateTarget = target;
if (handler.oneOff) { if (handler.oneOff) {
// eslint-disable-next-line unicorn/consistent-destructuring
EventHandler.off(element, event.type, fn); EventHandler.off(element, event.type, fn);
} }

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/manipulator.js * Bootstrap (v5.0.0-beta3): 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,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/selector-engine.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -14,10 +14,6 @@
const NODE_TEXT = 3; const NODE_TEXT = 3;
const SelectorEngine = { const SelectorEngine = {
matches(element, selector) {
return element.matches(selector);
},
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));
}, },
@ -27,9 +23,7 @@ const SelectorEngine = {
}, },
children(element, selector) { children(element, selector) {
const children = [].concat(...element.children); return [].concat(...element.children).filter((child) => child.matches(selector));
return children.filter((child) => child.matches(selector));
}, },
parents(element, selector) { parents(element, selector) {
@ -38,7 +32,7 @@ const SelectorEngine = {
let ancestor = element.parentNode; let ancestor = element.parentNode;
while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
if (this.matches(ancestor, selector)) { if (ancestor.matches(selector)) {
parents.push(ancestor); parents.push(ancestor);
} }
@ -66,7 +60,7 @@ const SelectorEngine = {
let next = element.nextElementSibling; let next = element.nextElementSibling;
while (next) { while (next) {
if (this.matches(next, selector)) { if (next.matches(selector)) {
return [next]; return [next];
} }

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dropdown.js * Bootstrap (v5.0.0-beta3): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -59,21 +59,19 @@ const CLASS_NAME_DROPSTART = 'dropstart';
const CLASS_NAME_NAVBAR = 'navbar'; const CLASS_NAME_NAVBAR = 'navbar';
const SELECTOR_DATA_TOGGLE = '[data-mdb-toggle="dropdown"]'; const SELECTOR_DATA_TOGGLE = '[data-mdb-toggle="dropdown"]';
const SELECTOR_FORM_CHILD = '.dropdown form';
const SELECTOR_MENU = '.dropdown-menu'; const SELECTOR_MENU = '.dropdown-menu';
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 = isRTL ? 'top-end' : 'top-start'; const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
const PLACEMENT_TOPEND = isRTL ? 'top-start' : 'top-end'; const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
const PLACEMENT_BOTTOM = isRTL ? 'bottom-end' : 'bottom-start'; const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
const PLACEMENT_BOTTOMEND = isRTL ? 'bottom-start' : 'bottom-end'; const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
const PLACEMENT_RIGHT = isRTL ? 'left-start' : 'right-start'; const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
const PLACEMENT_LEFT = isRTL ? 'right-start' : 'left-start'; const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
const Default = { const Default = {
offset: [0, 2], offset: [0, 2],
flip: true,
boundary: 'clippingParents', boundary: 'clippingParents',
reference: 'toggle', reference: 'toggle',
display: 'dynamic', display: 'dynamic',
@ -82,7 +80,6 @@ const Default = {
const DefaultType = { const DefaultType = {
offset: '(array|string|function)', offset: '(array|string|function)',
flip: 'boolean',
boundary: '(string|element)', boundary: '(string|element)',
reference: '(string|element|object)', reference: '(string|element|object)',
display: 'string', display: 'string',
@ -242,7 +239,6 @@ class Dropdown extends BaseComponent {
} }
dispose() { dispose() {
super.dispose();
EventHandler.off(this._element, EVENT_KEY); EventHandler.off(this._element, EVENT_KEY);
this._menu = null; this._menu = null;
@ -250,6 +246,8 @@ class Dropdown extends BaseComponent {
this._popper.destroy(); this._popper.destroy();
this._popper = null; this._popper = null;
} }
super.dispose();
} }
update() { update() {
@ -264,7 +262,6 @@ class Dropdown extends BaseComponent {
_addEventListeners() { _addEventListeners() {
EventHandler.on(this._element, EVENT_CLICK, (event) => { EventHandler.on(this._element, EVENT_CLICK, (event) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation();
this.toggle(); this.toggle();
}); });
} }
@ -342,7 +339,6 @@ class Dropdown extends BaseComponent {
{ {
name: 'preventOverflow', name: 'preventOverflow',
options: { options: {
altBoundary: this._config.flip,
boundary: this._config.boundary, boundary: this._config.boundary,
}, },
}, },
@ -376,7 +372,7 @@ class Dropdown extends BaseComponent {
// Static // Static
static dropdownInterface(element, config) { static dropdownInterface(element, config) {
let data = Data.getData(element, DATA_KEY); let data = Data.get(element, DATA_KEY);
const _config = typeof config === 'object' ? config : null; const _config = typeof config === 'object' ? config : null;
if (!data) { if (!data) {
@ -399,17 +395,23 @@ class Dropdown extends BaseComponent {
} }
static clearMenus(event) { static clearMenus(event) {
if (event) {
if ( if (
event && event.button === RIGHT_MOUSE_BUTTON ||
(event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) (event.type === 'keyup' && event.key !== TAB_KEY)
) { ) {
return; return;
} }
if (/input|select|textarea|form/i.test(event.target.tagName)) {
return;
}
}
const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE); const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
for (let i = 0, len = toggles.length; i < len; i++) { for (let i = 0, len = toggles.length; i < len; i++) {
const context = Data.getData(toggles[i], DATA_KEY); const context = Data.get(toggles[i], DATA_KEY);
const relatedTarget = { const relatedTarget = {
relatedTarget: toggles[i], relatedTarget: toggles[i],
}; };
@ -427,14 +429,21 @@ class Dropdown extends BaseComponent {
continue; continue;
} }
if (event) {
// Don't close the menu if the clicked element or one of its parents is the dropdown button
if ([context._element].some((element) => event.composedPath().includes(element))) {
continue;
}
// Tab navigation through the dropdown menu shouldn't close the menu
if ( if (
event && event.type === 'keyup' &&
((event.type === 'click' && /input|textarea/i.test(event.target.tagName)) || event.key === TAB_KEY &&
(event.type === 'keyup' && event.key === TAB_KEY)) &&
dropdownMenu.contains(event.target) dropdownMenu.contains(event.target)
) { ) {
continue; continue;
} }
}
const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE, relatedTarget); const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE, relatedTarget);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
@ -559,10 +568,8 @@ 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();
event.stopPropagation(); Dropdown.dropdownInterface(this);
Dropdown.dropdownInterface(this, 'toggle');
}); });
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, (e) => e.stopPropagation());
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): modal.js * Bootstrap (v5.0.0-beta3): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -83,7 +83,7 @@ class Modal extends BaseComponent {
super(element); super(element);
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, element); this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
this._backdrop = null; this._backdrop = null;
this._isShown = false; this._isShown = false;
this._isBodyOverflowing = false; this._isBodyOverflowing = false;
@ -113,7 +113,7 @@ class Modal extends BaseComponent {
return; return;
} }
if (this._element.classList.contains(CLASS_NAME_FADE)) { if (this._isAnimated()) {
this._isTransitioning = true; this._isTransitioning = true;
} }
@ -166,9 +166,9 @@ class Modal extends BaseComponent {
} }
this._isShown = false; this._isShown = false;
const transition = this._element.classList.contains(CLASS_NAME_FADE); const isAnimated = this._isAnimated();
if (transition) { if (isAnimated) {
this._isTransitioning = true; this._isTransitioning = true;
} }
@ -182,7 +182,7 @@ class Modal extends BaseComponent {
EventHandler.off(this._element, EVENT_CLICK_DISMISS); EventHandler.off(this._element, EVENT_CLICK_DISMISS);
EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS); EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
if (transition) { if (isAnimated) {
const transitionDuration = getTransitionDurationFromElement(this._element); const transitionDuration = getTransitionDurationFromElement(this._element);
EventHandler.one(this._element, 'transitionend', (event) => this._hideModal(event)); EventHandler.one(this._element, 'transitionend', (event) => this._hideModal(event));
@ -233,7 +233,7 @@ class Modal extends BaseComponent {
} }
_showElement(relatedTarget) { _showElement(relatedTarget) {
const transition = this._element.classList.contains(CLASS_NAME_FADE); const isAnimated = this._isAnimated();
const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
@ -251,7 +251,7 @@ class Modal extends BaseComponent {
modalBody.scrollTop = 0; modalBody.scrollTop = 0;
} }
if (transition) { if (isAnimated) {
reflow(this._element); reflow(this._element);
} }
@ -272,7 +272,7 @@ class Modal extends BaseComponent {
}); });
}; };
if (transition) { if (isAnimated) {
const transitionDuration = getTransitionDurationFromElement(this._dialog); const transitionDuration = getTransitionDurationFromElement(this._dialog);
EventHandler.one(this._dialog, 'transitionend', transitionComplete); EventHandler.one(this._dialog, 'transitionend', transitionComplete);
@ -338,14 +338,13 @@ class Modal extends BaseComponent {
} }
_showBackdrop(callback) { _showBackdrop(callback) {
const animate = this._element.classList.contains(CLASS_NAME_FADE) ? CLASS_NAME_FADE : ''; const isAnimated = this._isAnimated();
if (this._isShown && this._config.backdrop) { if (this._isShown && this._config.backdrop) {
this._backdrop = document.createElement('div'); this._backdrop = document.createElement('div');
this._backdrop.className = CLASS_NAME_BACKDROP; this._backdrop.className = CLASS_NAME_BACKDROP;
if (animate) { if (isAnimated) {
this._backdrop.classList.add(animate); this._backdrop.classList.add(CLASS_NAME_FADE);
} }
document.body.appendChild(this._backdrop); document.body.appendChild(this._backdrop);
@ -367,13 +366,13 @@ class Modal extends BaseComponent {
} }
}); });
if (animate) { if (isAnimated) {
reflow(this._backdrop); reflow(this._backdrop);
} }
this._backdrop.classList.add(CLASS_NAME_SHOW); this._backdrop.classList.add(CLASS_NAME_SHOW);
if (!animate) { if (!isAnimated) {
callback(); callback();
return; return;
} }
@ -390,7 +389,7 @@ class Modal extends BaseComponent {
callback(); callback();
}; };
if (this._element.classList.contains(CLASS_NAME_FADE)) { if (isAnimated) {
const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop); const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop);
EventHandler.one(this._backdrop, 'transitionend', callbackRemove); EventHandler.one(this._backdrop, 'transitionend', callbackRemove);
emulateTransitionEnd(this._backdrop, backdropTransitionDuration); emulateTransitionEnd(this._backdrop, backdropTransitionDuration);
@ -402,6 +401,10 @@ class Modal extends BaseComponent {
} }
} }
_isAnimated() {
return this._element.classList.contains(CLASS_NAME_FADE);
}
_triggerBackdropTransition() { _triggerBackdropTransition() {
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
@ -438,15 +441,15 @@ class Modal extends BaseComponent {
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
if ( if (
(!this._isBodyOverflowing && isModalOverflowing && !isRTL) || (!this._isBodyOverflowing && isModalOverflowing && !isRTL()) ||
(this._isBodyOverflowing && !isModalOverflowing && isRTL) (this._isBodyOverflowing && !isModalOverflowing && isRTL())
) { ) {
this._element.style.paddingLeft = `${this._scrollbarWidth}px`; this._element.style.paddingLeft = `${this._scrollbarWidth}px`;
} }
if ( if (
(this._isBodyOverflowing && !isModalOverflowing && !isRTL) || (this._isBodyOverflowing && !isModalOverflowing && !isRTL()) ||
(!this._isBodyOverflowing && isModalOverflowing && isRTL) (!this._isBodyOverflowing && isModalOverflowing && isRTL())
) { ) {
this._element.style.paddingRight = `${this._scrollbarWidth}px`; this._element.style.paddingRight = `${this._scrollbarWidth}px`;
} }
@ -487,6 +490,13 @@ class Modal extends BaseComponent {
_setElementAttributes(selector, styleProp, callback) { _setElementAttributes(selector, styleProp, callback) {
SelectorEngine.find(selector).forEach((element) => { SelectorEngine.find(selector).forEach((element) => {
if (
element !== document.body &&
window.innerWidth > element.clientWidth + this._scrollbarWidth
) {
return;
}
const actualValue = element.style[styleProp]; const actualValue = element.style[styleProp];
const calculatedValue = window.getComputedStyle(element)[styleProp]; const calculatedValue = window.getComputedStyle(element)[styleProp];
Manipulator.setDataAttribute(element, styleProp, actualValue); Manipulator.setDataAttribute(element, styleProp, actualValue);
@ -526,7 +536,7 @@ class Modal extends BaseComponent {
static jQueryInterface(config, relatedTarget) { static jQueryInterface(config, relatedTarget) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = { const _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(this), ...Manipulator.getDataAttributes(this),
@ -574,7 +584,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
}); });
}); });
let data = Data.getData(target, DATA_KEY); let data = Data.get(target, DATA_KEY);
if (!data) { if (!data) {
const config = { const config = {
...Manipulator.getDataAttributes(target), ...Manipulator.getDataAttributes(target),

View File

@ -0,0 +1,284 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): offcanvas.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
import {
defineJQueryPlugin,
getElementFromSelector,
getSelectorFromElement,
getTransitionDurationFromElement,
isDisabled,
isVisible,
typeCheckConfig,
} from './util/index';
import { hide as scrollBarHide, reset as scrollBarReset } from './util/scrollbar';
import Data from './dom/data';
import EventHandler from './dom/event-handler';
import BaseComponent from './base-component';
import SelectorEngine from './dom/selector-engine';
import Manipulator from './dom/manipulator';
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const NAME = 'offcanvas';
const DATA_KEY = 'bs.offcanvas';
const EVENT_KEY = `.${DATA_KEY}`;
const DATA_API_KEY = '.data-api';
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
const ESCAPE_KEY = 'Escape';
const Default = {
backdrop: true,
keyboard: true,
scroll: false,
};
const DefaultType = {
backdrop: 'boolean',
keyboard: 'boolean',
scroll: 'boolean',
};
const CLASS_NAME_BACKDROP_BODY = 'offcanvas-backdrop';
const CLASS_NAME_SHOW = 'show';
const CLASS_NAME_TOGGLING = 'offcanvas-toggling';
const OPEN_SELECTOR = '.offcanvas.show';
const ACTIVE_SELECTOR = `${OPEN_SELECTOR}, .${CLASS_NAME_TOGGLING}`;
const EVENT_SHOW = `show${EVENT_KEY}`;
const EVENT_SHOWN = `shown${EVENT_KEY}`;
const EVENT_HIDE = `hide${EVENT_KEY}`;
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
const SELECTOR_DATA_DISMISS = '[data-mdb-dismiss="offcanvas"]';
const SELECTOR_DATA_TOGGLE = '[data-mdb-toggle="offcanvas"]';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Offcanvas extends BaseComponent {
constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._isShown = false;
this._addEventListeners();
}
// Getters
static get Default() {
return Default;
}
static get DATA_KEY() {
return DATA_KEY;
}
// Public
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown) {
return;
}
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget });
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
this._element.style.visibility = 'visible';
if (this._config.backdrop) {
document.body.classList.add(CLASS_NAME_BACKDROP_BODY);
}
if (!this._config.scroll) {
scrollBarHide();
}
this._element.classList.add(CLASS_NAME_TOGGLING);
this._element.removeAttribute('aria-hidden');
this._element.setAttribute('aria-modal', true);
this._element.setAttribute('role', 'dialog');
this._element.classList.add(CLASS_NAME_SHOW);
const completeCallBack = () => {
this._element.classList.remove(CLASS_NAME_TOGGLING);
EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget });
this._enforceFocusOnElement(this._element);
};
setTimeout(completeCallBack, getTransitionDurationFromElement(this._element));
}
hide() {
if (!this._isShown) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) {
return;
}
this._element.classList.add(CLASS_NAME_TOGGLING);
EventHandler.off(document, EVENT_FOCUSIN);
this._element.blur();
this._isShown = false;
this._element.classList.remove(CLASS_NAME_SHOW);
const completeCallback = () => {
this._element.setAttribute('aria-hidden', true);
this._element.removeAttribute('aria-modal');
this._element.removeAttribute('role');
this._element.style.visibility = 'hidden';
if (this._config.backdrop) {
document.body.classList.remove(CLASS_NAME_BACKDROP_BODY);
}
if (!this._config.scroll) {
scrollBarReset();
}
EventHandler.trigger(this._element, EVENT_HIDDEN);
this._element.classList.remove(CLASS_NAME_TOGGLING);
};
setTimeout(completeCallback, getTransitionDurationFromElement(this._element));
}
// Private
_getConfig(config) {
config = {
...Default,
...Manipulator.getDataAttributes(this._element),
...(typeof config === 'object' ? config : {}),
};
typeCheckConfig(NAME, config, DefaultType);
return config;
}
_enforceFocusOnElement(element) {
EventHandler.off(document, EVENT_FOCUSIN); // guard against infinite focus loop
EventHandler.on(document, EVENT_FOCUSIN, (event) => {
if (
document !== event.target &&
element !== event.target &&
!element.contains(event.target)
) {
element.focus();
}
});
element.focus();
}
_addEventListeners() {
EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
EventHandler.on(document, 'keydown', (event) => {
if (this._config.keyboard && event.key === ESCAPE_KEY) {
this.hide();
}
});
EventHandler.on(document, EVENT_CLICK_DATA_API, (event) => {
const target = SelectorEngine.findOne(getSelectorFromElement(event.target));
if (!this._element.contains(event.target) && target !== this._element) {
this.hide();
}
});
}
// Static
static jQueryInterface(config) {
return this.each(function () {
const data =
Data.get(this, DATA_KEY) || new Offcanvas(this, typeof config === 'object' ? config : {});
if (typeof config !== 'string') {
return;
}
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
const target = 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 allReadyOpen = SelectorEngine.findOne(ACTIVE_SELECTOR);
if (allReadyOpen && allReadyOpen !== target) {
return;
}
const data = Data.get(target, DATA_KEY) || new Offcanvas(target);
data.toggle(this);
});
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
SelectorEngine.find(OPEN_SELECTOR).forEach((el) =>
(Data.get(el, DATA_KEY) || new Offcanvas(el)).show()
);
});
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
defineJQueryPlugin(NAME, Offcanvas);
export default Offcanvas;

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): popover.js * Bootstrap (v5.0.0-beta3): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -136,7 +136,7 @@ class Popover extends Tooltip {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' ? config : null; const _config = typeof config === 'object' ? config : null;
if (!data && /dispose|hide/.test(config)) { if (!data && /dispose|hide/.test(config)) {
@ -145,7 +145,7 @@ class Popover extends Tooltip {
if (!data) { if (!data) {
data = new Popover(this, _config); data = new Popover(this, _config);
Data.setData(this, DATA_KEY, data); Data.set(this, DATA_KEY, data);
} }
if (typeof config === 'string') { if (typeof config === 'string') {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): scrollspy.js * Bootstrap (v5.0.0-beta3): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -68,7 +68,7 @@ const METHOD_POSITION = 'position';
class ScrollSpy extends BaseComponent { class ScrollSpy extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element); super(element);
this._scrollElement = element.tagName === 'BODY' ? window : element; this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`; this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
this._offsets = []; this._offsets = [];
@ -276,7 +276,7 @@ class ScrollSpy extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data) { if (!data) {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): tab.js * Bootstrap (v5.0.0-beta3): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -10,6 +10,7 @@ import {
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
isDisabled,
reflow, reflow,
} from './util/index'; } from './util/index';
import Data from './dom/data'; import Data from './dom/data';
@ -36,7 +37,6 @@ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'; const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
const CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
const CLASS_NAME_DISABLED = 'disabled';
const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
@ -69,7 +69,7 @@ class Tab extends BaseComponent {
(this._element.parentNode && (this._element.parentNode &&
this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
this._element.classList.contains(CLASS_NAME_ACTIVE)) || this._element.classList.contains(CLASS_NAME_ACTIVE)) ||
this._element.classList.contains(CLASS_NAME_DISABLED) isDisabled(this._element)
) { ) {
return; return;
} }
@ -193,7 +193,7 @@ class Tab extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Data.getData(this, DATA_KEY) || new Tab(this); const data = Data.get(this, DATA_KEY) || new Tab(this);
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
@ -215,7 +215,7 @@ class Tab extends BaseComponent {
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();
const data = Data.getData(this, DATA_KEY) || new Tab(this); const data = Data.get(this, DATA_KEY) || new Tab(this);
data.show(); data.show();
}); });

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): toast.js * Bootstrap (v5.0.0-beta3): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -189,7 +189,7 @@ class Toast extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data) { if (!data) {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): tooltip.js * Bootstrap (v5.0.0-beta3): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -61,9 +61,9 @@ const DefaultType = {
const AttachmentMap = { const AttachmentMap = {
AUTO: 'auto', AUTO: 'auto',
TOP: 'top', TOP: 'top',
RIGHT: isRTL ? 'left' : 'right', RIGHT: isRTL() ? 'left' : 'right',
BOTTOM: 'bottom', BOTTOM: 'bottom',
LEFT: isRTL ? 'right' : 'left', LEFT: isRTL() ? 'right' : 'left',
}; };
const Default = { const Default = {
@ -279,15 +279,18 @@ class Tooltip extends BaseComponent {
this._addAttachmentClass(attachment); this._addAttachmentClass(attachment);
const container = this._getContainer(); const container = this._getContainer();
Data.setData(tip, this.constructor.DATA_KEY, this); Data.set(tip, this.constructor.DATA_KEY, this);
if (!this._element.ownerDocument.documentElement.contains(this.tip)) { if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
container.appendChild(tip); container.appendChild(tip);
EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
} }
EventHandler.trigger(this._element, this.constructor.Event.INSERTED); if (this._popper) {
this._popper.update();
} else {
this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment)); this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));
}
tip.classList.add(CLASS_NAME_SHOW); tip.classList.add(CLASS_NAME_SHOW);
@ -336,6 +339,10 @@ class Tooltip extends BaseComponent {
const tip = this.getTipElement(); const tip = this.getTipElement();
const complete = () => { const complete = () => {
if (this._isWithActiveTrigger()) {
return;
}
if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip); tip.parentNode.removeChild(tip);
} }
@ -474,11 +481,11 @@ class Tooltip extends BaseComponent {
_initializeOnDelegatedTarget(event, context) { _initializeOnDelegatedTarget(event, context) {
const dataKey = this.constructor.DATA_KEY; const dataKey = this.constructor.DATA_KEY;
context = context || Data.getData(event.delegateTarget, dataKey); context = context || Data.get(event.delegateTarget, dataKey);
if (!context) { if (!context) {
context = new this.constructor(event.delegateTarget, this._getDelegateConfig()); context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
Data.setData(event.delegateTarget, dataKey, context); Data.set(event.delegateTarget, dataKey, context);
} }
return context; return context;
@ -671,7 +678,9 @@ class Tooltip extends BaseComponent {
context = this._initializeOnDelegatedTarget(event, context); context = this._initializeOnDelegatedTarget(event, context);
if (event) { if (event) {
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false; context._activeTrigger[
event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER
] = context._element.contains(event.relatedTarget);
} }
if (context._isWithActiveTrigger()) { if (context._isWithActiveTrigger()) {
@ -785,7 +794,7 @@ class Tooltip extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data && /dispose|hide/.test(config)) { if (!data && /dispose|hide/.test(config)) {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -39,7 +39,20 @@ const getSelector = (element) => {
let selector = element.getAttribute('data-mdb-target'); let selector = element.getAttribute('data-mdb-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
const hrefAttr = element.getAttribute('href'); let hrefAttr = 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 (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {
return null;
}
// Just in case some CMS puts out a full URL with the anchor appended
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
hrefAttr = '#' + hrefAttr.split('#')[1];
}
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null; selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
} }
@ -120,7 +133,7 @@ const typeCheckConfig = (componentName, config, configTypes) => {
const valueType = value && isElement(value) ? 'element' : toType(value); const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error( throw new TypeError(
`${componentName.toUpperCase()}: ` + `${componentName.toUpperCase()}: ` +
`Option "${property}" provided type "${valueType}" ` + `Option "${property}" provided type "${valueType}" ` +
`but expected type "${expectedTypes}".` `but expected type "${expectedTypes}".`
@ -148,6 +161,22 @@ const isVisible = (element) => {
return false; return false;
}; };
const isDisabled = (element) => {
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true;
}
if (element.classList.contains('disabled')) {
return true;
}
if (typeof element.disabled !== 'undefined') {
return element.disabled;
}
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;
@ -193,7 +222,7 @@ const onDOMContentLoaded = (callback) => {
} }
}; };
const isRTL = document.documentElement.dir === 'rtl'; const isRTL = () => document.documentElement.dir === 'rtl';
const defineJQueryPlugin = (name, plugin) => { const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => { onDOMContentLoaded(() => {
@ -212,7 +241,6 @@ const defineJQueryPlugin = (name, plugin) => {
}; };
export { export {
TRANSITION_END,
getUID, getUID,
getSelectorFromElement, getSelectorFromElement,
getElementFromSelector, getElementFromSelector,
@ -222,6 +250,7 @@ export {
emulateTransitionEnd, emulateTransitionEnd,
typeCheckConfig, typeCheckConfig,
isVisible, isVisible,
isDisabled,
findShadowRoot, findShadowRoot,
noop, noop,
reflow, reflow,

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/sanitizer.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -23,7 +23,7 @@ const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
* *
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/ */
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi; const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
/** /**
* A pattern that matches safe data URLs. Only matches image, video and audio types. * A pattern that matches safe data URLs. Only matches image, video and audio types.
@ -38,7 +38,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
if (allowedAttributeList.includes(attrName)) { if (allowedAttributeList.includes(attrName)) {
if (uriAttrs.has(attrName)) { if (uriAttrs.has(attrName)) {
return Boolean( return Boolean(
attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN) SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue)
); );
} }
@ -49,7 +49,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
// Check if a regular expression validates the attribute. // Check if a regular expression validates the attribute.
for (let i = 0, len = regExp.length; i < len; i++) { for (let i = 0, len = regExp.length; i < len; i++) {
if (attrName.match(regExp[i])) { if (regExp[i].test(attrName)) {
return true; return true;
} }
} }

View File

@ -0,0 +1,72 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): util/scrollBar.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
import SelectorEngine from '../dom/selector-engine';
import Manipulator from '../dom/manipulator';
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed';
const SELECTOR_STICKY_CONTENT = '.sticky-top';
const getWidth = () => {
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
const documentWidth = document.documentElement.clientWidth;
return Math.abs(window.innerWidth - documentWidth);
};
const hide = (width = getWidth()) => {
document.body.style.overflow = 'hidden';
_setElementAttributes(
SELECTOR_FIXED_CONTENT,
'paddingRight',
(calculatedValue) => calculatedValue + width
);
_setElementAttributes(
SELECTOR_STICKY_CONTENT,
'marginRight',
(calculatedValue) => calculatedValue - width
);
_setElementAttributes('body', 'paddingRight', (calculatedValue) => calculatedValue + width);
};
const _setElementAttributes = (selector, styleProp, callback) => {
const scrollbarWidth = getWidth();
SelectorEngine.find(selector).forEach((element) => {
if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
return;
}
const actualValue = element.style[styleProp];
const calculatedValue = window.getComputedStyle(element)[styleProp];
Manipulator.setDataAttribute(element, styleProp, actualValue);
element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px';
});
};
const reset = () => {
document.body.style.overflow = 'auto';
_resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
_resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
_resetElementAttributes('body', 'paddingRight');
};
const _resetElementAttributes = (selector, styleProp) => {
SelectorEngine.find(selector).forEach((element) => {
const value = Manipulator.getDataAttribute(element, styleProp);
if (typeof value === 'undefined' && element === document.body) {
element.style.removeProperty(styleProp);
} else {
Manipulator.removeDataAttribute(element, styleProp);
element.style[styleProp] = value;
}
});
};
const isBodyOverflowing = () => {
return getWidth() > 0;
};
export { getWidth, hide, isBodyOverflowing, reset };

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): alert.js * Bootstrap (v5.0.0-beta3): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -98,7 +98,7 @@ class Alert extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
if (!data) { if (!data) {
data = new Alert(this); data = new Alert(this);
@ -126,6 +126,7 @@ class Alert extends BaseComponent {
* Data Api implementation * Data Api implementation
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert())); EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()));
/** /**

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): base-component.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -13,27 +13,29 @@ import Data from './dom/data';
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const VERSION = '5.0.0-beta2'; const VERSION = '5.0.0-beta3';
class BaseComponent { class BaseComponent {
constructor(element) { constructor(element) {
element = typeof element === 'string' ? document.querySelector(element) : element;
if (!element) { if (!element) {
return; return;
} }
this._element = element; this._element = element;
Data.setData(element, this.constructor.DATA_KEY, this); Data.set(this._element, this.constructor.DATA_KEY, this);
} }
dispose() { dispose() {
Data.removeData(this._element, this.constructor.DATA_KEY); Data.remove(this._element, this.constructor.DATA_KEY);
this._element = null; this._element = null;
} }
/** Static */ /** Static */
static getInstance(element) { static getInstance(element) {
return Data.getData(element, this.DATA_KEY); return Data.get(element, this.DATA_KEY);
} }
static get VERSION() { static get VERSION() {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): button.js * Bootstrap (v5.0.0-beta3): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -51,7 +51,7 @@ class Button extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
if (!data) { if (!data) {
data = new Button(this); data = new Button(this);
@ -75,7 +75,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, (event) =>
const button = event.target.closest(SELECTOR_DATA_TOGGLE); const button = event.target.closest(SELECTOR_DATA_TOGGLE);
let data = Data.getData(button, DATA_KEY); let data = Data.get(button, DATA_KEY);
if (!data) { if (!data) {
data = new Button(button); data = new Button(button);
} }

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): carousel.js * Bootstrap (v5.0.0-beta3): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -10,8 +10,8 @@ import {
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
isVisible,
isRTL, isRTL,
isVisible,
reflow, reflow,
triggerTransitionEnd, triggerTransitionEnd,
typeCheckConfig, typeCheckConfig,
@ -56,8 +56,8 @@ const DefaultType = {
touch: 'boolean', touch: 'boolean',
}; };
const DIRECTION_NEXT = 'next'; const ORDER_NEXT = 'next';
const DIRECTION_PREV = 'prev'; const ORDER_PREV = 'prev';
const DIRECTION_LEFT = 'left'; const DIRECTION_LEFT = 'left';
const DIRECTION_RIGHT = 'right'; const DIRECTION_RIGHT = 'right';
@ -138,7 +138,7 @@ class Carousel extends BaseComponent {
next() { next() {
if (!this._isSliding) { if (!this._isSliding) {
this._slide(DIRECTION_NEXT); this._slide(ORDER_NEXT);
} }
} }
@ -152,7 +152,7 @@ class Carousel extends BaseComponent {
prev() { prev() {
if (!this._isSliding) { if (!this._isSliding) {
this._slide(DIRECTION_PREV); this._slide(ORDER_PREV);
} }
} }
@ -209,13 +209,12 @@ class Carousel extends BaseComponent {
return; return;
} }
const direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV; const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
this._slide(direction, this._items[index]); this._slide(order, this._items[index]);
} }
dispose() { dispose() {
super.dispose();
EventHandler.off(this._element, EVENT_KEY); EventHandler.off(this._element, EVENT_KEY);
this._items = null; this._items = null;
@ -225,6 +224,8 @@ class Carousel extends BaseComponent {
this._isSliding = null; this._isSliding = null;
this._activeElement = null; this._activeElement = null;
this._indicatorsElement = null; this._indicatorsElement = null;
super.dispose();
} }
// Private // Private
@ -249,23 +250,11 @@ class Carousel extends BaseComponent {
this.touchDeltaX = 0; this.touchDeltaX = 0;
// swipe left if (!direction) {
if (direction > 0) { return;
if (isRTL) {
this.next();
} else {
this.prev();
}
} }
// swipe right this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);
if (direction < 0) {
if (isRTL) {
this.prev();
} else {
this.next();
}
}
} }
_addEventListeners() { _addEventListeners() {
@ -297,11 +286,8 @@ class Carousel extends BaseComponent {
const move = (event) => { const move = (event) => {
// ensure swiping with one touch and not pinching // ensure swiping with one touch and not pinching
if (event.touches && event.touches.length > 1) { this.touchDeltaX =
this.touchDeltaX = 0; event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;
} else {
this.touchDeltaX = event.touches[0].clientX - this.touchStartX;
}
}; };
const end = (event) => { const end = (event) => {
@ -357,18 +343,10 @@ class Carousel extends BaseComponent {
if (event.key === ARROW_LEFT_KEY) { if (event.key === ARROW_LEFT_KEY) {
event.preventDefault(); event.preventDefault();
if (isRTL) { this._slide(DIRECTION_LEFT);
this.next();
} else {
this.prev();
}
} else if (event.key === ARROW_RIGHT_KEY) { } else if (event.key === ARROW_RIGHT_KEY) {
event.preventDefault(); event.preventDefault();
if (isRTL) { this._slide(DIRECTION_RIGHT);
this.prev();
} else {
this.next();
}
} }
} }
@ -379,19 +357,19 @@ class Carousel extends BaseComponent {
return this._items.indexOf(element); return this._items.indexOf(element);
} }
_getItemByDirection(direction, activeElement) { _getItemByOrder(order, activeElement) {
const isNextDirection = direction === DIRECTION_NEXT; const isNext = order === ORDER_NEXT;
const isPrevDirection = direction === DIRECTION_PREV; const isPrev = order === ORDER_PREV;
const activeIndex = this._getItemIndex(activeElement); const activeIndex = this._getItemIndex(activeElement);
const lastItemIndex = this._items.length - 1; const lastItemIndex = this._items.length - 1;
const isGoingToWrap = const isGoingToWrap =
(isPrevDirection && activeIndex === 0) || (isNextDirection && activeIndex === lastItemIndex); (isPrev && activeIndex === 0) || (isNext && activeIndex === lastItemIndex);
if (isGoingToWrap && !this._config.wrap) { if (isGoingToWrap && !this._config.wrap) {
return activeElement; return activeElement;
} }
const delta = direction === DIRECTION_PREV ? -1 : 1; const delta = isPrev ? -1 : 1;
const itemIndex = (activeIndex + delta) % this._items.length; const itemIndex = (activeIndex + delta) % this._items.length;
return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
@ -451,18 +429,19 @@ class Carousel extends BaseComponent {
} }
} }
_slide(direction, element) { _slide(directionOrOrder, element) {
const order = this._directionToOrder(directionOrOrder);
const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
const activeElementIndex = this._getItemIndex(activeElement); const activeElementIndex = this._getItemIndex(activeElement);
const nextElement = const nextElement = element || this._getItemByOrder(order, activeElement);
element || (activeElement && this._getItemByDirection(direction, activeElement));
const nextElementIndex = this._getItemIndex(nextElement); const nextElementIndex = this._getItemIndex(nextElement);
const isCycling = Boolean(this._interval); const isCycling = Boolean(this._interval);
const directionalClassName = direction === DIRECTION_NEXT ? CLASS_NAME_START : CLASS_NAME_END; const isNext = order === ORDER_NEXT;
const orderClassName = direction === DIRECTION_NEXT ? CLASS_NAME_NEXT : CLASS_NAME_PREV; const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
const eventDirectionName = direction === DIRECTION_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT; const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
const eventDirectionName = this._orderToDirection(order);
if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) { if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE)) {
this._isSliding = false; this._isSliding = false;
@ -535,10 +514,34 @@ class Carousel extends BaseComponent {
} }
} }
_directionToOrder(direction) {
if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
return direction;
}
if (isRTL()) {
return direction === DIRECTION_RIGHT ? ORDER_PREV : ORDER_NEXT;
}
return direction === DIRECTION_RIGHT ? ORDER_NEXT : ORDER_PREV;
}
_orderToDirection(order) {
if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
return order;
}
if (isRTL()) {
return order === ORDER_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT;
}
return order === ORDER_NEXT ? DIRECTION_RIGHT : DIRECTION_LEFT;
}
// Static // Static
static carouselInterface(element, config) { static carouselInterface(element, config) {
let data = Data.getData(element, DATA_KEY); let data = Data.get(element, DATA_KEY);
let _config = { let _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(element), ...Manipulator.getDataAttributes(element),
@ -597,7 +600,7 @@ class Carousel extends BaseComponent {
Carousel.carouselInterface(target, config); Carousel.carouselInterface(target, config);
if (slideIndex) { if (slideIndex) {
Data.getData(target, DATA_KEY).to(slideIndex); Data.get(target, DATA_KEY).to(slideIndex);
} }
event.preventDefault(); event.preventDefault();
@ -616,7 +619,7 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
for (let i = 0, len = carousels.length; i < len; i++) { for (let i = 0, len = carousels.length; i < len; i++) {
Carousel.carouselInterface(carousels[i], Data.getData(carousels[i], DATA_KEY)); Carousel.carouselInterface(carousels[i], Data.get(carousels[i], DATA_KEY));
} }
}); });

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): collapse.js * Bootstrap (v5.0.0-beta3): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -72,8 +72,8 @@ class Collapse extends BaseComponent {
this._isTransitioning = false; this._isTransitioning = false;
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._triggerArray = SelectorEngine.find( this._triggerArray = SelectorEngine.find(
`${SELECTOR_DATA_TOGGLE}[href="#${element.id}"],` + `${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` +
`${SELECTOR_DATA_TOGGLE}[data-bs-target="#${element.id}"]` `${SELECTOR_DATA_TOGGLE}[data-bs-target="#${this._element.id}"]`
); );
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE); const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
@ -82,7 +82,7 @@ class Collapse extends BaseComponent {
const elem = toggleList[i]; const elem = toggleList[i];
const selector = getSelectorFromElement(elem); const selector = getSelectorFromElement(elem);
const filterElement = SelectorEngine.find(selector).filter( const filterElement = SelectorEngine.find(selector).filter(
(foundElem) => foundElem === element (foundElem) => foundElem === this._element
); );
if (selector !== null && filterElement.length) { if (selector !== null && filterElement.length) {
@ -147,7 +147,7 @@ class Collapse extends BaseComponent {
const container = SelectorEngine.findOne(this._selector); const container = SelectorEngine.findOne(this._selector);
if (actives) { if (actives) {
const tempActiveData = actives.find((elem) => container !== elem); const tempActiveData = actives.find((elem) => container !== elem);
activesData = tempActiveData ? Data.getData(tempActiveData, DATA_KEY) : null; activesData = tempActiveData ? Data.get(tempActiveData, DATA_KEY) : null;
if (activesData && activesData._isTransitioning) { if (activesData && activesData._isTransitioning) {
return; return;
@ -166,7 +166,7 @@ class Collapse extends BaseComponent {
} }
if (!activesData) { if (!activesData) {
Data.setData(elemActive, DATA_KEY, null); Data.set(elemActive, DATA_KEY, null);
} }
}); });
} }
@ -328,7 +328,7 @@ class Collapse extends BaseComponent {
// Static // Static
static collapseInterface(element, config) { static collapseInterface(element, config) {
let data = Data.getData(element, DATA_KEY); let data = Data.get(element, DATA_KEY);
const _config = { const _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(element), ...Manipulator.getDataAttributes(element),
@ -379,7 +379,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
const selectorElements = SelectorEngine.find(selector); const selectorElements = SelectorEngine.find(selector);
selectorElements.forEach((element) => { selectorElements.forEach((element) => {
const data = Data.getData(element, DATA_KEY); const data = Data.get(element, DATA_KEY);
let config; let config;
if (data) { if (data) {
// update parent attribute // update parent attribute

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/data.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -11,57 +11,51 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const mapData = (() => { const elementMap = new Map();
const storeData = {};
let id = 1; export default {
return { set(element, key, instance) {
set(element, key, data) { if (!elementMap.has(element)) {
if (typeof element.bsKey === 'undefined') { elementMap.set(element, new Map());
element.bsKey = {
key,
id,
};
id++;
} }
storeData[element.bsKey.id] = data; const instanceMap = elementMap.get(element);
},
get(element, key) {
if (!element || typeof element.bsKey === 'undefined') {
return null;
}
const keyProperties = element.bsKey; // make it clear we only want one instance per element
if (keyProperties.key === key) { // can be removed later when multiple key/instances are fine to be used
return storeData[keyProperties.id]; if (!instanceMap.has(key) && instanceMap.size !== 0) {
} // eslint-disable-next-line no-console
console.error(
return null; `Bootstrap doesn't allow more than one instance per element. Bound instance: ${
}, Array.from(instanceMap.keys())[0]
delete(element, key) { }.`
if (typeof element.bsKey === 'undefined') { );
return; return;
} }
const keyProperties = element.bsKey; instanceMap.set(key, instance);
if (keyProperties.key === key) { },
delete storeData[keyProperties.id];
delete element.bsKey; get(element, key) {
if (elementMap.has(element)) {
return elementMap.get(element).get(key) || null;
}
return null;
},
remove(element, key) {
if (!elementMap.has(element)) {
return;
}
const instanceMap = elementMap.get(element);
instanceMap.delete(key);
// free up element references if there are no instances left for an element
if (instanceMap.size === 0) {
elementMap.delete(element);
} }
}, },
}; };
})();
const Data = {
setData(instance, key, data) {
mapData.set(instance, key, data);
},
getData(instance, key) {
return mapData.get(instance, key);
},
removeData(instance, key) {
mapData.delete(instance, key);
},
};
export default Data;

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/event-handler.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -112,6 +112,7 @@ function bootstrapDelegationHandler(element, selector, fn) {
event.delegateTarget = target; event.delegateTarget = target;
if (handler.oneOff) { if (handler.oneOff) {
// eslint-disable-next-line unicorn/consistent-destructuring
EventHandler.off(element, event.type, fn); EventHandler.off(element, event.type, fn);
} }

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/manipulator.js * Bootstrap (v5.0.0-beta3): 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,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dom/selector-engine.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -14,10 +14,6 @@
const NODE_TEXT = 3; const NODE_TEXT = 3;
const SelectorEngine = { const SelectorEngine = {
matches(element, selector) {
return element.matches(selector);
},
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));
}, },
@ -27,9 +23,7 @@ const SelectorEngine = {
}, },
children(element, selector) { children(element, selector) {
const children = [].concat(...element.children); return [].concat(...element.children).filter((child) => child.matches(selector));
return children.filter((child) => child.matches(selector));
}, },
parents(element, selector) { parents(element, selector) {
@ -38,7 +32,7 @@ const SelectorEngine = {
let ancestor = element.parentNode; let ancestor = element.parentNode;
while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
if (this.matches(ancestor, selector)) { if (ancestor.matches(selector)) {
parents.push(ancestor); parents.push(ancestor);
} }
@ -66,7 +60,7 @@ const SelectorEngine = {
let next = element.nextElementSibling; let next = element.nextElementSibling;
while (next) { while (next) {
if (this.matches(next, selector)) { if (next.matches(selector)) {
return [next]; return [next];
} }

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): dropdown.js * Bootstrap (v5.0.0-beta3): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -59,21 +59,19 @@ const CLASS_NAME_DROPSTART = 'dropstart';
const CLASS_NAME_NAVBAR = 'navbar'; const CLASS_NAME_NAVBAR = 'navbar';
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]'; const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
const SELECTOR_FORM_CHILD = '.dropdown form';
const SELECTOR_MENU = '.dropdown-menu'; const SELECTOR_MENU = '.dropdown-menu';
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 = isRTL ? 'top-end' : 'top-start'; const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
const PLACEMENT_TOPEND = isRTL ? 'top-start' : 'top-end'; const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
const PLACEMENT_BOTTOM = isRTL ? 'bottom-end' : 'bottom-start'; const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
const PLACEMENT_BOTTOMEND = isRTL ? 'bottom-start' : 'bottom-end'; const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
const PLACEMENT_RIGHT = isRTL ? 'left-start' : 'right-start'; const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
const PLACEMENT_LEFT = isRTL ? 'right-start' : 'left-start'; const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
const Default = { const Default = {
offset: [0, 2], offset: [0, 2],
flip: true,
boundary: 'clippingParents', boundary: 'clippingParents',
reference: 'toggle', reference: 'toggle',
display: 'dynamic', display: 'dynamic',
@ -82,7 +80,6 @@ const Default = {
const DefaultType = { const DefaultType = {
offset: '(array|string|function)', offset: '(array|string|function)',
flip: 'boolean',
boundary: '(string|element)', boundary: '(string|element)',
reference: '(string|element|object)', reference: '(string|element|object)',
display: 'string', display: 'string',
@ -242,7 +239,6 @@ class Dropdown extends BaseComponent {
} }
dispose() { dispose() {
super.dispose();
EventHandler.off(this._element, EVENT_KEY); EventHandler.off(this._element, EVENT_KEY);
this._menu = null; this._menu = null;
@ -250,6 +246,8 @@ class Dropdown extends BaseComponent {
this._popper.destroy(); this._popper.destroy();
this._popper = null; this._popper = null;
} }
super.dispose();
} }
update() { update() {
@ -264,7 +262,6 @@ class Dropdown extends BaseComponent {
_addEventListeners() { _addEventListeners() {
EventHandler.on(this._element, EVENT_CLICK, (event) => { EventHandler.on(this._element, EVENT_CLICK, (event) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation();
this.toggle(); this.toggle();
}); });
} }
@ -342,7 +339,6 @@ class Dropdown extends BaseComponent {
{ {
name: 'preventOverflow', name: 'preventOverflow',
options: { options: {
altBoundary: this._config.flip,
boundary: this._config.boundary, boundary: this._config.boundary,
}, },
}, },
@ -376,7 +372,7 @@ class Dropdown extends BaseComponent {
// Static // Static
static dropdownInterface(element, config) { static dropdownInterface(element, config) {
let data = Data.getData(element, DATA_KEY); let data = Data.get(element, DATA_KEY);
const _config = typeof config === 'object' ? config : null; const _config = typeof config === 'object' ? config : null;
if (!data) { if (!data) {
@ -399,17 +395,23 @@ class Dropdown extends BaseComponent {
} }
static clearMenus(event) { static clearMenus(event) {
if (event) {
if ( if (
event && event.button === RIGHT_MOUSE_BUTTON ||
(event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) (event.type === 'keyup' && event.key !== TAB_KEY)
) { ) {
return; return;
} }
if (/input|select|textarea|form/i.test(event.target.tagName)) {
return;
}
}
const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE); const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE);
for (let i = 0, len = toggles.length; i < len; i++) { for (let i = 0, len = toggles.length; i < len; i++) {
const context = Data.getData(toggles[i], DATA_KEY); const context = Data.get(toggles[i], DATA_KEY);
const relatedTarget = { const relatedTarget = {
relatedTarget: toggles[i], relatedTarget: toggles[i],
}; };
@ -427,14 +429,21 @@ class Dropdown extends BaseComponent {
continue; continue;
} }
if (event) {
// Don't close the menu if the clicked element or one of its parents is the dropdown button
if ([context._element].some((element) => event.composedPath().includes(element))) {
continue;
}
// Tab navigation through the dropdown menu shouldn't close the menu
if ( if (
event && event.type === 'keyup' &&
((event.type === 'click' && /input|textarea/i.test(event.target.tagName)) || event.key === TAB_KEY &&
(event.type === 'keyup' && event.key === TAB_KEY)) &&
dropdownMenu.contains(event.target) dropdownMenu.contains(event.target)
) { ) {
continue; continue;
} }
}
const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE, relatedTarget); const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE, relatedTarget);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
@ -559,10 +568,8 @@ 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();
event.stopPropagation(); Dropdown.dropdownInterface(this);
Dropdown.dropdownInterface(this, 'toggle');
}); });
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, (e) => e.stopPropagation());
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): modal.js * Bootstrap (v5.0.0-beta3): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -83,7 +83,7 @@ class Modal extends BaseComponent {
super(element); super(element);
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, element); this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
this._backdrop = null; this._backdrop = null;
this._isShown = false; this._isShown = false;
this._isBodyOverflowing = false; this._isBodyOverflowing = false;
@ -113,7 +113,7 @@ class Modal extends BaseComponent {
return; return;
} }
if (this._element.classList.contains(CLASS_NAME_FADE)) { if (this._isAnimated()) {
this._isTransitioning = true; this._isTransitioning = true;
} }
@ -166,9 +166,9 @@ class Modal extends BaseComponent {
} }
this._isShown = false; this._isShown = false;
const transition = this._element.classList.contains(CLASS_NAME_FADE); const isAnimated = this._isAnimated();
if (transition) { if (isAnimated) {
this._isTransitioning = true; this._isTransitioning = true;
} }
@ -182,7 +182,7 @@ class Modal extends BaseComponent {
EventHandler.off(this._element, EVENT_CLICK_DISMISS); EventHandler.off(this._element, EVENT_CLICK_DISMISS);
EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS); EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
if (transition) { if (isAnimated) {
const transitionDuration = getTransitionDurationFromElement(this._element); const transitionDuration = getTransitionDurationFromElement(this._element);
EventHandler.one(this._element, 'transitionend', (event) => this._hideModal(event)); EventHandler.one(this._element, 'transitionend', (event) => this._hideModal(event));
@ -232,7 +232,7 @@ class Modal extends BaseComponent {
} }
_showElement(relatedTarget) { _showElement(relatedTarget) {
const transition = this._element.classList.contains(CLASS_NAME_FADE); const isAnimated = this._isAnimated();
const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
@ -250,7 +250,7 @@ class Modal extends BaseComponent {
modalBody.scrollTop = 0; modalBody.scrollTop = 0;
} }
if (transition) { if (isAnimated) {
reflow(this._element); reflow(this._element);
} }
@ -271,7 +271,7 @@ class Modal extends BaseComponent {
}); });
}; };
if (transition) { if (isAnimated) {
const transitionDuration = getTransitionDurationFromElement(this._dialog); const transitionDuration = getTransitionDurationFromElement(this._dialog);
EventHandler.one(this._dialog, 'transitionend', transitionComplete); EventHandler.one(this._dialog, 'transitionend', transitionComplete);
@ -337,14 +337,13 @@ class Modal extends BaseComponent {
} }
_showBackdrop(callback) { _showBackdrop(callback) {
const animate = this._element.classList.contains(CLASS_NAME_FADE) ? CLASS_NAME_FADE : ''; const isAnimated = this._isAnimated();
if (this._isShown && this._config.backdrop) { if (this._isShown && this._config.backdrop) {
this._backdrop = document.createElement('div'); this._backdrop = document.createElement('div');
this._backdrop.className = CLASS_NAME_BACKDROP; this._backdrop.className = CLASS_NAME_BACKDROP;
if (animate) { if (isAnimated) {
this._backdrop.classList.add(animate); this._backdrop.classList.add(CLASS_NAME_FADE);
} }
document.body.appendChild(this._backdrop); document.body.appendChild(this._backdrop);
@ -366,13 +365,13 @@ class Modal extends BaseComponent {
} }
}); });
if (animate) { if (isAnimated) {
reflow(this._backdrop); reflow(this._backdrop);
} }
this._backdrop.classList.add(CLASS_NAME_SHOW); this._backdrop.classList.add(CLASS_NAME_SHOW);
if (!animate) { if (!isAnimated) {
callback(); callback();
return; return;
} }
@ -389,7 +388,7 @@ class Modal extends BaseComponent {
callback(); callback();
}; };
if (this._element.classList.contains(CLASS_NAME_FADE)) { if (isAnimated) {
const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop); const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop);
EventHandler.one(this._backdrop, 'transitionend', callbackRemove); EventHandler.one(this._backdrop, 'transitionend', callbackRemove);
emulateTransitionEnd(this._backdrop, backdropTransitionDuration); emulateTransitionEnd(this._backdrop, backdropTransitionDuration);
@ -401,6 +400,10 @@ class Modal extends BaseComponent {
} }
} }
_isAnimated() {
return this._element.classList.contains(CLASS_NAME_FADE);
}
_triggerBackdropTransition() { _triggerBackdropTransition() {
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
if (hideEvent.defaultPrevented) { if (hideEvent.defaultPrevented) {
@ -437,15 +440,15 @@ class Modal extends BaseComponent {
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
if ( if (
(!this._isBodyOverflowing && isModalOverflowing && !isRTL) || (!this._isBodyOverflowing && isModalOverflowing && !isRTL()) ||
(this._isBodyOverflowing && !isModalOverflowing && isRTL) (this._isBodyOverflowing && !isModalOverflowing && isRTL())
) { ) {
this._element.style.paddingLeft = `${this._scrollbarWidth}px`; this._element.style.paddingLeft = `${this._scrollbarWidth}px`;
} }
if ( if (
(this._isBodyOverflowing && !isModalOverflowing && !isRTL) || (this._isBodyOverflowing && !isModalOverflowing && !isRTL()) ||
(!this._isBodyOverflowing && isModalOverflowing && isRTL) (!this._isBodyOverflowing && isModalOverflowing && isRTL())
) { ) {
this._element.style.paddingRight = `${this._scrollbarWidth}px`; this._element.style.paddingRight = `${this._scrollbarWidth}px`;
} }
@ -486,6 +489,13 @@ class Modal extends BaseComponent {
_setElementAttributes(selector, styleProp, callback) { _setElementAttributes(selector, styleProp, callback) {
SelectorEngine.find(selector).forEach((element) => { SelectorEngine.find(selector).forEach((element) => {
if (
element !== document.body &&
window.innerWidth > element.clientWidth + this._scrollbarWidth
) {
return;
}
const actualValue = element.style[styleProp]; const actualValue = element.style[styleProp];
const calculatedValue = window.getComputedStyle(element)[styleProp]; const calculatedValue = window.getComputedStyle(element)[styleProp];
Manipulator.setDataAttribute(element, styleProp, actualValue); Manipulator.setDataAttribute(element, styleProp, actualValue);
@ -525,7 +535,7 @@ class Modal extends BaseComponent {
static jQueryInterface(config, relatedTarget) { static jQueryInterface(config, relatedTarget) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = { const _config = {
...Default, ...Default,
...Manipulator.getDataAttributes(this), ...Manipulator.getDataAttributes(this),
@ -573,7 +583,7 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (
}); });
}); });
let data = Data.getData(target, DATA_KEY); let data = Data.get(target, DATA_KEY);
if (!data) { if (!data) {
const config = { const config = {
...Manipulator.getDataAttributes(target), ...Manipulator.getDataAttributes(target),

View File

@ -0,0 +1,284 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): offcanvas.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
import {
defineJQueryPlugin,
getElementFromSelector,
getSelectorFromElement,
getTransitionDurationFromElement,
isDisabled,
isVisible,
typeCheckConfig,
} from './util/index';
import { hide as scrollBarHide, reset as scrollBarReset } from './util/scrollbar';
import Data from './dom/data';
import EventHandler from './dom/event-handler';
import BaseComponent from './base-component';
import SelectorEngine from './dom/selector-engine';
import Manipulator from './dom/manipulator';
/**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
const NAME = 'offcanvas';
const DATA_KEY = 'bs.offcanvas';
const EVENT_KEY = `.${DATA_KEY}`;
const DATA_API_KEY = '.data-api';
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
const ESCAPE_KEY = 'Escape';
const Default = {
backdrop: true,
keyboard: true,
scroll: false,
};
const DefaultType = {
backdrop: 'boolean',
keyboard: 'boolean',
scroll: 'boolean',
};
const CLASS_NAME_BACKDROP_BODY = 'offcanvas-backdrop';
const CLASS_NAME_SHOW = 'show';
const CLASS_NAME_TOGGLING = 'offcanvas-toggling';
const OPEN_SELECTOR = '.offcanvas.show';
const ACTIVE_SELECTOR = `${OPEN_SELECTOR}, .${CLASS_NAME_TOGGLING}`;
const EVENT_SHOW = `show${EVENT_KEY}`;
const EVENT_SHOWN = `shown${EVENT_KEY}`;
const EVENT_HIDE = `hide${EVENT_KEY}`;
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="offcanvas"]';
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]';
/**
* ------------------------------------------------------------------------
* Class Definition
* ------------------------------------------------------------------------
*/
class Offcanvas extends BaseComponent {
constructor(element, config) {
super(element);
this._config = this._getConfig(config);
this._isShown = false;
this._addEventListeners();
}
// Getters
static get Default() {
return Default;
}
static get DATA_KEY() {
return DATA_KEY;
}
// Public
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown) {
return;
}
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget });
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
this._element.style.visibility = 'visible';
if (this._config.backdrop) {
document.body.classList.add(CLASS_NAME_BACKDROP_BODY);
}
if (!this._config.scroll) {
scrollBarHide();
}
this._element.classList.add(CLASS_NAME_TOGGLING);
this._element.removeAttribute('aria-hidden');
this._element.setAttribute('aria-modal', true);
this._element.setAttribute('role', 'dialog');
this._element.classList.add(CLASS_NAME_SHOW);
const completeCallBack = () => {
this._element.classList.remove(CLASS_NAME_TOGGLING);
EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget });
this._enforceFocusOnElement(this._element);
};
setTimeout(completeCallBack, getTransitionDurationFromElement(this._element));
}
hide() {
if (!this._isShown) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) {
return;
}
this._element.classList.add(CLASS_NAME_TOGGLING);
EventHandler.off(document, EVENT_FOCUSIN);
this._element.blur();
this._isShown = false;
this._element.classList.remove(CLASS_NAME_SHOW);
const completeCallback = () => {
this._element.setAttribute('aria-hidden', true);
this._element.removeAttribute('aria-modal');
this._element.removeAttribute('role');
this._element.style.visibility = 'hidden';
if (this._config.backdrop) {
document.body.classList.remove(CLASS_NAME_BACKDROP_BODY);
}
if (!this._config.scroll) {
scrollBarReset();
}
EventHandler.trigger(this._element, EVENT_HIDDEN);
this._element.classList.remove(CLASS_NAME_TOGGLING);
};
setTimeout(completeCallback, getTransitionDurationFromElement(this._element));
}
// Private
_getConfig(config) {
config = {
...Default,
...Manipulator.getDataAttributes(this._element),
...(typeof config === 'object' ? config : {}),
};
typeCheckConfig(NAME, config, DefaultType);
return config;
}
_enforceFocusOnElement(element) {
EventHandler.off(document, EVENT_FOCUSIN); // guard against infinite focus loop
EventHandler.on(document, EVENT_FOCUSIN, (event) => {
if (
document !== event.target &&
element !== event.target &&
!element.contains(event.target)
) {
element.focus();
}
});
element.focus();
}
_addEventListeners() {
EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
EventHandler.on(document, 'keydown', (event) => {
if (this._config.keyboard && event.key === ESCAPE_KEY) {
this.hide();
}
});
EventHandler.on(document, EVENT_CLICK_DATA_API, (event) => {
const target = SelectorEngine.findOne(getSelectorFromElement(event.target));
if (!this._element.contains(event.target) && target !== this._element) {
this.hide();
}
});
}
// Static
static jQueryInterface(config) {
return this.each(function () {
const data =
Data.get(this, DATA_KEY) || new Offcanvas(this, typeof config === 'object' ? config : {});
if (typeof config !== 'string') {
return;
}
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
}
/**
* ------------------------------------------------------------------------
* Data Api implementation
* ------------------------------------------------------------------------
*/
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
const target = 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 allReadyOpen = SelectorEngine.findOne(ACTIVE_SELECTOR);
if (allReadyOpen && allReadyOpen !== target) {
return;
}
const data = Data.get(target, DATA_KEY) || new Offcanvas(target);
data.toggle(this);
});
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
SelectorEngine.find(OPEN_SELECTOR).forEach((el) =>
(Data.get(el, DATA_KEY) || new Offcanvas(el)).show()
);
});
/**
* ------------------------------------------------------------------------
* jQuery
* ------------------------------------------------------------------------
*/
defineJQueryPlugin(NAME, Offcanvas);
export default Offcanvas;

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): popover.js * Bootstrap (v5.0.0-beta3): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -136,7 +136,7 @@ class Popover extends Tooltip {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' ? config : null; const _config = typeof config === 'object' ? config : null;
if (!data && /dispose|hide/.test(config)) { if (!data && /dispose|hide/.test(config)) {
@ -145,7 +145,7 @@ class Popover extends Tooltip {
if (!data) { if (!data) {
data = new Popover(this, _config); data = new Popover(this, _config);
Data.setData(this, DATA_KEY, data); Data.set(this, DATA_KEY, data);
} }
if (typeof config === 'string') { if (typeof config === 'string') {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): scrollspy.js * Bootstrap (v5.0.0-beta3): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -68,7 +68,7 @@ const METHOD_POSITION = 'position';
class ScrollSpy extends BaseComponent { class ScrollSpy extends BaseComponent {
constructor(element, config) { constructor(element, config) {
super(element); super(element);
this._scrollElement = element.tagName === 'BODY' ? window : element; this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
this._config = this._getConfig(config); this._config = this._getConfig(config);
this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`; this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
this._offsets = []; this._offsets = [];
@ -276,7 +276,7 @@ class ScrollSpy extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data) { if (!data) {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): tab.js * Bootstrap (v5.0.0-beta3): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -10,6 +10,7 @@ import {
emulateTransitionEnd, emulateTransitionEnd,
getElementFromSelector, getElementFromSelector,
getTransitionDurationFromElement, getTransitionDurationFromElement,
isDisabled,
reflow, reflow,
} from './util/index'; } from './util/index';
import Data from './dom/data'; import Data from './dom/data';
@ -36,7 +37,6 @@ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'; const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
const CLASS_NAME_ACTIVE = 'active'; const CLASS_NAME_ACTIVE = 'active';
const CLASS_NAME_DISABLED = 'disabled';
const CLASS_NAME_FADE = 'fade'; const CLASS_NAME_FADE = 'fade';
const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SHOW = 'show';
@ -69,7 +69,7 @@ class Tab extends BaseComponent {
(this._element.parentNode && (this._element.parentNode &&
this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.parentNode.nodeType === Node.ELEMENT_NODE &&
this._element.classList.contains(CLASS_NAME_ACTIVE)) || this._element.classList.contains(CLASS_NAME_ACTIVE)) ||
this._element.classList.contains(CLASS_NAME_DISABLED) isDisabled(this._element)
) { ) {
return; return;
} }
@ -193,7 +193,7 @@ class Tab extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const data = Data.getData(this, DATA_KEY) || new Tab(this); const data = Data.get(this, DATA_KEY) || new Tab(this);
if (typeof config === 'string') { if (typeof config === 'string') {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
@ -215,7 +215,7 @@ class Tab extends BaseComponent {
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();
const data = Data.getData(this, DATA_KEY) || new Tab(this); const data = Data.get(this, DATA_KEY) || new Tab(this);
data.show(); data.show();
}); });

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): toast.js * Bootstrap (v5.0.0-beta3): toast.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -189,7 +189,7 @@ class Toast extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data) { if (!data) {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): tooltip.js * Bootstrap (v5.0.0-beta3): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -61,9 +61,9 @@ const DefaultType = {
const AttachmentMap = { const AttachmentMap = {
AUTO: 'auto', AUTO: 'auto',
TOP: 'top', TOP: 'top',
RIGHT: isRTL ? 'left' : 'right', RIGHT: isRTL() ? 'left' : 'right',
BOTTOM: 'bottom', BOTTOM: 'bottom',
LEFT: isRTL ? 'right' : 'left', LEFT: isRTL() ? 'right' : 'left',
}; };
const Default = { const Default = {
@ -279,15 +279,18 @@ class Tooltip extends BaseComponent {
this._addAttachmentClass(attachment); this._addAttachmentClass(attachment);
const container = this._getContainer(); const container = this._getContainer();
Data.setData(tip, this.constructor.DATA_KEY, this); Data.set(tip, this.constructor.DATA_KEY, this);
if (!this._element.ownerDocument.documentElement.contains(this.tip)) { if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
container.appendChild(tip); container.appendChild(tip);
EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
} }
EventHandler.trigger(this._element, this.constructor.Event.INSERTED); if (this._popper) {
this._popper.update();
} else {
this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment)); this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));
}
tip.classList.add(CLASS_NAME_SHOW); tip.classList.add(CLASS_NAME_SHOW);
@ -336,6 +339,10 @@ class Tooltip extends BaseComponent {
const tip = this.getTipElement(); const tip = this.getTipElement();
const complete = () => { const complete = () => {
if (this._isWithActiveTrigger()) {
return;
}
if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip); tip.parentNode.removeChild(tip);
} }
@ -474,11 +481,11 @@ class Tooltip extends BaseComponent {
_initializeOnDelegatedTarget(event, context) { _initializeOnDelegatedTarget(event, context) {
const dataKey = this.constructor.DATA_KEY; const dataKey = this.constructor.DATA_KEY;
context = context || Data.getData(event.delegateTarget, dataKey); context = context || Data.get(event.delegateTarget, dataKey);
if (!context) { if (!context) {
context = new this.constructor(event.delegateTarget, this._getDelegateConfig()); context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
Data.setData(event.delegateTarget, dataKey, context); Data.set(event.delegateTarget, dataKey, context);
} }
return context; return context;
@ -671,7 +678,9 @@ class Tooltip extends BaseComponent {
context = this._initializeOnDelegatedTarget(event, context); context = this._initializeOnDelegatedTarget(event, context);
if (event) { if (event) {
context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false; context._activeTrigger[
event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER
] = context._element.contains(event.relatedTarget);
} }
if (context._isWithActiveTrigger()) { if (context._isWithActiveTrigger()) {
@ -785,7 +794,7 @@ class Tooltip extends BaseComponent {
static jQueryInterface(config) { static jQueryInterface(config) {
return this.each(function () { return this.each(function () {
let data = Data.getData(this, DATA_KEY); let data = Data.get(this, DATA_KEY);
const _config = typeof config === 'object' && config; const _config = typeof config === 'object' && config;
if (!data && /dispose|hide/.test(config)) { if (!data && /dispose|hide/.test(config)) {

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/index.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -39,7 +39,20 @@ const getSelector = (element) => {
let selector = element.getAttribute('data-bs-target'); let selector = element.getAttribute('data-bs-target');
if (!selector || selector === '#') { if (!selector || selector === '#') {
const hrefAttr = element.getAttribute('href'); let hrefAttr = 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 (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) {
return null;
}
// Just in case some CMS puts out a full URL with the anchor appended
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
hrefAttr = '#' + hrefAttr.split('#')[1];
}
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null; selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
} }
@ -120,7 +133,7 @@ const typeCheckConfig = (componentName, config, configTypes) => {
const valueType = value && isElement(value) ? 'element' : toType(value); const valueType = value && isElement(value) ? 'element' : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error( throw new TypeError(
`${componentName.toUpperCase()}: ` + `${componentName.toUpperCase()}: ` +
`Option "${property}" provided type "${valueType}" ` + `Option "${property}" provided type "${valueType}" ` +
`but expected type "${expectedTypes}".` `but expected type "${expectedTypes}".`
@ -148,6 +161,22 @@ const isVisible = (element) => {
return false; return false;
}; };
const isDisabled = (element) => {
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true;
}
if (element.classList.contains('disabled')) {
return true;
}
if (typeof element.disabled !== 'undefined') {
return element.disabled;
}
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;
@ -193,7 +222,7 @@ const onDOMContentLoaded = (callback) => {
} }
}; };
const isRTL = document.documentElement.dir === 'rtl'; const isRTL = () => document.documentElement.dir === 'rtl';
const defineJQueryPlugin = (name, plugin) => { const defineJQueryPlugin = (name, plugin) => {
onDOMContentLoaded(() => { onDOMContentLoaded(() => {
@ -212,7 +241,6 @@ const defineJQueryPlugin = (name, plugin) => {
}; };
export { export {
TRANSITION_END,
getUID, getUID,
getSelectorFromElement, getSelectorFromElement,
getElementFromSelector, getElementFromSelector,
@ -222,6 +250,7 @@ export {
emulateTransitionEnd, emulateTransitionEnd,
typeCheckConfig, typeCheckConfig,
isVisible, isVisible,
isDisabled,
findShadowRoot, findShadowRoot,
noop, noop,
reflow, reflow,

View File

@ -1,6 +1,6 @@
/** /**
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta2): util/sanitizer.js * Bootstrap (v5.0.0-beta3): 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)
* -------------------------------------------------------------------------- * --------------------------------------------------------------------------
*/ */
@ -23,7 +23,7 @@ const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
* *
* Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
*/ */
const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/gi; const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
/** /**
* A pattern that matches safe data URLs. Only matches image, video and audio types. * A pattern that matches safe data URLs. Only matches image, video and audio types.
@ -38,7 +38,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
if (allowedAttributeList.includes(attrName)) { if (allowedAttributeList.includes(attrName)) {
if (uriAttrs.has(attrName)) { if (uriAttrs.has(attrName)) {
return Boolean( return Boolean(
attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN) SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue)
); );
} }
@ -49,7 +49,7 @@ const allowedAttribute = (attr, allowedAttributeList) => {
// Check if a regular expression validates the attribute. // Check if a regular expression validates the attribute.
for (let i = 0, len = regExp.length; i < len; i++) { for (let i = 0, len = regExp.length; i < len; i++) {
if (attrName.match(regExp[i])) { if (regExp[i].test(attrName)) {
return true; return true;
} }
} }

View File

@ -0,0 +1,72 @@
/**
* --------------------------------------------------------------------------
* Bootstrap (v5.0.0-beta3): util/scrollBar.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* --------------------------------------------------------------------------
*/
import SelectorEngine from '../dom/selector-engine';
import Manipulator from '../dom/manipulator';
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed';
const SELECTOR_STICKY_CONTENT = '.sticky-top';
const getWidth = () => {
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
const documentWidth = document.documentElement.clientWidth;
return Math.abs(window.innerWidth - documentWidth);
};
const hide = (width = getWidth()) => {
document.body.style.overflow = 'hidden';
_setElementAttributes(
SELECTOR_FIXED_CONTENT,
'paddingRight',
(calculatedValue) => calculatedValue + width
);
_setElementAttributes(
SELECTOR_STICKY_CONTENT,
'marginRight',
(calculatedValue) => calculatedValue - width
);
_setElementAttributes('body', 'paddingRight', (calculatedValue) => calculatedValue + width);
};
const _setElementAttributes = (selector, styleProp, callback) => {
const scrollbarWidth = getWidth();
SelectorEngine.find(selector).forEach((element) => {
if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
return;
}
const actualValue = element.style[styleProp];
const calculatedValue = window.getComputedStyle(element)[styleProp];
Manipulator.setDataAttribute(element, styleProp, actualValue);
element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px';
});
};
const reset = () => {
document.body.style.overflow = 'auto';
_resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
_resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
_resetElementAttributes('body', 'paddingRight');
};
const _resetElementAttributes = (selector, styleProp) => {
SelectorEngine.find(selector).forEach((element) => {
const value = Manipulator.getDataAttribute(element, styleProp);
if (typeof value === 'undefined' && element === document.body) {
element.style.removeProperty(styleProp);
} else {
Manipulator.removeDataAttribute(element, styleProp);
element.style[styleProp] = value;
}
});
};
const isBodyOverflowing = () => {
return getWidth() > 0;
};
export { getWidth, hide, isBodyOverflowing, reset };

View File

@ -153,7 +153,14 @@ class Dropdown extends BSDropdown {
_bindShowEvent() { _bindShowEvent() {
EventHandler.on(this._element, EVENT_SHOW, (e) => { EventHandler.on(this._element, EVENT_SHOW, (e) => {
EventHandler.trigger(this._element, EVENT_SHOW_MDB, { relatedTarget: e.relatedTarget }); const showEvent = EventHandler.trigger(this._element, EVENT_SHOW_MDB, {
relatedTarget: e.relatedTarget,
});
if (showEvent.defaultPrevented) {
e.preventDefault();
return;
}
this._dropdownAnimationStart('show'); this._dropdownAnimationStart('show');
}); });
@ -161,13 +168,27 @@ class Dropdown extends BSDropdown {
_bindShownEvent() { _bindShownEvent() {
EventHandler.on(this._parent, EVENT_SHOWN, (e) => { EventHandler.on(this._parent, EVENT_SHOWN, (e) => {
EventHandler.trigger(this._parent, EVENT_SHOWN_MDB, { relatedTarget: e.relatedTarget }); const shownEvent = EventHandler.trigger(this._parent, EVENT_SHOWN_MDB, {
relatedTarget: e.relatedTarget,
});
if (shownEvent.defaultPrevented) {
e.preventDefault();
return;
}
}); });
} }
_bindHideEvent() { _bindHideEvent() {
EventHandler.on(this._parent, EVENT_HIDE, (e) => { EventHandler.on(this._parent, EVENT_HIDE, (e) => {
EventHandler.trigger(this._parent, EVENT_HIDE_MDB, { relatedTarget: e.relatedTarget }); const hideEvent = EventHandler.trigger(this._parent, EVENT_HIDE_MDB, {
relatedTarget: e.relatedTarget,
});
if (hideEvent.defaultPrevented) {
e.preventDefault();
return;
}
this._menuStyle = this._menu.style.cssText; this._menuStyle = this._menu.style.cssText;
this._popperPlacement = this._menu.getAttribute('data-popper-placement'); this._popperPlacement = this._menu.getAttribute('data-popper-placement');
@ -177,7 +198,14 @@ class Dropdown extends BSDropdown {
_bindHiddenEvent() { _bindHiddenEvent() {
EventHandler.on(this._parent, EVENT_HIDDEN, (e) => { EventHandler.on(this._parent, EVENT_HIDDEN, (e) => {
EventHandler.trigger(this._parent, EVENT_HIDDEN_MDB, { relatedTarget: e.relatedTarget }); const hiddenEvent = EventHandler.trigger(this._parent, EVENT_HIDDEN_MDB, {
relatedTarget: e.relatedTarget,
});
if (hiddenEvent.defaultPrevented) {
e.preventDefault();
return;
}
if (this._config.display !== 'static' && this._menuStyle !== '') { if (this._config.display !== 'static' && this._menuStyle !== '') {
this._menu.style.cssText = this._menuStyle; this._menu.style.cssText = this._menuStyle;

View File

@ -1,6 +1,7 @@
// BOOTSTRAP CORE COMPONENTS // BOOTSTRAP CORE COMPONENTS
import Button from './free/button'; import Button from './free/button';
import Collapse from './bootstrap/mdb-prefix/collapse'; import Collapse from './bootstrap/mdb-prefix/collapse';
import Offcanvas from './bootstrap/mdb-prefix/offcanvas';
import Alert from './free/alert'; import Alert from './free/alert';
import Carousel from './free/carousel'; import Carousel from './free/carousel';
import Modal from './free/modal'; import Modal from './free/modal';
@ -21,6 +22,7 @@ export {
Button, Button,
Carousel, Carousel,
Collapse, Collapse,
Offcanvas,
Dropdown, Dropdown,
Input, Input,
Modal, Modal,

View File

@ -12,18 +12,15 @@
color: $accordion-button-color; color: $accordion-button-color;
text-align: left; // Reset button style text-align: left; // Reset button style
background-color: $accordion-button-bg; background-color: $accordion-button-bg;
border: $accordion-border-width solid $accordion-border-color; border: 0;
@include border-radius(0); @include border-radius(0);
overflow-anchor: none; overflow-anchor: none;
@include transition($accordion-transition); @include transition($accordion-transition);
&.collapsed {
border-bottom-width: 0;
}
&:not(.collapsed) { &:not(.collapsed) {
color: $accordion-button-active-color; color: $accordion-button-active-color;
background-color: $accordion-button-active-bg; background-color: $accordion-button-active-bg;
box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color;
&::after { &::after {
background-image: escape-svg($accordion-button-active-icon); background-image: escape-svg($accordion-button-active-icon);
@ -61,33 +58,35 @@
} }
.accordion-item { .accordion-item {
margin-bottom: -$accordion-border-width;
background-color: $accordion-bg;
border: $accordion-border-width solid $accordion-border-color;
&:first-of-type { &:first-of-type {
.accordion-button {
@include border-top-radius($accordion-border-radius); @include border-top-radius($accordion-border-radius);
}
}
&:last-of-type {
.accordion-button { .accordion-button {
@include border-top-radius($accordion-inner-border-radius);
}
}
// Only set a border-radius on the last item if the accordion is collapsed // Only set a border-radius on the last item if the accordion is collapsed
&:last-of-type {
margin-bottom: 0;
@include border-bottom-radius($accordion-border-radius);
.accordion-button {
&.collapsed { &.collapsed {
border-bottom-width: $accordion-border-width; @include border-bottom-radius($accordion-inner-border-radius);
@include border-bottom-radius($accordion-border-radius);
} }
} }
.accordion-collapse { .accordion-collapse {
border-bottom-width: $accordion-border-width;
@include border-bottom-radius($accordion-border-radius); @include border-bottom-radius($accordion-border-radius);
} }
} }
} }
.accordion-collapse {
border: solid $accordion-border-color;
border-width: 0 $accordion-border-width;
}
.accordion-body { .accordion-body {
padding: $accordion-body-padding-y $accordion-body-padding-x; padding: $accordion-body-padding-y $accordion-body-padding-x;
} }
@ -97,29 +96,24 @@
// Remove borders and border-radius to keep accordion items edge-to-edge. // Remove borders and border-radius to keep accordion items edge-to-edge.
.accordion-flush { .accordion-flush {
.accordion-button {
border-right: 0;
border-left: 0;
@include border-radius(0);
}
.accordion-collapse { .accordion-collapse {
border-width: 0; border-width: 0;
} }
.accordion-item { .accordion-item {
&:first-of-type { border-right: 0;
.accordion-button { border-left: 0;
border-top-width: 0; @include border-radius(0);
@include border-top-radius(0);
&:first-child {
border-top: 0;
} }
&:last-child {
border-bottom: 0;
} }
&:last-of-type { .accordion-button {
.accordion-button.collapsed { @include border-radius(0);
border-bottom-width: 0;
@include border-bottom-radius(0);
}
} }
} }
} }

View File

@ -54,6 +54,7 @@
// Alternate buttons // Alternate buttons
// //
// scss-docs-start btn-variant-loops
@each $color, $value in $theme-colors { @each $color, $value in $theme-colors {
.btn-#{$color} { .btn-#{$color} {
@include button-variant($value, $value); @include button-variant($value, $value);
@ -65,6 +66,7 @@
@include button-outline-variant($value); @include button-outline-variant($value);
} }
} }
// scss-docs-end btn-variant-loops
// //
// Link buttons // Link buttons

View File

@ -69,7 +69,6 @@
} }
+ .card-link { + .card-link {
/*!rtl:ignore*/
margin-left: $card-spacer-x; margin-left: $card-spacer-x;
} }
} }

View File

@ -74,15 +74,12 @@
// Allow for dropdowns to go bottom up (aka, dropup-menu) // Allow for dropdowns to go bottom up (aka, dropup-menu)
// Just add .dropup after the standard .dropdown class and you're set. // Just add .dropup after the standard .dropdown class and you're set.
.dropup { .dropup {
.dropdown-menu { .dropdown-menu[data-mdb-popper] {
top: auto; top: auto;
bottom: 100%; bottom: 100%;
&[data-mdb-popper] {
margin-top: 0; margin-top: 0;
margin-bottom: $dropdown-spacer; margin-bottom: $dropdown-spacer;
} }
}
.dropdown-toggle { .dropdown-toggle {
@include caret(up); @include caret(up);

View File

@ -12,6 +12,17 @@
@include border-radius($list-group-border-radius); @include border-radius($list-group-border-radius);
} }
.list-group-numbered {
list-style-type: none;
counter-reset: section;
> li::before {
// Increments only this instance of the section counter
content: counters(section, '.') '. ';
counter-increment: section;
}
}
// Interactive list items // Interactive list items
// //
// Use anchor or button elements instead of `li`s or `div`s to create interactive // Use anchor or button elements instead of `li`s or `div`s to create interactive

View File

@ -210,6 +210,7 @@
} }
} }
// scss-docs-start modal-fullscreen-loop
@each $breakpoint in map-keys($grid-breakpoints) { @each $breakpoint in map-keys($grid-breakpoints) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints); $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
$postfix: if($infix != '', $infix + '-down', ''); $postfix: if($infix != '', $infix + '-down', '');
@ -241,3 +242,4 @@
} }
} }
} }
// scss-docs-end modal-fullscreen-loop

View File

@ -115,6 +115,13 @@
} }
} }
.nav-fill,
.nav-justified {
.nav-item .nav-link {
width: 100%; // Make sure button will grow
}
}
// Tabbable tabs // Tabbable tabs
// //
// Hide tabbable panes to start, show them when `.active` // Hide tabbable panes to start, show them when `.active`

View File

@ -149,6 +149,7 @@
overflow-y: auto; overflow-y: auto;
} }
// scss-docs-start navbar-expand-loop
// Generate series of `.navbar-expand-*` responsive classes for configuring // Generate series of `.navbar-expand-*` responsive classes for configuring
// where your navbar collapses. // where your navbar collapses.
.navbar-expand { .navbar-expand {
@ -191,6 +192,7 @@
} }
} }
} }
// scss-docs-end navbar-expand-loop
// Navbar themes // Navbar themes
// //

View File

@ -0,0 +1,77 @@
.offcanvas {
position: fixed;
bottom: 0;
z-index: $zindex-offcanvas;
display: flex;
flex-direction: column;
max-width: 100%;
color: $offcanvas-color;
visibility: hidden;
background-color: $offcanvas-bg-color;
background-clip: padding-box;
outline: 0;
@include box-shadow($offcanvas-box-shadow);
@include transition(transform $offcanvas-transition-duration ease-in-out);
}
.offcanvas-header {
display: flex;
justify-content: space-between;
padding: $offcanvas-padding-y $offcanvas-padding-x;
.btn-close {
padding: ($offcanvas-padding-y / 2) ($offcanvas-padding-x / 2);
margin: ($offcanvas-padding-y / -2) ($offcanvas-padding-x / -2) ($offcanvas-padding-y / -2) auto;
}
}
.offcanvas-title {
margin-bottom: 0;
line-height: $offcanvas-title-line-height;
}
.offcanvas-body {
flex-grow: 1;
padding: $offcanvas-padding-y $offcanvas-padding-x;
overflow-y: auto;
}
.offcanvas-start {
top: 0;
left: 0;
width: $offcanvas-horizontal-width;
border-right: $offcanvas-border-width solid $offcanvas-border-color;
transform: translateX(-100%);
}
.offcanvas-end {
top: 0;
right: 0;
width: $offcanvas-horizontal-width;
border-left: $offcanvas-border-width solid $offcanvas-border-color;
transform: translateX(100%);
}
.offcanvas-bottom {
right: 0;
left: 0;
height: $offcanvas-vertical-height;
max-height: 100%;
border-top: $offcanvas-border-width solid $offcanvas-border-color;
transform: translateY(100%);
}
.offcanvas.show {
transform: none;
}
.offcanvas-backdrop::before {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-offcanvas - 1;
width: 100vw;
height: 100vh;
content: '';
background-color: $offcanvas-body-backdrop-color;
}

View File

@ -1,4 +1,6 @@
// Disable animation if transitions are disabled // Disable animation if transitions are disabled
// scss-docs-start progress-keyframes
@if $enable-transitions { @if $enable-transitions {
@keyframes progress-bar-stripes { @keyframes progress-bar-stripes {
0% { 0% {
@ -6,6 +8,7 @@
} }
} }
} }
// scss-docs-end progress-keyframes
.progress { .progress {
display: flex; display: flex;

View File

@ -52,19 +52,6 @@ body {
-webkit-tap-highlight-color: rgba($black, 0); // 4 -webkit-tap-highlight-color: rgba($black, 0); // 4
} }
// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline
// on elements that programmatically receive focus but wouldn't normally show a visible
// focus outline. In general, this would mean that the outline is only applied if the
// interaction that led to the element receiving programmatic focus was a keyboard interaction,
// or the browser has somehow determined that the user is primarily a keyboard user and/or
// wants focus outlines to always be presented.
// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/
[tabindex='-1']:focus:not(:focus-visible) {
outline: 0 !important;
}
// Content grouping // Content grouping
// //
// 1. Reset Firefox's gray color // 1. Reset Firefox's gray color
@ -148,7 +135,6 @@ p {
abbr[title], abbr[title],
abbr[data-mdb-original-title] { abbr[data-mdb-original-title] {
// 1 // 1
text-decoration: underline; // 2
text-decoration: underline dotted; // 2 text-decoration: underline dotted; // 2
cursor: help; // 3 cursor: help; // 3
text-decoration-skip-ink: none; // 4 text-decoration-skip-ink: none; // 4
@ -418,12 +404,10 @@ textarea {
} }
// Remove the inheritance of text transform in Firefox // Remove the inheritance of text transform in Firefox
button, button,
select { select {
text-transform: none; text-transform: none;
} }
// Set the cursor for non-`<button>` buttons // Set the cursor for non-`<button>` buttons
// //
// Details at https://github.com/twbs/bootstrap/pull/30562 // Details at https://github.com/twbs/bootstrap/pull/30562
@ -431,11 +415,15 @@ select {
cursor: pointer; cursor: pointer;
} }
select {
// Remove the inheritance of word-wrap in Safari. // Remove the inheritance of word-wrap in Safari.
// See https://github.com/twbs/bootstrap/issues/24990 // See https://github.com/twbs/bootstrap/issues/24990
select {
word-wrap: normal; word-wrap: normal;
// Undo the opacity change from Chrome
&:disabled {
opacity: 1;
}
} }
// Remove the dropdown arrow in Chrome from inputs built with datalists. // Remove the dropdown arrow in Chrome from inputs built with datalists.
@ -565,7 +553,6 @@ legend {
// Inherit font family and line height for file input buttons // Inherit font family and line height for file input buttons
// stylelint-disable-next-line selector-pseudo-element-no-unknown
::file-selector-button { ::file-selector-button {
font: inherit; font: inherit;
} }

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