bootstrap 5.0.0.alpha2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/README.md +7 -4
- data/assets/javascripts/bootstrap-global-this-define.js +6 -0
- data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
- data/assets/javascripts/bootstrap-sprockets.js +10 -7
- data/assets/javascripts/bootstrap.js +2554 -2564
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/javascripts/bootstrap/alert.js +119 -115
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +67 -69
- data/assets/javascripts/bootstrap/carousel.js +340 -331
- data/assets/javascripts/bootstrap/collapse.js +214 -209
- data/assets/javascripts/bootstrap/dom/data.js +35 -48
- data/assets/javascripts/bootstrap/dom/event-handler.js +105 -98
- data/assets/javascripts/bootstrap/dom/manipulator.js +26 -34
- data/assets/javascripts/bootstrap/dom/selector-engine.js +28 -41
- data/assets/javascripts/bootstrap/dropdown.js +392 -325
- data/assets/javascripts/bootstrap/modal.js +492 -434
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +114 -132
- data/assets/javascripts/bootstrap/scrollspy.js +172 -180
- data/assets/javascripts/bootstrap/tab.js +168 -144
- data/assets/javascripts/bootstrap/toast.js +141 -150
- data/assets/javascripts/bootstrap/tooltip.js +466 -452
- data/assets/stylesheets/_bootstrap-grid.scss +9 -9
- data/assets/stylesheets/_bootstrap-reboot.scss +3 -3
- data/assets/stylesheets/_bootstrap.scss +5 -3
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +10 -3
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +2 -4
- data/assets/stylesheets/bootstrap/_button-group.scss +5 -7
- data/assets/stylesheets/bootstrap/_buttons.scss +2 -15
- data/assets/stylesheets/bootstrap/_card.scss +2 -29
- data/assets/stylesheets/bootstrap/_carousel.scss +35 -18
- data/assets/stylesheets/bootstrap/_close.scss +2 -3
- data/assets/stylesheets/bootstrap/_dropdown.scss +33 -29
- data/assets/stylesheets/bootstrap/_forms.scss +1 -1
- data/assets/stylesheets/bootstrap/_functions.scss +11 -12
- data/assets/stylesheets/bootstrap/_list-group.scss +23 -6
- data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
- data/assets/stylesheets/bootstrap/_modal.scss +2 -9
- data/assets/stylesheets/bootstrap/_nav.scss +12 -0
- data/assets/stylesheets/bootstrap/_navbar.scss +15 -2
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +3 -3
- data/assets/stylesheets/bootstrap/_popover.scss +10 -22
- data/assets/stylesheets/bootstrap/_progress.scss +4 -1
- data/assets/stylesheets/bootstrap/_reboot.scss +48 -44
- data/assets/stylesheets/bootstrap/_root.scss +5 -5
- data/assets/stylesheets/bootstrap/_spinners.scss +18 -5
- data/assets/stylesheets/bootstrap/_tables.scss +15 -16
- data/assets/stylesheets/bootstrap/_toasts.scss +15 -12
- data/assets/stylesheets/bootstrap/_tooltip.scss +12 -12
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -0
- data/assets/stylesheets/bootstrap/_utilities.scss +133 -70
- data/assets/stylesheets/bootstrap/_variables.scss +363 -207
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +5 -5
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +21 -11
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +112 -9
- data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -46
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +1 -16
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +21 -40
- data/assets/stylesheets/bootstrap/forms/_validation.scss +1 -1
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +3 -1
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +8 -6
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +10 -5
- data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -6
- data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
- data/assets/stylesheets/bootstrap/mixins/_container.scss +2 -4
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +26 -22
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +5 -1
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +18 -13
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +3 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +5 -3
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +7 -7
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +19 -0
- data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +3 -2
- data/assets/stylesheets/bootstrap/utilities/_api.scss +1 -1
- data/bootstrap.gemspec +1 -3
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +7 -1
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -3
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- metadata +20 -40
- data/assets/javascripts/bootstrap/dom/polyfill.js +0 -110
- data/assets/stylesheets/bootstrap/forms/_form-file.scss +0 -91
- data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap manipulator.js v5.0.0
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap manipulator.js v5.0.0 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
4
4
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
@@ -9,11 +9,9 @@
|
|
|
9
9
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Manipulator = factory());
|
|
10
10
|
}(this, (function () { 'use strict';
|
|
11
11
|
|
|
12
|
-
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); }
|
|
13
|
-
|
|
14
12
|
/**
|
|
15
13
|
* --------------------------------------------------------------------------
|
|
16
|
-
* Bootstrap (v5.0.0
|
|
14
|
+
* Bootstrap (v5.0.0): dom/manipulator.js
|
|
17
15
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
18
16
|
* --------------------------------------------------------------------------
|
|
19
17
|
*/
|
|
@@ -38,57 +36,51 @@
|
|
|
38
36
|
}
|
|
39
37
|
|
|
40
38
|
function normalizeDataKey(key) {
|
|
41
|
-
return key.replace(/[A-Z]/g,
|
|
42
|
-
return "-" + chr.toLowerCase();
|
|
43
|
-
});
|
|
39
|
+
return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
|
|
44
40
|
}
|
|
45
41
|
|
|
46
|
-
|
|
47
|
-
setDataAttribute
|
|
48
|
-
element.setAttribute(
|
|
42
|
+
const Manipulator = {
|
|
43
|
+
setDataAttribute(element, key, value) {
|
|
44
|
+
element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
|
|
49
45
|
},
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
|
|
47
|
+
removeDataAttribute(element, key) {
|
|
48
|
+
element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
|
|
52
49
|
},
|
|
53
|
-
|
|
50
|
+
|
|
51
|
+
getDataAttributes(element) {
|
|
54
52
|
if (!element) {
|
|
55
53
|
return {};
|
|
56
54
|
}
|
|
57
55
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
const attributes = {};
|
|
57
|
+
Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
|
|
58
|
+
let pureKey = key.replace(/^bs/, '');
|
|
59
|
+
pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
|
|
60
|
+
attributes[pureKey] = normalizeData(element.dataset[key]);
|
|
62
61
|
});
|
|
63
62
|
return attributes;
|
|
64
63
|
},
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
|
|
65
|
+
getDataAttribute(element, key) {
|
|
66
|
+
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
|
|
67
67
|
},
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
|
|
69
|
+
offset(element) {
|
|
70
|
+
const rect = element.getBoundingClientRect();
|
|
70
71
|
return {
|
|
71
72
|
top: rect.top + document.body.scrollTop,
|
|
72
73
|
left: rect.left + document.body.scrollLeft
|
|
73
74
|
};
|
|
74
75
|
},
|
|
75
|
-
|
|
76
|
+
|
|
77
|
+
position(element) {
|
|
76
78
|
return {
|
|
77
79
|
top: element.offsetTop,
|
|
78
80
|
left: element.offsetLeft
|
|
79
81
|
};
|
|
80
|
-
},
|
|
81
|
-
toggleClass: function toggleClass(element, className) {
|
|
82
|
-
if (!element) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (element.classList.contains(className)) {
|
|
87
|
-
element.classList.remove(className);
|
|
88
|
-
} else {
|
|
89
|
-
element.classList.add(className);
|
|
90
|
-
}
|
|
91
82
|
}
|
|
83
|
+
|
|
92
84
|
};
|
|
93
85
|
|
|
94
86
|
return Manipulator;
|
|
@@ -1,62 +1,46 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap selector-engine.js v5.0.0
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap selector-engine.js v5.0.0 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
4
4
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
7
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(
|
|
8
|
-
typeof define === 'function' && define.amd ? define(
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(
|
|
10
|
-
}(this, (function (
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory());
|
|
10
|
+
}(this, (function () { 'use strict';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* --------------------------------------------------------------------------
|
|
14
|
-
* Bootstrap (v5.0.0
|
|
14
|
+
* Bootstrap (v5.0.0): dom/selector-engine.js
|
|
15
15
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
16
16
|
* --------------------------------------------------------------------------
|
|
17
17
|
*/
|
|
18
|
+
|
|
18
19
|
/**
|
|
19
20
|
* ------------------------------------------------------------------------
|
|
20
21
|
* Constants
|
|
21
22
|
* ------------------------------------------------------------------------
|
|
22
23
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return element.matches(selector);
|
|
24
|
+
const NODE_TEXT = 3;
|
|
25
|
+
const SelectorEngine = {
|
|
26
|
+
find(selector, element = document.documentElement) {
|
|
27
|
+
return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
|
|
28
28
|
},
|
|
29
|
-
find: function find(selector, element) {
|
|
30
|
-
var _ref;
|
|
31
29
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return (_ref = []).concat.apply(_ref, polyfill_js.find.call(element, selector));
|
|
30
|
+
findOne(selector, element = document.documentElement) {
|
|
31
|
+
return Element.prototype.querySelector.call(element, selector);
|
|
37
32
|
},
|
|
38
|
-
findOne: function findOne(selector, element) {
|
|
39
|
-
if (element === void 0) {
|
|
40
|
-
element = document.documentElement;
|
|
41
|
-
}
|
|
42
33
|
|
|
43
|
-
|
|
34
|
+
children(element, selector) {
|
|
35
|
+
return [].concat(...element.children).filter(child => child.matches(selector));
|
|
44
36
|
},
|
|
45
|
-
children: function children(element, selector) {
|
|
46
|
-
var _ref2;
|
|
47
37
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return child.matches(selector);
|
|
52
|
-
});
|
|
53
|
-
},
|
|
54
|
-
parents: function parents(element, selector) {
|
|
55
|
-
var parents = [];
|
|
56
|
-
var ancestor = element.parentNode;
|
|
38
|
+
parents(element, selector) {
|
|
39
|
+
const parents = [];
|
|
40
|
+
let ancestor = element.parentNode;
|
|
57
41
|
|
|
58
42
|
while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
|
|
59
|
-
if (
|
|
43
|
+
if (ancestor.matches(selector)) {
|
|
60
44
|
parents.push(ancestor);
|
|
61
45
|
}
|
|
62
46
|
|
|
@@ -65,8 +49,9 @@
|
|
|
65
49
|
|
|
66
50
|
return parents;
|
|
67
51
|
},
|
|
68
|
-
|
|
69
|
-
|
|
52
|
+
|
|
53
|
+
prev(element, selector) {
|
|
54
|
+
let previous = element.previousElementSibling;
|
|
70
55
|
|
|
71
56
|
while (previous) {
|
|
72
57
|
if (previous.matches(selector)) {
|
|
@@ -78,11 +63,12 @@
|
|
|
78
63
|
|
|
79
64
|
return [];
|
|
80
65
|
},
|
|
81
|
-
|
|
82
|
-
|
|
66
|
+
|
|
67
|
+
next(element, selector) {
|
|
68
|
+
let next = element.nextElementSibling;
|
|
83
69
|
|
|
84
70
|
while (next) {
|
|
85
|
-
if (
|
|
71
|
+
if (next.matches(selector)) {
|
|
86
72
|
return [next];
|
|
87
73
|
}
|
|
88
74
|
|
|
@@ -91,6 +77,7 @@
|
|
|
91
77
|
|
|
92
78
|
return [];
|
|
93
79
|
}
|
|
80
|
+
|
|
94
81
|
};
|
|
95
82
|
|
|
96
83
|
return SelectorEngine;
|
|
@@ -1,164 +1,235 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap dropdown.js v5.0.0
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap dropdown.js v5.0.0 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
4
4
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
7
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['./dom/data
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Data, global.EventHandler, global.Manipulator, global.
|
|
10
|
-
}(this, (function (Data, EventHandler, Manipulator,
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Popper, global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
|
10
|
+
}(this, (function (Popper, Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
|
11
11
|
|
|
12
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
13
|
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
Object.keys(e).forEach(function (k) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return e[k];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
n['default'] = e;
|
|
31
|
+
return Object.freeze(n);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
|
|
14
35
|
var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
|
|
15
36
|
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
16
37
|
var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
17
|
-
var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
|
|
18
38
|
var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
39
|
+
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
19
40
|
|
|
20
41
|
/**
|
|
21
42
|
* --------------------------------------------------------------------------
|
|
22
|
-
* Bootstrap (v5.0.0
|
|
43
|
+
* Bootstrap (v5.0.0): util/index.js
|
|
23
44
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
24
45
|
* --------------------------------------------------------------------------
|
|
25
46
|
*/
|
|
26
47
|
|
|
27
|
-
|
|
48
|
+
const toType = obj => {
|
|
28
49
|
if (obj === null || obj === undefined) {
|
|
29
|
-
return
|
|
50
|
+
return `${obj}`;
|
|
30
51
|
}
|
|
31
52
|
|
|
32
53
|
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
33
54
|
};
|
|
34
55
|
|
|
35
|
-
|
|
36
|
-
|
|
56
|
+
const getSelector = element => {
|
|
57
|
+
let selector = element.getAttribute('data-bs-target');
|
|
37
58
|
|
|
38
59
|
if (!selector || selector === '#') {
|
|
39
|
-
|
|
60
|
+
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
61
|
+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
62
|
+
// `document.querySelector` will rightfully complain it is invalid.
|
|
63
|
+
// See https://github.com/twbs/bootstrap/issues/32273
|
|
64
|
+
|
|
65
|
+
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
66
|
+
return null;
|
|
67
|
+
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
71
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
40
74
|
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
41
75
|
}
|
|
42
76
|
|
|
43
77
|
return selector;
|
|
44
78
|
};
|
|
45
79
|
|
|
46
|
-
|
|
47
|
-
|
|
80
|
+
const getElementFromSelector = element => {
|
|
81
|
+
const selector = getSelector(element);
|
|
48
82
|
return selector ? document.querySelector(selector) : null;
|
|
49
83
|
};
|
|
50
84
|
|
|
51
|
-
|
|
52
|
-
return (obj[0] || obj).nodeType;
|
|
53
|
-
};
|
|
85
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
|
54
86
|
|
|
55
|
-
|
|
56
|
-
Object.keys(configTypes).forEach(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
87
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
88
|
+
Object.keys(configTypes).forEach(property => {
|
|
89
|
+
const expectedTypes = configTypes[property];
|
|
90
|
+
const value = config[property];
|
|
91
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
60
92
|
|
|
61
93
|
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
62
|
-
throw new
|
|
94
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
63
95
|
}
|
|
64
96
|
});
|
|
65
97
|
};
|
|
66
98
|
|
|
67
|
-
|
|
99
|
+
const isVisible = element => {
|
|
68
100
|
if (!element) {
|
|
69
101
|
return false;
|
|
70
102
|
}
|
|
71
103
|
|
|
72
104
|
if (element.style && element.parentNode && element.parentNode.style) {
|
|
73
|
-
|
|
74
|
-
|
|
105
|
+
const elementStyle = getComputedStyle(element);
|
|
106
|
+
const parentNodeStyle = getComputedStyle(element.parentNode);
|
|
75
107
|
return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
|
|
76
108
|
}
|
|
77
109
|
|
|
78
110
|
return false;
|
|
79
111
|
};
|
|
80
112
|
|
|
81
|
-
|
|
82
|
-
|
|
113
|
+
const isDisabled = element => {
|
|
114
|
+
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (element.classList.contains('disabled')) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (typeof element.disabled !== 'undefined') {
|
|
123
|
+
return element.disabled;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
|
83
127
|
};
|
|
84
128
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
129
|
+
const noop = () => {};
|
|
130
|
+
|
|
131
|
+
const getjQuery = () => {
|
|
132
|
+
const {
|
|
133
|
+
jQuery
|
|
134
|
+
} = window;
|
|
88
135
|
|
|
89
|
-
if (jQuery && !document.body.hasAttribute('data-no-jquery')) {
|
|
136
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
90
137
|
return jQuery;
|
|
91
138
|
}
|
|
92
139
|
|
|
93
140
|
return null;
|
|
94
141
|
};
|
|
95
142
|
|
|
96
|
-
|
|
143
|
+
const onDOMContentLoaded = callback => {
|
|
144
|
+
if (document.readyState === 'loading') {
|
|
145
|
+
document.addEventListener('DOMContentLoaded', callback);
|
|
146
|
+
} else {
|
|
147
|
+
callback();
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const isRTL = () => document.documentElement.dir === 'rtl';
|
|
97
152
|
|
|
98
|
-
|
|
153
|
+
const defineJQueryPlugin = (name, plugin) => {
|
|
154
|
+
onDOMContentLoaded(() => {
|
|
155
|
+
const $ = getjQuery();
|
|
156
|
+
/* istanbul ignore if */
|
|
99
157
|
|
|
100
|
-
|
|
158
|
+
if ($) {
|
|
159
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
160
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
161
|
+
$.fn[name].Constructor = plugin;
|
|
162
|
+
|
|
163
|
+
$.fn[name].noConflict = () => {
|
|
164
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
165
|
+
return plugin.jQueryInterface;
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* --------------------------------------------------------------------------
|
|
173
|
+
* Bootstrap (v5.0.0): dropdown.js
|
|
174
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
175
|
+
* --------------------------------------------------------------------------
|
|
176
|
+
*/
|
|
101
177
|
/**
|
|
102
178
|
* ------------------------------------------------------------------------
|
|
103
179
|
* Constants
|
|
104
180
|
* ------------------------------------------------------------------------
|
|
105
181
|
*/
|
|
106
182
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
var PLACEMENT_RIGHT = 'right-start';
|
|
146
|
-
var PLACEMENT_LEFT = 'left-start';
|
|
147
|
-
var Default = {
|
|
148
|
-
offset: 0,
|
|
149
|
-
flip: true,
|
|
150
|
-
boundary: 'scrollParent',
|
|
183
|
+
const NAME = 'dropdown';
|
|
184
|
+
const DATA_KEY = 'bs.dropdown';
|
|
185
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
186
|
+
const DATA_API_KEY = '.data-api';
|
|
187
|
+
const ESCAPE_KEY = 'Escape';
|
|
188
|
+
const SPACE_KEY = 'Space';
|
|
189
|
+
const TAB_KEY = 'Tab';
|
|
190
|
+
const ARROW_UP_KEY = 'ArrowUp';
|
|
191
|
+
const ARROW_DOWN_KEY = 'ArrowDown';
|
|
192
|
+
const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
|
|
193
|
+
|
|
194
|
+
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`);
|
|
195
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
196
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
197
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
198
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
199
|
+
const EVENT_CLICK = `click${EVENT_KEY}`;
|
|
200
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
201
|
+
const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
|
|
202
|
+
const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
|
|
203
|
+
const CLASS_NAME_SHOW = 'show';
|
|
204
|
+
const CLASS_NAME_DROPUP = 'dropup';
|
|
205
|
+
const CLASS_NAME_DROPEND = 'dropend';
|
|
206
|
+
const CLASS_NAME_DROPSTART = 'dropstart';
|
|
207
|
+
const CLASS_NAME_NAVBAR = 'navbar';
|
|
208
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
|
|
209
|
+
const SELECTOR_MENU = '.dropdown-menu';
|
|
210
|
+
const SELECTOR_NAVBAR_NAV = '.navbar-nav';
|
|
211
|
+
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
|
|
212
|
+
const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
|
|
213
|
+
const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
|
|
214
|
+
const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
|
|
215
|
+
const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
|
|
216
|
+
const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
|
|
217
|
+
const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
|
|
218
|
+
const Default = {
|
|
219
|
+
offset: [0, 2],
|
|
220
|
+
boundary: 'clippingParents',
|
|
151
221
|
reference: 'toggle',
|
|
152
222
|
display: 'dynamic',
|
|
153
|
-
popperConfig: null
|
|
223
|
+
popperConfig: null,
|
|
224
|
+
autoClose: true
|
|
154
225
|
};
|
|
155
|
-
|
|
156
|
-
offset: '(
|
|
157
|
-
flip: 'boolean',
|
|
226
|
+
const DefaultType = {
|
|
227
|
+
offset: '(array|string|function)',
|
|
158
228
|
boundary: '(string|element)',
|
|
159
|
-
reference: '(string|element)',
|
|
229
|
+
reference: '(string|element|object)',
|
|
160
230
|
display: 'string',
|
|
161
|
-
popperConfig: '(null|object)'
|
|
231
|
+
popperConfig: '(null|object|function)',
|
|
232
|
+
autoClose: '(boolean|string)'
|
|
162
233
|
};
|
|
163
234
|
/**
|
|
164
235
|
* ------------------------------------------------------------------------
|
|
@@ -166,61 +237,70 @@
|
|
|
166
237
|
* ------------------------------------------------------------------------
|
|
167
238
|
*/
|
|
168
239
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
240
|
+
class Dropdown extends BaseComponent__default['default'] {
|
|
241
|
+
constructor(element, config) {
|
|
242
|
+
super(element);
|
|
172
243
|
this._popper = null;
|
|
173
244
|
this._config = this._getConfig(config);
|
|
174
245
|
this._menu = this._getMenuElement();
|
|
175
246
|
this._inNavbar = this._detectNavbar();
|
|
176
247
|
|
|
177
248
|
this._addEventListeners();
|
|
178
|
-
|
|
179
|
-
Data__default['default'].setData(element, DATA_KEY, this);
|
|
180
249
|
} // Getters
|
|
181
250
|
|
|
182
251
|
|
|
183
|
-
|
|
252
|
+
static get Default() {
|
|
253
|
+
return Default;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static get DefaultType() {
|
|
257
|
+
return DefaultType;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
static get DATA_KEY() {
|
|
261
|
+
return DATA_KEY;
|
|
262
|
+
} // Public
|
|
263
|
+
|
|
184
264
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
|
|
265
|
+
toggle() {
|
|
266
|
+
if (isDisabled(this._element)) {
|
|
188
267
|
return;
|
|
189
268
|
}
|
|
190
269
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
Dropdown.clearMenus();
|
|
270
|
+
const isActive = this._element.classList.contains(CLASS_NAME_SHOW);
|
|
194
271
|
|
|
195
272
|
if (isActive) {
|
|
273
|
+
this.hide();
|
|
196
274
|
return;
|
|
197
275
|
}
|
|
198
276
|
|
|
199
277
|
this.show();
|
|
200
|
-
}
|
|
278
|
+
}
|
|
201
279
|
|
|
202
|
-
|
|
203
|
-
if (this._element
|
|
280
|
+
show() {
|
|
281
|
+
if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
|
|
204
282
|
return;
|
|
205
283
|
}
|
|
206
284
|
|
|
207
|
-
|
|
208
|
-
|
|
285
|
+
const parent = Dropdown.getParentFromElement(this._element);
|
|
286
|
+
const relatedTarget = {
|
|
209
287
|
relatedTarget: this._element
|
|
210
288
|
};
|
|
211
|
-
|
|
289
|
+
const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
|
|
212
290
|
|
|
213
291
|
if (showEvent.defaultPrevented) {
|
|
214
292
|
return;
|
|
215
|
-
} //
|
|
293
|
+
} // Totally disable Popper for Dropdowns in Navbar
|
|
216
294
|
|
|
217
295
|
|
|
218
|
-
if (
|
|
219
|
-
|
|
220
|
-
|
|
296
|
+
if (this._inNavbar) {
|
|
297
|
+
Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'none');
|
|
298
|
+
} else {
|
|
299
|
+
if (typeof Popper__namespace === 'undefined') {
|
|
300
|
+
throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
|
|
221
301
|
}
|
|
222
302
|
|
|
223
|
-
|
|
303
|
+
let referenceElement = this._element;
|
|
224
304
|
|
|
225
305
|
if (this._config.reference === 'parent') {
|
|
226
306
|
referenceElement = parent;
|
|
@@ -230,16 +310,18 @@
|
|
|
230
310
|
if (typeof this._config.reference.jquery !== 'undefined') {
|
|
231
311
|
referenceElement = this._config.reference[0];
|
|
232
312
|
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
|
|
313
|
+
} else if (typeof this._config.reference === 'object') {
|
|
314
|
+
referenceElement = this._config.reference;
|
|
315
|
+
}
|
|
236
316
|
|
|
317
|
+
const popperConfig = this._getPopperConfig();
|
|
237
318
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
319
|
+
const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
|
|
320
|
+
this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
|
|
241
321
|
|
|
242
|
-
|
|
322
|
+
if (isDisplayStatic) {
|
|
323
|
+
Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
|
|
324
|
+
}
|
|
243
325
|
} // If this is a touch-enabled device we add extra
|
|
244
326
|
// empty mouseover listeners to the body's immediate children;
|
|
245
327
|
// only needed because of broken event delegation on iOS
|
|
@@ -247,50 +329,33 @@
|
|
|
247
329
|
|
|
248
330
|
|
|
249
331
|
if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
(_ref = []).concat.apply(_ref, document.body.children).forEach(function (elem) {
|
|
253
|
-
return EventHandler__default['default'].on(elem, 'mouseover', null, noop());
|
|
254
|
-
});
|
|
332
|
+
[].concat(...document.body.children).forEach(elem => EventHandler__default['default'].on(elem, 'mouseover', noop));
|
|
255
333
|
}
|
|
256
334
|
|
|
257
335
|
this._element.focus();
|
|
258
336
|
|
|
259
337
|
this._element.setAttribute('aria-expanded', true);
|
|
260
338
|
|
|
261
|
-
|
|
262
|
-
Manipulator__default['default'].toggleClass(this._element, CLASS_NAME_SHOW);
|
|
263
|
-
EventHandler__default['default'].trigger(parent, EVENT_SHOWN, relatedTarget);
|
|
264
|
-
};
|
|
339
|
+
this._menu.classList.toggle(CLASS_NAME_SHOW);
|
|
265
340
|
|
|
266
|
-
|
|
267
|
-
if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
341
|
+
this._element.classList.toggle(CLASS_NAME_SHOW);
|
|
270
342
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
relatedTarget: this._element
|
|
274
|
-
};
|
|
275
|
-
var hideEvent = EventHandler__default['default'].trigger(parent, EVENT_HIDE, relatedTarget);
|
|
343
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
|
|
344
|
+
}
|
|
276
345
|
|
|
277
|
-
|
|
346
|
+
hide() {
|
|
347
|
+
if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
|
|
278
348
|
return;
|
|
279
349
|
}
|
|
280
350
|
|
|
281
|
-
|
|
282
|
-
this.
|
|
283
|
-
}
|
|
351
|
+
const relatedTarget = {
|
|
352
|
+
relatedTarget: this._element
|
|
353
|
+
};
|
|
284
354
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
EventHandler__default['default'].trigger(parent, EVENT_HIDDEN, relatedTarget);
|
|
288
|
-
};
|
|
355
|
+
this._completeHide(relatedTarget);
|
|
356
|
+
}
|
|
289
357
|
|
|
290
|
-
|
|
291
|
-
Data__default['default'].removeData(this._element, DATA_KEY);
|
|
292
|
-
EventHandler__default['default'].off(this._element, EVENT_KEY);
|
|
293
|
-
this._element = null;
|
|
358
|
+
dispose() {
|
|
294
359
|
this._menu = null;
|
|
295
360
|
|
|
296
361
|
if (this._popper) {
|
|
@@ -298,108 +363,169 @@
|
|
|
298
363
|
|
|
299
364
|
this._popper = null;
|
|
300
365
|
}
|
|
301
|
-
};
|
|
302
366
|
|
|
303
|
-
|
|
367
|
+
super.dispose();
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
update() {
|
|
304
371
|
this._inNavbar = this._detectNavbar();
|
|
305
372
|
|
|
306
373
|
if (this._popper) {
|
|
307
|
-
this._popper.
|
|
374
|
+
this._popper.update();
|
|
308
375
|
}
|
|
309
376
|
} // Private
|
|
310
|
-
;
|
|
311
377
|
|
|
312
|
-
_proto._addEventListeners = function _addEventListeners() {
|
|
313
|
-
var _this = this;
|
|
314
378
|
|
|
315
|
-
|
|
379
|
+
_addEventListeners() {
|
|
380
|
+
EventHandler__default['default'].on(this._element, EVENT_CLICK, event => {
|
|
316
381
|
event.preventDefault();
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
_this.toggle();
|
|
382
|
+
this.toggle();
|
|
320
383
|
});
|
|
321
|
-
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
_completeHide(relatedTarget) {
|
|
387
|
+
const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
|
|
388
|
+
|
|
389
|
+
if (hideEvent.defaultPrevented) {
|
|
390
|
+
return;
|
|
391
|
+
} // If this is a touch-enabled device we remove the extra
|
|
392
|
+
// empty mouseover listeners we added for iOS support
|
|
322
393
|
|
|
323
|
-
|
|
324
|
-
|
|
394
|
+
|
|
395
|
+
if ('ontouchstart' in document.documentElement) {
|
|
396
|
+
[].concat(...document.body.children).forEach(elem => EventHandler__default['default'].off(elem, 'mouseover', noop));
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (this._popper) {
|
|
400
|
+
this._popper.destroy();
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
this._menu.classList.remove(CLASS_NAME_SHOW);
|
|
404
|
+
|
|
405
|
+
this._element.classList.remove(CLASS_NAME_SHOW);
|
|
406
|
+
|
|
407
|
+
this._element.setAttribute('aria-expanded', 'false');
|
|
408
|
+
|
|
409
|
+
Manipulator__default['default'].removeDataAttribute(this._menu, 'popper');
|
|
410
|
+
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
_getConfig(config) {
|
|
414
|
+
config = { ...this.constructor.Default,
|
|
415
|
+
...Manipulator__default['default'].getDataAttributes(this._element),
|
|
416
|
+
...config
|
|
417
|
+
};
|
|
325
418
|
typeCheckConfig(NAME, config, this.constructor.DefaultType);
|
|
419
|
+
|
|
420
|
+
if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
|
|
421
|
+
// Popper virtual elements require a getBoundingClientRect method
|
|
422
|
+
throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
|
|
423
|
+
}
|
|
424
|
+
|
|
326
425
|
return config;
|
|
327
|
-
}
|
|
426
|
+
}
|
|
328
427
|
|
|
329
|
-
|
|
428
|
+
_getMenuElement() {
|
|
330
429
|
return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
|
|
331
|
-
}
|
|
430
|
+
}
|
|
332
431
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
var placement = PLACEMENT_BOTTOM; // Handle dropup
|
|
432
|
+
_getPlacement() {
|
|
433
|
+
const parentDropdown = this._element.parentNode;
|
|
336
434
|
|
|
337
|
-
if (parentDropdown.classList.contains(
|
|
338
|
-
|
|
435
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
|
|
436
|
+
return PLACEMENT_RIGHT;
|
|
437
|
+
}
|
|
339
438
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
439
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
|
|
440
|
+
return PLACEMENT_LEFT;
|
|
441
|
+
} // We need to trim the value because custom properties can also include spaces
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
|
|
445
|
+
|
|
446
|
+
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
|
|
447
|
+
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
|
|
349
448
|
}
|
|
350
449
|
|
|
351
|
-
return
|
|
352
|
-
}
|
|
450
|
+
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
|
|
451
|
+
}
|
|
353
452
|
|
|
354
|
-
|
|
355
|
-
return
|
|
356
|
-
}
|
|
453
|
+
_detectNavbar() {
|
|
454
|
+
return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
|
|
455
|
+
}
|
|
357
456
|
|
|
358
|
-
|
|
359
|
-
|
|
457
|
+
_getOffset() {
|
|
458
|
+
const {
|
|
459
|
+
offset
|
|
460
|
+
} = this._config;
|
|
360
461
|
|
|
361
|
-
|
|
462
|
+
if (typeof offset === 'string') {
|
|
463
|
+
return offset.split(',').map(val => Number.parseInt(val, 10));
|
|
464
|
+
}
|
|
362
465
|
|
|
363
|
-
if (typeof
|
|
364
|
-
|
|
365
|
-
data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
|
|
366
|
-
return data;
|
|
367
|
-
};
|
|
368
|
-
} else {
|
|
369
|
-
offset.offset = this._config.offset;
|
|
466
|
+
if (typeof offset === 'function') {
|
|
467
|
+
return popperData => offset(popperData, this._element);
|
|
370
468
|
}
|
|
371
469
|
|
|
372
470
|
return offset;
|
|
373
|
-
}
|
|
471
|
+
}
|
|
374
472
|
|
|
375
|
-
|
|
376
|
-
|
|
473
|
+
_getPopperConfig() {
|
|
474
|
+
const defaultBsPopperConfig = {
|
|
377
475
|
placement: this._getPlacement(),
|
|
378
|
-
modifiers: {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
},
|
|
383
|
-
preventOverflow: {
|
|
384
|
-
boundariesElement: this._config.boundary
|
|
476
|
+
modifiers: [{
|
|
477
|
+
name: 'preventOverflow',
|
|
478
|
+
options: {
|
|
479
|
+
boundary: this._config.boundary
|
|
385
480
|
}
|
|
386
|
-
}
|
|
387
|
-
|
|
481
|
+
}, {
|
|
482
|
+
name: 'offset',
|
|
483
|
+
options: {
|
|
484
|
+
offset: this._getOffset()
|
|
485
|
+
}
|
|
486
|
+
}]
|
|
487
|
+
}; // Disable Popper if we have a static display
|
|
388
488
|
|
|
389
489
|
if (this._config.display === 'static') {
|
|
390
|
-
|
|
490
|
+
defaultBsPopperConfig.modifiers = [{
|
|
491
|
+
name: 'applyStyles',
|
|
391
492
|
enabled: false
|
|
392
|
-
};
|
|
493
|
+
}];
|
|
393
494
|
}
|
|
394
495
|
|
|
395
|
-
return
|
|
496
|
+
return { ...defaultBsPopperConfig,
|
|
497
|
+
...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
_selectMenuItem(event) {
|
|
502
|
+
const items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
|
|
503
|
+
|
|
504
|
+
if (!items.length) {
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
let index = items.indexOf(event.target); // Up
|
|
509
|
+
|
|
510
|
+
if (event.key === ARROW_UP_KEY && index > 0) {
|
|
511
|
+
index--;
|
|
512
|
+
} // Down
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
|
|
516
|
+
index++;
|
|
517
|
+
} // index is -1 if the first keydown is an ArrowUp
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
index = index === -1 ? 0 : index;
|
|
521
|
+
items[index].focus();
|
|
396
522
|
} // Static
|
|
397
|
-
;
|
|
398
523
|
|
|
399
|
-
Dropdown.dropdownInterface = function dropdownInterface(element, config) {
|
|
400
|
-
var data = Data__default['default'].getData(element, DATA_KEY);
|
|
401
524
|
|
|
402
|
-
|
|
525
|
+
static dropdownInterface(element, config) {
|
|
526
|
+
let data = Data__default['default'].get(element, DATA_KEY);
|
|
527
|
+
|
|
528
|
+
const _config = typeof config === 'object' ? config : null;
|
|
403
529
|
|
|
404
530
|
if (!data) {
|
|
405
531
|
data = new Dropdown(element, _config);
|
|
@@ -407,84 +533,74 @@
|
|
|
407
533
|
|
|
408
534
|
if (typeof config === 'string') {
|
|
409
535
|
if (typeof data[config] === 'undefined') {
|
|
410
|
-
throw new TypeError(
|
|
536
|
+
throw new TypeError(`No method named "${config}"`);
|
|
411
537
|
}
|
|
412
538
|
|
|
413
539
|
data[config]();
|
|
414
540
|
}
|
|
415
|
-
}
|
|
541
|
+
}
|
|
416
542
|
|
|
417
|
-
|
|
543
|
+
static jQueryInterface(config) {
|
|
418
544
|
return this.each(function () {
|
|
419
545
|
Dropdown.dropdownInterface(this, config);
|
|
420
546
|
});
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
Dropdown.clearMenus = function clearMenus(event) {
|
|
424
|
-
if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
var toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
|
|
429
|
-
|
|
430
|
-
for (var i = 0, len = toggles.length; i < len; i++) {
|
|
431
|
-
var parent = Dropdown.getParentFromElement(toggles[i]);
|
|
432
|
-
var context = Data__default['default'].getData(toggles[i], DATA_KEY);
|
|
433
|
-
var relatedTarget = {
|
|
434
|
-
relatedTarget: toggles[i]
|
|
435
|
-
};
|
|
547
|
+
}
|
|
436
548
|
|
|
437
|
-
|
|
438
|
-
|
|
549
|
+
static clearMenus(event) {
|
|
550
|
+
if (event) {
|
|
551
|
+
if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {
|
|
552
|
+
return;
|
|
439
553
|
}
|
|
440
554
|
|
|
441
|
-
if (
|
|
442
|
-
|
|
555
|
+
if (/input|select|option|textarea|form/i.test(event.target.tagName)) {
|
|
556
|
+
return;
|
|
443
557
|
}
|
|
558
|
+
}
|
|
444
559
|
|
|
445
|
-
|
|
560
|
+
const toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
|
|
446
561
|
|
|
447
|
-
|
|
562
|
+
for (let i = 0, len = toggles.length; i < len; i++) {
|
|
563
|
+
const context = Data__default['default'].get(toggles[i], DATA_KEY);
|
|
564
|
+
|
|
565
|
+
if (!context || context._config.autoClose === false) {
|
|
448
566
|
continue;
|
|
449
567
|
}
|
|
450
568
|
|
|
451
|
-
if (
|
|
569
|
+
if (!context._element.classList.contains(CLASS_NAME_SHOW)) {
|
|
452
570
|
continue;
|
|
453
571
|
}
|
|
454
572
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
continue;
|
|
459
|
-
} // If this is a touch-enabled device we remove the extra
|
|
460
|
-
// empty mouseover listeners we added for iOS support
|
|
573
|
+
const relatedTarget = {
|
|
574
|
+
relatedTarget: context._element
|
|
575
|
+
};
|
|
461
576
|
|
|
577
|
+
if (event) {
|
|
578
|
+
const composedPath = event.composedPath();
|
|
579
|
+
const isMenuTarget = composedPath.includes(context._menu);
|
|
462
580
|
|
|
463
|
-
|
|
464
|
-
|
|
581
|
+
if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
|
|
582
|
+
continue;
|
|
583
|
+
} // Tab navigation through the dropdown menu shouldn't close the menu
|
|
465
584
|
|
|
466
|
-
(_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) {
|
|
467
|
-
return EventHandler__default['default'].off(elem, 'mouseover', null, noop());
|
|
468
|
-
});
|
|
469
|
-
}
|
|
470
585
|
|
|
471
|
-
|
|
586
|
+
if (event.type === 'keyup' && event.key === TAB_KEY && context._menu.contains(event.target)) {
|
|
587
|
+
continue;
|
|
588
|
+
}
|
|
472
589
|
|
|
473
|
-
|
|
474
|
-
|
|
590
|
+
if (event.type === 'click') {
|
|
591
|
+
relatedTarget.clickEvent = event;
|
|
592
|
+
}
|
|
475
593
|
}
|
|
476
594
|
|
|
477
|
-
|
|
478
|
-
toggles[i].classList.remove(CLASS_NAME_SHOW);
|
|
479
|
-
EventHandler__default['default'].trigger(parent, EVENT_HIDDEN, relatedTarget);
|
|
595
|
+
context._completeHide(relatedTarget);
|
|
480
596
|
}
|
|
481
|
-
}
|
|
597
|
+
}
|
|
482
598
|
|
|
483
|
-
|
|
599
|
+
static getParentFromElement(element) {
|
|
484
600
|
return getElementFromSelector(element) || element.parentNode;
|
|
485
|
-
}
|
|
601
|
+
}
|
|
486
602
|
|
|
487
|
-
|
|
603
|
+
static dataApiKeydownHandler(event) {
|
|
488
604
|
// If not input/textarea:
|
|
489
605
|
// - And not a key in REGEXP_KEYDOWN => not a dropdown command
|
|
490
606
|
// If input/textarea:
|
|
@@ -496,74 +612,41 @@
|
|
|
496
612
|
return;
|
|
497
613
|
}
|
|
498
614
|
|
|
615
|
+
const isActive = this.classList.contains(CLASS_NAME_SHOW);
|
|
616
|
+
|
|
617
|
+
if (!isActive && event.key === ESCAPE_KEY) {
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
|
|
499
621
|
event.preventDefault();
|
|
500
622
|
event.stopPropagation();
|
|
501
623
|
|
|
502
|
-
if (this
|
|
624
|
+
if (isDisabled(this)) {
|
|
503
625
|
return;
|
|
504
626
|
}
|
|
505
627
|
|
|
506
|
-
|
|
507
|
-
var isActive = this.classList.contains(CLASS_NAME_SHOW);
|
|
628
|
+
const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
|
|
508
629
|
|
|
509
630
|
if (event.key === ESCAPE_KEY) {
|
|
510
|
-
|
|
511
|
-
button.focus();
|
|
631
|
+
getToggleButton().focus();
|
|
512
632
|
Dropdown.clearMenus();
|
|
513
633
|
return;
|
|
514
634
|
}
|
|
515
635
|
|
|
516
|
-
if (!isActive || event.key ===
|
|
517
|
-
|
|
636
|
+
if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
|
|
637
|
+
getToggleButton().click();
|
|
518
638
|
return;
|
|
519
639
|
}
|
|
520
640
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
if (!items.length) {
|
|
641
|
+
if (!isActive || event.key === SPACE_KEY) {
|
|
642
|
+
Dropdown.clearMenus();
|
|
524
643
|
return;
|
|
525
644
|
}
|
|
526
645
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
if (event.key === ARROW_UP_KEY && index > 0) {
|
|
530
|
-
// Up
|
|
531
|
-
index--;
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
|
|
535
|
-
// Down
|
|
536
|
-
index++;
|
|
537
|
-
} // index is -1 if the first keydown is an ArrowUp
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
index = index === -1 ? 0 : index;
|
|
541
|
-
items[index].focus();
|
|
542
|
-
};
|
|
543
|
-
|
|
544
|
-
Dropdown.getInstance = function getInstance(element) {
|
|
545
|
-
return Data__default['default'].getData(element, DATA_KEY);
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
_createClass(Dropdown, null, [{
|
|
549
|
-
key: "VERSION",
|
|
550
|
-
get: function get() {
|
|
551
|
-
return VERSION;
|
|
552
|
-
}
|
|
553
|
-
}, {
|
|
554
|
-
key: "Default",
|
|
555
|
-
get: function get() {
|
|
556
|
-
return Default;
|
|
557
|
-
}
|
|
558
|
-
}, {
|
|
559
|
-
key: "DefaultType",
|
|
560
|
-
get: function get() {
|
|
561
|
-
return DefaultType;
|
|
562
|
-
}
|
|
563
|
-
}]);
|
|
646
|
+
Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
|
|
647
|
+
}
|
|
564
648
|
|
|
565
|
-
|
|
566
|
-
}();
|
|
649
|
+
}
|
|
567
650
|
/**
|
|
568
651
|
* ------------------------------------------------------------------------
|
|
569
652
|
* Data Api implementation
|
|
@@ -577,32 +660,16 @@
|
|
|
577
660
|
EventHandler__default['default'].on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
|
|
578
661
|
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
579
662
|
event.preventDefault();
|
|
580
|
-
|
|
581
|
-
Dropdown.dropdownInterface(this, 'toggle');
|
|
582
|
-
});
|
|
583
|
-
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
|
|
584
|
-
return e.stopPropagation();
|
|
663
|
+
Dropdown.dropdownInterface(this);
|
|
585
664
|
});
|
|
586
|
-
var $ = getjQuery();
|
|
587
665
|
/**
|
|
588
666
|
* ------------------------------------------------------------------------
|
|
589
667
|
* jQuery
|
|
590
668
|
* ------------------------------------------------------------------------
|
|
591
|
-
* add .
|
|
669
|
+
* add .Dropdown to jQuery only if jQuery is present
|
|
592
670
|
*/
|
|
593
671
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
if ($) {
|
|
597
|
-
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
598
|
-
$.fn[NAME] = Dropdown.jQueryInterface;
|
|
599
|
-
$.fn[NAME].Constructor = Dropdown;
|
|
600
|
-
|
|
601
|
-
$.fn[NAME].noConflict = function () {
|
|
602
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
603
|
-
return Dropdown.jQueryInterface;
|
|
604
|
-
};
|
|
605
|
-
}
|
|
672
|
+
defineJQueryPlugin(NAME, Dropdown);
|
|
606
673
|
|
|
607
674
|
return Dropdown;
|
|
608
675
|
|