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
|
@@ -1,143 +1,243 @@
|
|
|
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.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.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
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
|
+
|
|
14
|
+
var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
|
|
15
|
+
var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
16
|
+
var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
17
|
+
var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
18
|
+
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* --------------------------------------------------------------------------
|
|
22
|
+
* Bootstrap (v5.1.0): 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.0): 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_HORIZONTAL = 'collapse-horizontal';
|
|
207
|
+
const WIDTH = 'width';
|
|
208
|
+
const HEIGHT = 'height';
|
|
209
|
+
const SELECTOR_ACTIVES = '.show, .collapsing';
|
|
210
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
|
|
211
|
+
/**
|
|
212
|
+
* ------------------------------------------------------------------------
|
|
213
|
+
* Class Definition
|
|
214
|
+
* ------------------------------------------------------------------------
|
|
215
|
+
*/
|
|
112
216
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
function Collapse(element, config) {
|
|
217
|
+
class Collapse extends BaseComponent__default['default'] {
|
|
218
|
+
constructor(element, config) {
|
|
219
|
+
super(element);
|
|
117
220
|
this._isTransitioning = false;
|
|
118
|
-
this._element = element;
|
|
119
221
|
this._config = this._getConfig(config);
|
|
120
|
-
this._triggerArray = []
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
for (
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
return foundElem === element;
|
|
128
|
-
});
|
|
222
|
+
this._triggerArray = [];
|
|
223
|
+
const toggleList = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
|
|
224
|
+
|
|
225
|
+
for (let i = 0, len = toggleList.length; i < len; i++) {
|
|
226
|
+
const elem = toggleList[i];
|
|
227
|
+
const selector = getSelectorFromElement(elem);
|
|
228
|
+
const filterElement = SelectorEngine__default['default'].find(selector).filter(foundElem => foundElem === this._element);
|
|
129
229
|
|
|
130
|
-
if (selector !== null && filterElement.length
|
|
230
|
+
if (selector !== null && filterElement.length) {
|
|
131
231
|
this._selector = selector;
|
|
132
232
|
|
|
133
233
|
this._triggerArray.push(elem);
|
|
134
234
|
}
|
|
135
235
|
}
|
|
136
236
|
|
|
137
|
-
this.
|
|
237
|
+
this._initializeChildren();
|
|
138
238
|
|
|
139
239
|
if (!this._config.parent) {
|
|
140
|
-
this._addAriaAndCollapsedClass(this.
|
|
240
|
+
this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
|
|
141
241
|
}
|
|
142
242
|
|
|
143
243
|
if (this._config.toggle) {
|
|
@@ -146,244 +246,218 @@
|
|
|
146
246
|
} // Getters
|
|
147
247
|
|
|
148
248
|
|
|
149
|
-
|
|
249
|
+
static get Default() {
|
|
250
|
+
return Default;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
static get NAME() {
|
|
254
|
+
return NAME;
|
|
255
|
+
} // Public
|
|
150
256
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (
|
|
257
|
+
|
|
258
|
+
toggle() {
|
|
259
|
+
if (this._isShown()) {
|
|
154
260
|
this.hide();
|
|
155
261
|
} else {
|
|
156
262
|
this.show();
|
|
157
263
|
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
_proto.show = function show() {
|
|
161
|
-
var _this = this;
|
|
264
|
+
}
|
|
162
265
|
|
|
163
|
-
|
|
266
|
+
show() {
|
|
267
|
+
if (this._isTransitioning || this._isShown()) {
|
|
164
268
|
return;
|
|
165
269
|
}
|
|
166
270
|
|
|
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
|
-
}
|
|
271
|
+
let actives = [];
|
|
272
|
+
let activesData;
|
|
175
273
|
|
|
176
|
-
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
if (actives.length === 0) {
|
|
180
|
-
actives = null;
|
|
181
|
-
}
|
|
274
|
+
if (this._config.parent) {
|
|
275
|
+
const children = SelectorEngine__default['default'].find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
|
|
276
|
+
actives = SelectorEngine__default['default'].find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
|
|
182
277
|
}
|
|
183
278
|
|
|
184
|
-
|
|
185
|
-
|
|
279
|
+
const container = SelectorEngine__default['default'].findOne(this._selector);
|
|
280
|
+
|
|
281
|
+
if (actives.length) {
|
|
282
|
+
const tempActiveData = actives.find(elem => container !== elem);
|
|
283
|
+
activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
|
|
186
284
|
|
|
187
285
|
if (activesData && activesData._isTransitioning) {
|
|
188
286
|
return;
|
|
189
287
|
}
|
|
190
288
|
}
|
|
191
289
|
|
|
192
|
-
|
|
193
|
-
$(this._element).trigger(startEvent);
|
|
290
|
+
const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
|
|
194
291
|
|
|
195
|
-
if (startEvent.
|
|
292
|
+
if (startEvent.defaultPrevented) {
|
|
196
293
|
return;
|
|
197
294
|
}
|
|
198
295
|
|
|
199
|
-
|
|
200
|
-
|
|
296
|
+
actives.forEach(elemActive => {
|
|
297
|
+
if (container !== elemActive) {
|
|
298
|
+
Collapse.getOrCreateInstance(elemActive, {
|
|
299
|
+
toggle: false
|
|
300
|
+
}).hide();
|
|
301
|
+
}
|
|
201
302
|
|
|
202
303
|
if (!activesData) {
|
|
203
|
-
|
|
304
|
+
Data__default['default'].set(elemActive, DATA_KEY, null);
|
|
204
305
|
}
|
|
205
|
-
}
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const dimension = this._getDimension();
|
|
309
|
+
|
|
310
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSE);
|
|
206
311
|
|
|
207
|
-
|
|
312
|
+
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
|
208
313
|
|
|
209
|
-
$(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
|
|
210
314
|
this._element.style[dimension] = 0;
|
|
211
315
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
316
|
+
this._addAriaAndCollapsedClass(this._triggerArray, true);
|
|
317
|
+
|
|
318
|
+
this._isTransitioning = true;
|
|
215
319
|
|
|
216
|
-
|
|
320
|
+
const complete = () => {
|
|
321
|
+
this._isTransitioning = false;
|
|
217
322
|
|
|
218
|
-
|
|
219
|
-
$(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
|
|
220
|
-
_this._element.style[dimension] = '';
|
|
323
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
|
221
324
|
|
|
222
|
-
|
|
325
|
+
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
|
|
223
326
|
|
|
224
|
-
|
|
327
|
+
this._element.style[dimension] = '';
|
|
328
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
|
|
225
329
|
};
|
|
226
330
|
|
|
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
|
-
};
|
|
331
|
+
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
|
332
|
+
const scrollSize = `scroll${capitalizedDimension}`;
|
|
233
333
|
|
|
234
|
-
|
|
235
|
-
|
|
334
|
+
this._queueCallback(complete, this._element, true);
|
|
335
|
+
|
|
336
|
+
this._element.style[dimension] = `${this._element[scrollSize]}px`;
|
|
337
|
+
}
|
|
236
338
|
|
|
237
|
-
|
|
339
|
+
hide() {
|
|
340
|
+
if (this._isTransitioning || !this._isShown()) {
|
|
238
341
|
return;
|
|
239
342
|
}
|
|
240
343
|
|
|
241
|
-
|
|
242
|
-
$(this._element).trigger(startEvent);
|
|
344
|
+
const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
|
|
243
345
|
|
|
244
|
-
if (startEvent.
|
|
346
|
+
if (startEvent.defaultPrevented) {
|
|
245
347
|
return;
|
|
246
348
|
}
|
|
247
349
|
|
|
248
|
-
|
|
350
|
+
const dimension = this._getDimension();
|
|
249
351
|
|
|
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;
|
|
352
|
+
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
|
|
353
|
+
reflow(this._element);
|
|
254
354
|
|
|
255
|
-
|
|
256
|
-
for (var i = 0; i < triggerArrayLength; i++) {
|
|
257
|
-
var trigger = this._triggerArray[i];
|
|
258
|
-
var selector = Util.getSelectorFromElement(trigger);
|
|
355
|
+
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
|
259
356
|
|
|
260
|
-
|
|
261
|
-
var $elem = $([].slice.call(document.querySelectorAll(selector)));
|
|
357
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
|
|
262
358
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
359
|
+
const triggerArrayLength = this._triggerArray.length;
|
|
360
|
+
|
|
361
|
+
for (let i = 0; i < triggerArrayLength; i++) {
|
|
362
|
+
const trigger = this._triggerArray[i];
|
|
363
|
+
const elem = getElementFromSelector(trigger);
|
|
364
|
+
|
|
365
|
+
if (elem && !this._isShown(elem)) {
|
|
366
|
+
this._addAriaAndCollapsedClass([trigger], false);
|
|
267
367
|
}
|
|
268
368
|
}
|
|
269
369
|
|
|
270
|
-
this.
|
|
370
|
+
this._isTransitioning = true;
|
|
371
|
+
|
|
372
|
+
const complete = () => {
|
|
373
|
+
this._isTransitioning = false;
|
|
271
374
|
|
|
272
|
-
|
|
273
|
-
_this2.setTransitioning(false);
|
|
375
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
|
274
376
|
|
|
275
|
-
|
|
377
|
+
this._element.classList.add(CLASS_NAME_COLLAPSE);
|
|
378
|
+
|
|
379
|
+
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
|
|
276
380
|
};
|
|
277
381
|
|
|
278
382
|
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;
|
|
383
|
+
|
|
384
|
+
this._queueCallback(complete, this._element, true);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
_isShown(element = this._element) {
|
|
388
|
+
return element.classList.contains(CLASS_NAME_SHOW);
|
|
294
389
|
} // Private
|
|
295
|
-
;
|
|
296
390
|
|
|
297
|
-
|
|
298
|
-
|
|
391
|
+
|
|
392
|
+
_getConfig(config) {
|
|
393
|
+
config = { ...Default,
|
|
394
|
+
...Manipulator__default['default'].getDataAttributes(this._element),
|
|
395
|
+
...config
|
|
396
|
+
};
|
|
299
397
|
config.toggle = Boolean(config.toggle); // Coerce string values
|
|
300
398
|
|
|
301
|
-
|
|
399
|
+
config.parent = getElement(config.parent);
|
|
400
|
+
typeCheckConfig(NAME, config, DefaultType);
|
|
302
401
|
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
|
-
};
|
|
402
|
+
}
|
|
309
403
|
|
|
310
|
-
|
|
311
|
-
|
|
404
|
+
_getDimension() {
|
|
405
|
+
return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
|
|
406
|
+
}
|
|
312
407
|
|
|
313
|
-
|
|
408
|
+
_initializeChildren() {
|
|
409
|
+
if (!this._config.parent) {
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
314
412
|
|
|
315
|
-
|
|
316
|
-
|
|
413
|
+
const children = SelectorEngine__default['default'].find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
|
|
414
|
+
SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
|
|
415
|
+
const selected = getElementFromSelector(element);
|
|
317
416
|
|
|
318
|
-
if (
|
|
319
|
-
|
|
417
|
+
if (selected) {
|
|
418
|
+
this._addAriaAndCollapsedClass([element], this._isShown(selected));
|
|
320
419
|
}
|
|
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
420
|
});
|
|
330
|
-
|
|
331
|
-
};
|
|
332
|
-
|
|
333
|
-
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
|
|
334
|
-
var isOpen = $(element).hasClass(ClassName.SHOW);
|
|
421
|
+
}
|
|
335
422
|
|
|
336
|
-
|
|
337
|
-
|
|
423
|
+
_addAriaAndCollapsedClass(triggerArray, isOpen) {
|
|
424
|
+
if (!triggerArray.length) {
|
|
425
|
+
return;
|
|
338
426
|
}
|
|
427
|
+
|
|
428
|
+
triggerArray.forEach(elem => {
|
|
429
|
+
if (isOpen) {
|
|
430
|
+
elem.classList.remove(CLASS_NAME_COLLAPSED);
|
|
431
|
+
} else {
|
|
432
|
+
elem.classList.add(CLASS_NAME_COLLAPSED);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
elem.setAttribute('aria-expanded', isOpen);
|
|
436
|
+
});
|
|
339
437
|
} // Static
|
|
340
|
-
;
|
|
341
438
|
|
|
342
|
-
Collapse._getTargetFromElement = function _getTargetFromElement(element) {
|
|
343
|
-
var selector = Util.getSelectorFromElement(element);
|
|
344
|
-
return selector ? document.querySelector(selector) : null;
|
|
345
|
-
};
|
|
346
439
|
|
|
347
|
-
|
|
440
|
+
static jQueryInterface(config) {
|
|
348
441
|
return this.each(function () {
|
|
349
|
-
|
|
350
|
-
var data = $this.data(DATA_KEY);
|
|
442
|
+
const _config = {};
|
|
351
443
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
if (!data && _config.toggle && /show|hide/.test(config)) {
|
|
444
|
+
if (typeof config === 'string' && /show|hide/.test(config)) {
|
|
355
445
|
_config.toggle = false;
|
|
356
446
|
}
|
|
357
447
|
|
|
358
|
-
|
|
359
|
-
data = new Collapse(this, _config);
|
|
360
|
-
$this.data(DATA_KEY, data);
|
|
361
|
-
}
|
|
448
|
+
const data = Collapse.getOrCreateInstance(this, _config);
|
|
362
449
|
|
|
363
450
|
if (typeof config === 'string') {
|
|
364
451
|
if (typeof data[config] === 'undefined') {
|
|
365
|
-
throw new TypeError(
|
|
452
|
+
throw new TypeError(`No method named "${config}"`);
|
|
366
453
|
}
|
|
367
454
|
|
|
368
455
|
data[config]();
|
|
369
456
|
}
|
|
370
457
|
});
|
|
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
|
-
}]);
|
|
458
|
+
}
|
|
384
459
|
|
|
385
|
-
|
|
386
|
-
}();
|
|
460
|
+
}
|
|
387
461
|
/**
|
|
388
462
|
* ------------------------------------------------------------------------
|
|
389
463
|
* Data Api implementation
|
|
@@ -391,37 +465,29 @@
|
|
|
391
465
|
*/
|
|
392
466
|
|
|
393
467
|
|
|
394
|
-
|
|
468
|
+
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
395
469
|
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
|
396
|
-
if (event.
|
|
470
|
+
if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
|
|
397
471
|
event.preventDefault();
|
|
398
472
|
}
|
|
399
473
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
var config = data ? 'toggle' : $trigger.data();
|
|
407
|
-
|
|
408
|
-
Collapse._jQueryInterface.call($target, config);
|
|
474
|
+
const selector = getSelectorFromElement(this);
|
|
475
|
+
const selectorElements = SelectorEngine__default['default'].find(selector);
|
|
476
|
+
selectorElements.forEach(element => {
|
|
477
|
+
Collapse.getOrCreateInstance(element, {
|
|
478
|
+
toggle: false
|
|
479
|
+
}).toggle();
|
|
409
480
|
});
|
|
410
481
|
});
|
|
411
482
|
/**
|
|
412
483
|
* ------------------------------------------------------------------------
|
|
413
484
|
* jQuery
|
|
414
485
|
* ------------------------------------------------------------------------
|
|
486
|
+
* add .Collapse to jQuery only if jQuery is present
|
|
415
487
|
*/
|
|
416
488
|
|
|
417
|
-
|
|
418
|
-
$.fn[NAME].Constructor = Collapse;
|
|
419
|
-
|
|
420
|
-
$.fn[NAME].noConflict = function () {
|
|
421
|
-
$.fn[NAME] = JQUERY_NO_CONFLICT;
|
|
422
|
-
return Collapse._jQueryInterface;
|
|
423
|
-
};
|
|
489
|
+
defineJQueryPlugin(Collapse);
|
|
424
490
|
|
|
425
491
|
return Collapse;
|
|
426
492
|
|
|
427
|
-
}));
|
|
493
|
+
})));
|