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