bootstrap 4.3.1 → 5.1.3
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 +172 -136
- data/assets/javascripts/bootstrap/base-component.js +182 -0
- data/assets/javascripts/bootstrap/button.js +101 -142
- data/assets/javascripts/bootstrap/carousel.js +483 -408
- data/assets/javascripts/bootstrap/collapse.js +340 -273
- data/assets/javascripts/bootstrap/dom/data.js +68 -0
- data/assets/javascripts/bootstrap/dom/event-handler.js +321 -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 +491 -399
- data/assets/javascripts/bootstrap/modal.js +841 -449
- data/assets/javascripts/bootstrap/offcanvas.js +866 -0
- data/assets/javascripts/bootstrap/popover.js +121 -198
- data/assets/javascripts/bootstrap/scrollspy.js +256 -240
- data/assets/javascripts/bootstrap/tab.js +218 -154
- data/assets/javascripts/bootstrap/toast.js +329 -189
- data/assets/javascripts/bootstrap/tooltip.js +651 -552
- 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 +3503 -2892
- data/assets/javascripts/bootstrap.min.js +4 -4
- data/assets/stylesheets/_bootstrap-grid.scss +56 -18
- data/assets/stylesheets/_bootstrap-reboot.scss +5 -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 +243 -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 +43 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +21 -7
- data/assets/stylesheets/bootstrap/_tables.scss +84 -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 +1007 -489
- 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 +72 -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 +132 -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 +278 -128
- 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
|
@@ -1,143 +1,244 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap collapse.js
|
|
3
|
-
* Copyright 2011-
|
|
4
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/
|
|
2
|
+
* Bootstrap collapse.js v5.1.3 (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.Collapse = factory(global.
|
|
10
|
-
}(this, function (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(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(['./dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
|
|
10
|
+
})(this, (function (Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
|
|
11
|
+
|
|
12
|
+
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
|
|
13
|
+
|
|
14
|
+
const Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
|
|
15
|
+
const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
16
|
+
const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
17
|
+
const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
18
|
+
const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* --------------------------------------------------------------------------
|
|
22
|
+
* Bootstrap (v5.1.3): util/index.js
|
|
23
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
24
|
+
* --------------------------------------------------------------------------
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
const toType = obj => {
|
|
28
|
+
if (obj === null || obj === undefined) {
|
|
29
|
+
return `${obj}`;
|
|
22
30
|
}
|
|
23
|
-
}
|
|
24
31
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
28
|
-
return Constructor;
|
|
29
|
-
}
|
|
32
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
33
|
+
};
|
|
30
34
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
const getSelector = element => {
|
|
36
|
+
let selector = element.getAttribute('data-bs-target');
|
|
37
|
+
|
|
38
|
+
if (!selector || selector === '#') {
|
|
39
|
+
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
40
|
+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
41
|
+
// `document.querySelector` will rightfully complain it is invalid.
|
|
42
|
+
// See https://github.com/twbs/bootstrap/issues/32273
|
|
43
|
+
|
|
44
|
+
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
45
|
+
return null;
|
|
46
|
+
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
50
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
41
54
|
}
|
|
42
55
|
|
|
43
|
-
return
|
|
44
|
-
}
|
|
56
|
+
return selector;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const getSelectorFromElement = element => {
|
|
60
|
+
const selector = getSelector(element);
|
|
61
|
+
|
|
62
|
+
if (selector) {
|
|
63
|
+
return document.querySelector(selector) ? selector : null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return null;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const getElementFromSelector = element => {
|
|
70
|
+
const selector = getSelector(element);
|
|
71
|
+
return selector ? document.querySelector(selector) : null;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const isElement = obj => {
|
|
75
|
+
if (!obj || typeof obj !== 'object') {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (typeof obj.jquery !== 'undefined') {
|
|
80
|
+
obj = obj[0];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return typeof obj.nodeType !== 'undefined';
|
|
84
|
+
};
|
|
45
85
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
86
|
+
const getElement = obj => {
|
|
87
|
+
if (isElement(obj)) {
|
|
88
|
+
// it's a jQuery object or a node element
|
|
89
|
+
return obj.jquery ? obj[0] : obj;
|
|
90
|
+
}
|
|
50
91
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
92
|
+
if (typeof obj === 'string' && obj.length > 0) {
|
|
93
|
+
return document.querySelector(obj);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return null;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
100
|
+
Object.keys(configTypes).forEach(property => {
|
|
101
|
+
const expectedTypes = configTypes[property];
|
|
102
|
+
const value = config[property];
|
|
103
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
104
|
+
|
|
105
|
+
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
106
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
55
107
|
}
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Trick to restart an element's animation
|
|
112
|
+
*
|
|
113
|
+
* @param {HTMLElement} element
|
|
114
|
+
* @return void
|
|
115
|
+
*
|
|
116
|
+
* @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
|
|
117
|
+
*/
|
|
56
118
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
119
|
+
|
|
120
|
+
const reflow = element => {
|
|
121
|
+
// eslint-disable-next-line no-unused-expressions
|
|
122
|
+
element.offsetHeight;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const getjQuery = () => {
|
|
126
|
+
const {
|
|
127
|
+
jQuery
|
|
128
|
+
} = window;
|
|
129
|
+
|
|
130
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
131
|
+
return jQuery;
|
|
60
132
|
}
|
|
61
133
|
|
|
62
|
-
return
|
|
63
|
-
}
|
|
134
|
+
return null;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const DOMContentLoadedCallbacks = [];
|
|
138
|
+
|
|
139
|
+
const onDOMContentLoaded = callback => {
|
|
140
|
+
if (document.readyState === 'loading') {
|
|
141
|
+
// add listener on the first call when the document is in loading state
|
|
142
|
+
if (!DOMContentLoadedCallbacks.length) {
|
|
143
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
144
|
+
DOMContentLoadedCallbacks.forEach(callback => callback());
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
DOMContentLoadedCallbacks.push(callback);
|
|
149
|
+
} else {
|
|
150
|
+
callback();
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const defineJQueryPlugin = plugin => {
|
|
155
|
+
onDOMContentLoaded(() => {
|
|
156
|
+
const $ = getjQuery();
|
|
157
|
+
/* istanbul ignore if */
|
|
158
|
+
|
|
159
|
+
if ($) {
|
|
160
|
+
const name = plugin.NAME;
|
|
161
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
162
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
163
|
+
$.fn[name].Constructor = plugin;
|
|
164
|
+
|
|
165
|
+
$.fn[name].noConflict = () => {
|
|
166
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
167
|
+
return plugin.jQueryInterface;
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
};
|
|
64
172
|
|
|
173
|
+
/**
|
|
174
|
+
* --------------------------------------------------------------------------
|
|
175
|
+
* Bootstrap (v5.1.3): collapse.js
|
|
176
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
177
|
+
* --------------------------------------------------------------------------
|
|
178
|
+
*/
|
|
65
179
|
/**
|
|
66
180
|
* ------------------------------------------------------------------------
|
|
67
181
|
* Constants
|
|
68
182
|
* ------------------------------------------------------------------------
|
|
69
183
|
*/
|
|
70
184
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var JQUERY_NO_CONFLICT = $.fn[NAME];
|
|
77
|
-
var Default = {
|
|
185
|
+
const NAME = 'collapse';
|
|
186
|
+
const DATA_KEY = 'bs.collapse';
|
|
187
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
188
|
+
const DATA_API_KEY = '.data-api';
|
|
189
|
+
const Default = {
|
|
78
190
|
toggle: true,
|
|
79
|
-
parent:
|
|
191
|
+
parent: null
|
|
80
192
|
};
|
|
81
|
-
|
|
193
|
+
const DefaultType = {
|
|
82
194
|
toggle: 'boolean',
|
|
83
|
-
parent: '(
|
|
84
|
-
};
|
|
85
|
-
var Event = {
|
|
86
|
-
SHOW: "show" + EVENT_KEY,
|
|
87
|
-
SHOWN: "shown" + EVENT_KEY,
|
|
88
|
-
HIDE: "hide" + EVENT_KEY,
|
|
89
|
-
HIDDEN: "hidden" + EVENT_KEY,
|
|
90
|
-
CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
|
|
91
|
-
};
|
|
92
|
-
var ClassName = {
|
|
93
|
-
SHOW: 'show',
|
|
94
|
-
COLLAPSE: 'collapse',
|
|
95
|
-
COLLAPSING: 'collapsing',
|
|
96
|
-
COLLAPSED: 'collapsed'
|
|
97
|
-
};
|
|
98
|
-
var Dimension = {
|
|
99
|
-
WIDTH: 'width',
|
|
100
|
-
HEIGHT: 'height'
|
|
101
|
-
};
|
|
102
|
-
var Selector = {
|
|
103
|
-
ACTIVES: '.show, .collapsing',
|
|
104
|
-
DATA_TOGGLE: '[data-toggle="collapse"]'
|
|
105
|
-
/**
|
|
106
|
-
* ------------------------------------------------------------------------
|
|
107
|
-
* Class Definition
|
|
108
|
-
* ------------------------------------------------------------------------
|
|
109
|
-
*/
|
|
110
|
-
|
|
195
|
+
parent: '(null|element)'
|
|
111
196
|
};
|
|
197
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
198
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
199
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
200
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
201
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
202
|
+
const CLASS_NAME_SHOW = 'show';
|
|
203
|
+
const CLASS_NAME_COLLAPSE = 'collapse';
|
|
204
|
+
const CLASS_NAME_COLLAPSING = 'collapsing';
|
|
205
|
+
const CLASS_NAME_COLLAPSED = 'collapsed';
|
|
206
|
+
const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
|
|
207
|
+
const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
|
|
208
|
+
const WIDTH = 'width';
|
|
209
|
+
const HEIGHT = 'height';
|
|
210
|
+
const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
|
|
211
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
|
|
212
|
+
/**
|
|
213
|
+
* ------------------------------------------------------------------------
|
|
214
|
+
* Class Definition
|
|
215
|
+
* ------------------------------------------------------------------------
|
|
216
|
+
*/
|
|
112
217
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
function Collapse(element, config) {
|
|
218
|
+
class Collapse extends BaseComponent__default.default {
|
|
219
|
+
constructor(element, config) {
|
|
220
|
+
super(element);
|
|
117
221
|
this._isTransitioning = false;
|
|
118
|
-
this._element = element;
|
|
119
222
|
this._config = this._getConfig(config);
|
|
120
|
-
this._triggerArray = []
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
for (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return foundElem === element;
|
|
128
|
-
});
|
|
223
|
+
this._triggerArray = [];
|
|
224
|
+
const toggleList = SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE);
|
|
225
|
+
|
|
226
|
+
for (let i = 0, len = toggleList.length; i < len; i++) {
|
|
227
|
+
const elem = toggleList[i];
|
|
228
|
+
const selector = getSelectorFromElement(elem);
|
|
229
|
+
const filterElement = SelectorEngine__default.default.find(selector).filter(foundElem => foundElem === this._element);
|
|
129
230
|
|
|
130
|
-
if (selector !== null && filterElement.length
|
|
231
|
+
if (selector !== null && filterElement.length) {
|
|
131
232
|
this._selector = selector;
|
|
132
233
|
|
|
133
234
|
this._triggerArray.push(elem);
|
|
134
235
|
}
|
|
135
236
|
}
|
|
136
237
|
|
|
137
|
-
this.
|
|
238
|
+
this._initializeChildren();
|
|
138
239
|
|
|
139
240
|
if (!this._config.parent) {
|
|
140
|
-
this._addAriaAndCollapsedClass(this.
|
|
241
|
+
this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
|
|
141
242
|
}
|
|
142
243
|
|
|
143
244
|
if (this._config.toggle) {
|
|
@@ -146,244 +247,218 @@
|
|
|
146
247
|
} // Getters
|
|
147
248
|
|
|
148
249
|
|
|
149
|
-
|
|
250
|
+
static get Default() {
|
|
251
|
+
return Default;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
static get NAME() {
|
|
255
|
+
return NAME;
|
|
256
|
+
} // Public
|
|
150
257
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (
|
|
258
|
+
|
|
259
|
+
toggle() {
|
|
260
|
+
if (this._isShown()) {
|
|
154
261
|
this.hide();
|
|
155
262
|
} else {
|
|
156
263
|
this.show();
|
|
157
264
|
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
_proto.show = function show() {
|
|
161
|
-
var _this = this;
|
|
265
|
+
}
|
|
162
266
|
|
|
163
|
-
|
|
267
|
+
show() {
|
|
268
|
+
if (this._isTransitioning || this._isShown()) {
|
|
164
269
|
return;
|
|
165
270
|
}
|
|
166
271
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (this._parent) {
|
|
171
|
-
actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
|
|
172
|
-
if (typeof _this._config.parent === 'string') {
|
|
173
|
-
return elem.getAttribute('data-parent') === _this._config.parent;
|
|
174
|
-
}
|
|
272
|
+
let actives = [];
|
|
273
|
+
let activesData;
|
|
175
274
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (actives.length === 0) {
|
|
180
|
-
actives = null;
|
|
181
|
-
}
|
|
275
|
+
if (this._config.parent) {
|
|
276
|
+
const children = SelectorEngine__default.default.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
|
|
277
|
+
actives = SelectorEngine__default.default.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
|
|
182
278
|
}
|
|
183
279
|
|
|
184
|
-
|
|
185
|
-
|
|
280
|
+
const container = SelectorEngine__default.default.findOne(this._selector);
|
|
281
|
+
|
|
282
|
+
if (actives.length) {
|
|
283
|
+
const tempActiveData = actives.find(elem => container !== elem);
|
|
284
|
+
activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
|
|
186
285
|
|
|
187
286
|
if (activesData && activesData._isTransitioning) {
|
|
188
287
|
return;
|
|
189
288
|
}
|
|
190
289
|
}
|
|
191
290
|
|
|
192
|
-
|
|
193
|
-
$(this._element).trigger(startEvent);
|
|
291
|
+
const startEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW);
|
|
194
292
|
|
|
195
|
-
if (startEvent.
|
|
293
|
+
if (startEvent.defaultPrevented) {
|
|
196
294
|
return;
|
|
197
295
|
}
|
|
198
296
|
|
|
199
|
-
|
|
200
|
-
|
|
297
|
+
actives.forEach(elemActive => {
|
|
298
|
+
if (container !== elemActive) {
|
|
299
|
+
Collapse.getOrCreateInstance(elemActive, {
|
|
300
|
+
toggle: false
|
|
301
|
+
}).hide();
|
|
302
|
+
}
|
|
201
303
|
|
|
202
304
|
if (!activesData) {
|
|
203
|
-
|
|
305
|
+
Data__default.default.set(elemActive, DATA_KEY, null);
|
|
204
306
|
}
|
|
205
|
-
}
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
const dimension = this._getDimension();
|
|
310
|
+
|
|
311
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSE);
|
|
206
312
|
|
|
207
|
-
|
|
313
|
+
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
|
208
314
|
|
|
209
|
-
$(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
|
|
210
315
|
this._element.style[dimension] = 0;
|
|
211
316
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
317
|
+
this._addAriaAndCollapsedClass(this._triggerArray, true);
|
|
318
|
+
|
|
319
|
+
this._isTransitioning = true;
|
|
215
320
|
|
|
216
|
-
|
|
321
|
+
const complete = () => {
|
|
322
|
+
this._isTransitioning = false;
|
|
217
323
|
|
|
218
|
-
|
|
219
|
-
$(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
|
|
220
|
-
_this._element.style[dimension] = '';
|
|
324
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
|
221
325
|
|
|
222
|
-
|
|
326
|
+
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
|
|
223
327
|
|
|
224
|
-
|
|
328
|
+
this._element.style[dimension] = '';
|
|
329
|
+
EventHandler__default.default.trigger(this._element, EVENT_SHOWN);
|
|
225
330
|
};
|
|
226
331
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
var transitionDuration = Util.getTransitionDurationFromElement(this._element);
|
|
230
|
-
$(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
|
|
231
|
-
this._element.style[dimension] = this._element[scrollSize] + "px";
|
|
232
|
-
};
|
|
332
|
+
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
|
333
|
+
const scrollSize = `scroll${capitalizedDimension}`;
|
|
233
334
|
|
|
234
|
-
|
|
235
|
-
|
|
335
|
+
this._queueCallback(complete, this._element, true);
|
|
336
|
+
|
|
337
|
+
this._element.style[dimension] = `${this._element[scrollSize]}px`;
|
|
338
|
+
}
|
|
236
339
|
|
|
237
|
-
|
|
340
|
+
hide() {
|
|
341
|
+
if (this._isTransitioning || !this._isShown()) {
|
|
238
342
|
return;
|
|
239
343
|
}
|
|
240
344
|
|
|
241
|
-
|
|
242
|
-
$(this._element).trigger(startEvent);
|
|
345
|
+
const startEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
|
|
243
346
|
|
|
244
|
-
if (startEvent.
|
|
347
|
+
if (startEvent.defaultPrevented) {
|
|
245
348
|
return;
|
|
246
349
|
}
|
|
247
350
|
|
|
248
|
-
|
|
351
|
+
const dimension = this._getDimension();
|
|
249
352
|
|
|
250
|
-
this._element.style[dimension] = this._element.getBoundingClientRect()[dimension]
|
|
251
|
-
|
|
252
|
-
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
|
|
253
|
-
var triggerArrayLength = this._triggerArray.length;
|
|
353
|
+
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
|
|
354
|
+
reflow(this._element);
|
|
254
355
|
|
|
255
|
-
|
|
256
|
-
for (var i = 0; i < triggerArrayLength; i++) {
|
|
257
|
-
var trigger = this._triggerArray[i];
|
|
258
|
-
var selector = Util.getSelectorFromElement(trigger);
|
|
356
|
+
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
|
259
357
|
|
|
260
|
-
|
|
261
|
-
var $elem = $([].slice.call(document.querySelectorAll(selector)));
|
|
358
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
|
|
262
359
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
360
|
+
const triggerArrayLength = this._triggerArray.length;
|
|
361
|
+
|
|
362
|
+
for (let i = 0; i < triggerArrayLength; i++) {
|
|
363
|
+
const trigger = this._triggerArray[i];
|
|
364
|
+
const elem = getElementFromSelector(trigger);
|
|
365
|
+
|
|
366
|
+
if (elem && !this._isShown(elem)) {
|
|
367
|
+
this._addAriaAndCollapsedClass([trigger], false);
|
|
267
368
|
}
|
|
268
369
|
}
|
|
269
370
|
|
|
270
|
-
this.
|
|
371
|
+
this._isTransitioning = true;
|
|
372
|
+
|
|
373
|
+
const complete = () => {
|
|
374
|
+
this._isTransitioning = false;
|
|
271
375
|
|
|
272
|
-
|
|
273
|
-
_this2.setTransitioning(false);
|
|
376
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
|
274
377
|
|
|
275
|
-
|
|
378
|
+
this._element.classList.add(CLASS_NAME_COLLAPSE);
|
|
379
|
+
|
|
380
|
+
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
|
|
276
381
|
};
|
|
277
382
|
|
|
278
383
|
this._element.style[dimension] = '';
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
};
|
|
286
|
-
|
|
287
|
-
_proto.dispose = function dispose() {
|
|
288
|
-
$.removeData(this._element, DATA_KEY);
|
|
289
|
-
this._config = null;
|
|
290
|
-
this._parent = null;
|
|
291
|
-
this._element = null;
|
|
292
|
-
this._triggerArray = null;
|
|
293
|
-
this._isTransitioning = null;
|
|
384
|
+
|
|
385
|
+
this._queueCallback(complete, this._element, true);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
_isShown(element = this._element) {
|
|
389
|
+
return element.classList.contains(CLASS_NAME_SHOW);
|
|
294
390
|
} // Private
|
|
295
|
-
;
|
|
296
391
|
|
|
297
|
-
|
|
298
|
-
|
|
392
|
+
|
|
393
|
+
_getConfig(config) {
|
|
394
|
+
config = { ...Default,
|
|
395
|
+
...Manipulator__default.default.getDataAttributes(this._element),
|
|
396
|
+
...config
|
|
397
|
+
};
|
|
299
398
|
config.toggle = Boolean(config.toggle); // Coerce string values
|
|
300
399
|
|
|
301
|
-
|
|
400
|
+
config.parent = getElement(config.parent);
|
|
401
|
+
typeCheckConfig(NAME, config, DefaultType);
|
|
302
402
|
return config;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
_proto._getDimension = function _getDimension() {
|
|
306
|
-
var hasWidth = $(this._element).hasClass(Dimension.WIDTH);
|
|
307
|
-
return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
|
|
308
|
-
};
|
|
403
|
+
}
|
|
309
404
|
|
|
310
|
-
|
|
311
|
-
|
|
405
|
+
_getDimension() {
|
|
406
|
+
return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
|
|
407
|
+
}
|
|
312
408
|
|
|
313
|
-
|
|
409
|
+
_initializeChildren() {
|
|
410
|
+
if (!this._config.parent) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
314
413
|
|
|
315
|
-
|
|
316
|
-
|
|
414
|
+
const children = SelectorEngine__default.default.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
|
|
415
|
+
SelectorEngine__default.default.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
|
|
416
|
+
const selected = getElementFromSelector(element);
|
|
317
417
|
|
|
318
|
-
if (
|
|
319
|
-
|
|
418
|
+
if (selected) {
|
|
419
|
+
this._addAriaAndCollapsedClass([element], this._isShown(selected));
|
|
320
420
|
}
|
|
321
|
-
} else {
|
|
322
|
-
parent = document.querySelector(this._config.parent);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
|
|
326
|
-
var children = [].slice.call(parent.querySelectorAll(selector));
|
|
327
|
-
$(children).each(function (i, element) {
|
|
328
|
-
_this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
|
|
329
421
|
});
|
|
330
|
-
|
|
331
|
-
};
|
|
332
|
-
|
|
333
|
-
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
|
|
334
|
-
var isOpen = $(element).hasClass(ClassName.SHOW);
|
|
422
|
+
}
|
|
335
423
|
|
|
336
|
-
|
|
337
|
-
|
|
424
|
+
_addAriaAndCollapsedClass(triggerArray, isOpen) {
|
|
425
|
+
if (!triggerArray.length) {
|
|
426
|
+
return;
|
|
338
427
|
}
|
|
428
|
+
|
|
429
|
+
triggerArray.forEach(elem => {
|
|
430
|
+
if (isOpen) {
|
|
431
|
+
elem.classList.remove(CLASS_NAME_COLLAPSED);
|
|
432
|
+
} else {
|
|
433
|
+
elem.classList.add(CLASS_NAME_COLLAPSED);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
elem.setAttribute('aria-expanded', isOpen);
|
|
437
|
+
});
|
|
339
438
|
} // Static
|
|
340
|
-
;
|
|
341
439
|
|
|
342
|
-
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
|
|
343
|
-
var selector = Util.getSelectorFromElement(element);
|
|
344
|
-
return selector ? document.querySelector(selector) : null;
|
|
345
|
-
};
|
|
346
440
|
|
|
347
|
-
|
|
441
|
+
static jQueryInterface(config) {
|
|
348
442
|
return this.each(function () {
|
|
349
|
-
|
|
350
|
-
var data = $this.data(DATA_KEY);
|
|
443
|
+
const _config = {};
|
|
351
444
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
if (!data && _config.toggle && /show|hide/.test(config)) {
|
|
445
|
+
if (typeof config === 'string' && /show|hide/.test(config)) {
|
|
355
446
|
_config.toggle = false;
|
|
356
447
|
}
|
|
357
448
|
|
|
358
|
-
|
|
359
|
-
data = new Collapse(this, _config);
|
|
360
|
-
$this.data(DATA_KEY, data);
|
|
361
|
-
}
|
|
449
|
+
const data = Collapse.getOrCreateInstance(this, _config);
|
|
362
450
|
|
|
363
451
|
if (typeof config === 'string') {
|
|
364
452
|
if (typeof data[config] === 'undefined') {
|
|
365
|
-
throw new TypeError(
|
|
453
|
+
throw new TypeError(`No method named "${config}"`);
|
|
366
454
|
}
|
|
367
455
|
|
|
368
456
|
data[config]();
|
|
369
457
|
}
|
|
370
458
|
});
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
_createClass(Collapse, null, [{
|
|
374
|
-
key: "VERSION",
|
|
375
|
-
get: function get() {
|
|
376
|
-
return VERSION;
|
|
377
|
-
}
|
|
378
|
-
}, {
|
|
379
|
-
key: "Default",
|
|
380
|
-
get: function get() {
|
|
381
|
-
return Default;
|
|
382
|
-
}
|
|
383
|
-
}]);
|
|
459
|
+
}
|
|
384
460
|
|
|
385
|
-
|
|
386
|
-
}();
|
|
461
|
+
}
|
|
387
462
|
/**
|
|
388
463
|
* ------------------------------------------------------------------------
|
|
389
464
|
* Data Api implementation
|
|
@@ -391,36 +466,28 @@
|
|
|
391
466
|
*/
|
|
392
467
|
|
|
393
468
|
|
|
394
|
-
|
|
469
|
+
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
395
470
|
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
|
396
|
-
if (event.
|
|
471
|
+
if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
|
|
397
472
|
event.preventDefault();
|
|
398
473
|
}
|
|
399
474
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
var config = data ? 'toggle' : $trigger.data();
|
|
407
|
-
|
|
408
|
-
Collapse._jQueryInterface.call($target, config);
|
|
475
|
+
const selector = getSelectorFromElement(this);
|
|
476
|
+
const selectorElements = SelectorEngine__default.default.find(selector);
|
|
477
|
+
selectorElements.forEach(element => {
|
|
478
|
+
Collapse.getOrCreateInstance(element, {
|
|
479
|
+
toggle: false
|
|
480
|
+
}).toggle();
|
|
409
481
|
});
|
|
410
482
|
});
|
|
411
483
|
/**
|
|
412
484
|
* ------------------------------------------------------------------------
|
|
413
485
|
* jQuery
|
|
414
486
|
* ------------------------------------------------------------------------
|
|
487
|
+
* add .Collapse to jQuery only if jQuery is present
|
|
415
488
|
*/
|
|
416
489
|
|
|
417
|
-
|
|
418
|
-
$.fn[NAME].Constructor = Collapse;
|
|
419
|
-
|
|
420
|
-
$.fn[NAME].noConflict = function () {
|
|
421
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
422
|
-
return Collapse._jQueryInterface;
|
|
423
|
-
};
|
|
490
|
+
defineJQueryPlugin(Collapse);
|
|
424
491
|
|
|
425
492
|
return Collapse;
|
|
426
493
|
|