bootstrap 4.6.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -1
- data/README.md +7 -4
- data/assets/javascripts/bootstrap/alert.js +181 -109
- data/assets/javascripts/bootstrap/base-component.js +63 -0
- data/assets/javascripts/bootstrap/button.js +85 -173
- data/assets/javascripts/bootstrap/carousel.js +458 -355
- data/assets/javascripts/bootstrap/collapse.js +366 -218
- 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 +85 -0
- data/assets/javascripts/bootstrap/dropdown.js +459 -351
- data/assets/javascripts/bootstrap/modal.js +597 -429
- data/assets/javascripts/bootstrap/offcanvas.js +671 -0
- data/assets/javascripts/bootstrap/popover.js +130 -154
- data/assets/javascripts/bootstrap/scrollspy.js +238 -188
- data/assets/javascripts/bootstrap/tab.js +235 -137
- data/assets/javascripts/bootstrap/toast.js +210 -148
- data/assets/javascripts/bootstrap/tooltip.js +627 -466
- 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 +15 -8
- data/assets/javascripts/bootstrap.js +3174 -2563
- data/assets/javascripts/bootstrap.min.js +2 -2
- data/assets/stylesheets/_bootstrap-grid.scss +51 -16
- data/assets/stylesheets/_bootstrap-reboot.scss +4 -1
- data/assets/stylesheets/_bootstrap.scss +16 -8
- data/assets/stylesheets/bootstrap/_accordion.scss +118 -0
- data/assets/stylesheets/bootstrap/_alert.scss +15 -10
- data/assets/stylesheets/bootstrap/_badge.scss +2 -27
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -17
- data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
- data/assets/stylesheets/bootstrap/_buttons.scss +29 -60
- data/assets/stylesheets/bootstrap/_card.scss +20 -91
- data/assets/stylesheets/bootstrap/_carousel.scss +65 -33
- data/assets/stylesheets/bootstrap/_close.scss +30 -30
- data/assets/stylesheets/bootstrap/_containers.scss +41 -0
- data/assets/stylesheets/bootstrap/_dropdown.scss +84 -36
- data/assets/stylesheets/bootstrap/_forms.scss +9 -347
- data/assets/stylesheets/bootstrap/_functions.scss +84 -23
- data/assets/stylesheets/bootstrap/_grid.scss +3 -54
- data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +28 -8
- data/assets/stylesheets/bootstrap/_mixins.scss +8 -13
- data/assets/stylesheets/bootstrap/_modal.scss +43 -55
- data/assets/stylesheets/bootstrap/_nav.scss +23 -4
- data/assets/stylesheets/bootstrap/_navbar.scss +45 -71
- data/assets/stylesheets/bootstrap/_offcanvas.scss +77 -0
- data/assets/stylesheets/bootstrap/_pagination.scss +10 -20
- data/assets/stylesheets/bootstrap/_popover.scss +15 -27
- data/assets/stylesheets/bootstrap/_progress.scss +5 -4
- data/assets/stylesheets/bootstrap/_reboot.scss +316 -179
- data/assets/stylesheets/bootstrap/_root.scss +5 -8
- data/assets/stylesheets/bootstrap/_spinners.scss +11 -7
- data/assets/stylesheets/bootstrap/_tables.scss +79 -114
- data/assets/stylesheets/bootstrap/_toasts.scss +20 -15
- data/assets/stylesheets/bootstrap/_tooltip.scss +17 -17
- data/assets/stylesheets/bootstrap/_transitions.scss +2 -1
- data/assets/stylesheets/bootstrap/_type.scss +38 -59
- data/assets/stylesheets/bootstrap/_utilities.scss +594 -18
- data/assets/stylesheets/bootstrap/_variables.scss +800 -482
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -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 +67 -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/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/_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/mixins/_alert.scss +3 -5
- data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
- 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 +71 -48
- 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 +38 -86
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +89 -33
- data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
- data/assets/stylesheets/bootstrap/mixins/_list-group.scss +5 -2
- data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +17 -8
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
- data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -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 +234 -126
- data/bootstrap.gemspec +1 -3
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +20 -5
- data/tasks/updater/network.rb +7 -1
- data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
- data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
- data/test/dummy_rails/app/views/pages/root.html +89 -0
- data/test/dummy_rails/config/application.rb +0 -3
- data/test/gemfiles/rails_6_1.gemfile +7 -0
- metadata +45 -73
- data/assets/javascripts/bootstrap/util.js +0 -192
- data/assets/stylesheets/bootstrap/_code.scss +0 -48
- data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
- data/assets/stylesheets/bootstrap/_input-group.scss +0 -208
- 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 -23
- 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 -80
- data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
- data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
- data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
- 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 -17
- 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/_interactions.scss +0 -5
- 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
- /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
|
@@ -1,108 +1,234 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap collapse.js
|
|
2
|
+
* Bootstrap collapse.js v5.0.0 (https://getbootstrap.com/)
|
|
3
3
|
* Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
|
|
4
4
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
6
6
|
(function (global, factory) {
|
|
7
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('
|
|
8
|
-
typeof define === 'function' && define.amd ? define(['
|
|
9
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.
|
|
10
|
-
}(this, (function (
|
|
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
11
|
|
|
12
12
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
13
|
|
|
14
|
-
var
|
|
15
|
-
var
|
|
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);
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
/**
|
|
21
|
+
* --------------------------------------------------------------------------
|
|
22
|
+
* Bootstrap (v5.0.0): util/index.js
|
|
23
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
24
|
+
* --------------------------------------------------------------------------
|
|
25
|
+
*/
|
|
26
|
+
const MILLISECONDS_MULTIPLIER = 1000;
|
|
27
|
+
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
28
|
+
|
|
29
|
+
const toType = obj => {
|
|
30
|
+
if (obj === null || obj === undefined) {
|
|
31
|
+
return `${obj}`;
|
|
24
32
|
}
|
|
25
|
-
}
|
|
26
33
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
30
|
-
return Constructor;
|
|
31
|
-
}
|
|
34
|
+
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
35
|
+
};
|
|
32
36
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
36
|
-
var source = arguments[i];
|
|
37
|
+
const getSelector = element => {
|
|
38
|
+
let selector = element.getAttribute('data-bs-target');
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
if (!selector || selector === '#') {
|
|
41
|
+
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
42
|
+
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
43
|
+
// `document.querySelector` will rightfully complain it is invalid.
|
|
44
|
+
// See https://github.com/twbs/bootstrap/issues/32273
|
|
45
|
+
|
|
46
|
+
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
47
|
+
return null;
|
|
48
|
+
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
52
|
+
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
43
53
|
}
|
|
44
54
|
|
|
45
|
-
|
|
46
|
-
}
|
|
55
|
+
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
56
|
+
}
|
|
47
57
|
|
|
48
|
-
return
|
|
49
|
-
}
|
|
58
|
+
return selector;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const getSelectorFromElement = element => {
|
|
62
|
+
const selector = getSelector(element);
|
|
63
|
+
|
|
64
|
+
if (selector) {
|
|
65
|
+
return document.querySelector(selector) ? selector : null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return null;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const getElementFromSelector = element => {
|
|
72
|
+
const selector = getSelector(element);
|
|
73
|
+
return selector ? document.querySelector(selector) : null;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const getTransitionDurationFromElement = element => {
|
|
77
|
+
if (!element) {
|
|
78
|
+
return 0;
|
|
79
|
+
} // Get transition-duration of the element
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
let {
|
|
83
|
+
transitionDuration,
|
|
84
|
+
transitionDelay
|
|
85
|
+
} = window.getComputedStyle(element);
|
|
86
|
+
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
|
87
|
+
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
|
|
88
|
+
|
|
89
|
+
if (!floatTransitionDuration && !floatTransitionDelay) {
|
|
90
|
+
return 0;
|
|
91
|
+
} // If multiple durations are defined, take the first
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
transitionDuration = transitionDuration.split(',')[0];
|
|
95
|
+
transitionDelay = transitionDelay.split(',')[0];
|
|
96
|
+
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const triggerTransitionEnd = element => {
|
|
100
|
+
element.dispatchEvent(new Event(TRANSITION_END));
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const isElement = obj => (obj[0] || obj).nodeType;
|
|
104
|
+
|
|
105
|
+
const emulateTransitionEnd = (element, duration) => {
|
|
106
|
+
let called = false;
|
|
107
|
+
const durationPadding = 5;
|
|
108
|
+
const emulatedDuration = duration + durationPadding;
|
|
109
|
+
|
|
110
|
+
function listener() {
|
|
111
|
+
called = true;
|
|
112
|
+
element.removeEventListener(TRANSITION_END, listener);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
element.addEventListener(TRANSITION_END, listener);
|
|
116
|
+
setTimeout(() => {
|
|
117
|
+
if (!called) {
|
|
118
|
+
triggerTransitionEnd(element);
|
|
119
|
+
}
|
|
120
|
+
}, emulatedDuration);
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
124
|
+
Object.keys(configTypes).forEach(property => {
|
|
125
|
+
const expectedTypes = configTypes[property];
|
|
126
|
+
const value = config[property];
|
|
127
|
+
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
128
|
+
|
|
129
|
+
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
130
|
+
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const reflow = element => element.offsetHeight;
|
|
136
|
+
|
|
137
|
+
const getjQuery = () => {
|
|
138
|
+
const {
|
|
139
|
+
jQuery
|
|
140
|
+
} = window;
|
|
141
|
+
|
|
142
|
+
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
143
|
+
return jQuery;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return null;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const onDOMContentLoaded = callback => {
|
|
150
|
+
if (document.readyState === 'loading') {
|
|
151
|
+
document.addEventListener('DOMContentLoaded', callback);
|
|
152
|
+
} else {
|
|
153
|
+
callback();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const defineJQueryPlugin = (name, plugin) => {
|
|
158
|
+
onDOMContentLoaded(() => {
|
|
159
|
+
const $ = getjQuery();
|
|
160
|
+
/* istanbul ignore if */
|
|
161
|
+
|
|
162
|
+
if ($) {
|
|
163
|
+
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
164
|
+
$.fn[name] = plugin.jQueryInterface;
|
|
165
|
+
$.fn[name].Constructor = plugin;
|
|
166
|
+
|
|
167
|
+
$.fn[name].noConflict = () => {
|
|
168
|
+
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
169
|
+
return plugin.jQueryInterface;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
};
|
|
50
174
|
|
|
175
|
+
/**
|
|
176
|
+
* --------------------------------------------------------------------------
|
|
177
|
+
* Bootstrap (v5.0.0): collapse.js
|
|
178
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
179
|
+
* --------------------------------------------------------------------------
|
|
180
|
+
*/
|
|
51
181
|
/**
|
|
52
182
|
* ------------------------------------------------------------------------
|
|
53
183
|
* Constants
|
|
54
184
|
* ------------------------------------------------------------------------
|
|
55
185
|
*/
|
|
56
186
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
|
|
63
|
-
var Default = {
|
|
187
|
+
const NAME = 'collapse';
|
|
188
|
+
const DATA_KEY = 'bs.collapse';
|
|
189
|
+
const EVENT_KEY = `.${DATA_KEY}`;
|
|
190
|
+
const DATA_API_KEY = '.data-api';
|
|
191
|
+
const Default = {
|
|
64
192
|
toggle: true,
|
|
65
193
|
parent: ''
|
|
66
194
|
};
|
|
67
|
-
|
|
195
|
+
const DefaultType = {
|
|
68
196
|
toggle: 'boolean',
|
|
69
197
|
parent: '(string|element)'
|
|
70
198
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
199
|
+
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
200
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
201
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
202
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
203
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
204
|
+
const CLASS_NAME_SHOW = 'show';
|
|
205
|
+
const CLASS_NAME_COLLAPSE = 'collapse';
|
|
206
|
+
const CLASS_NAME_COLLAPSING = 'collapsing';
|
|
207
|
+
const CLASS_NAME_COLLAPSED = 'collapsed';
|
|
208
|
+
const WIDTH = 'width';
|
|
209
|
+
const HEIGHT = 'height';
|
|
210
|
+
const SELECTOR_ACTIVES = '.show, .collapsing';
|
|
211
|
+
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]';
|
|
84
212
|
/**
|
|
85
213
|
* ------------------------------------------------------------------------
|
|
86
214
|
* Class Definition
|
|
87
215
|
* ------------------------------------------------------------------------
|
|
88
216
|
*/
|
|
89
217
|
|
|
90
|
-
|
|
91
|
-
|
|
218
|
+
class Collapse extends BaseComponent__default['default'] {
|
|
219
|
+
constructor(element, config) {
|
|
220
|
+
super(element);
|
|
92
221
|
this._isTransitioning = false;
|
|
93
|
-
this._element = element;
|
|
94
222
|
this._config = this._getConfig(config);
|
|
95
|
-
this._triggerArray = [].
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
for (var i = 0, len = toggleList.length; i < len; i++) {
|
|
99
|
-
var elem = toggleList[i];
|
|
100
|
-
var selector = Util__default['default'].getSelectorFromElement(elem);
|
|
101
|
-
var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
|
|
102
|
-
return foundElem === element;
|
|
103
|
-
});
|
|
223
|
+
this._triggerArray = SelectorEngine__default['default'].find(`${SELECTOR_DATA_TOGGLE}[href="#${this._element.id}"],` + `${SELECTOR_DATA_TOGGLE}[data-bs-target="#${this._element.id}"]`);
|
|
224
|
+
const toggleList = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
|
|
104
225
|
|
|
105
|
-
|
|
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);
|
|
230
|
+
|
|
231
|
+
if (selector !== null && filterElement.length) {
|
|
106
232
|
this._selector = selector;
|
|
107
233
|
|
|
108
234
|
this._triggerArray.push(elem);
|
|
@@ -121,31 +247,35 @@
|
|
|
121
247
|
} // Getters
|
|
122
248
|
|
|
123
249
|
|
|
124
|
-
|
|
250
|
+
static get Default() {
|
|
251
|
+
return Default;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
static get DATA_KEY() {
|
|
255
|
+
return DATA_KEY;
|
|
256
|
+
} // Public
|
|
257
|
+
|
|
125
258
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if ($__default['default'](this._element).hasClass(CLASS_NAME_SHOW)) {
|
|
259
|
+
toggle() {
|
|
260
|
+
if (this._element.classList.contains(CLASS_NAME_SHOW)) {
|
|
129
261
|
this.hide();
|
|
130
262
|
} else {
|
|
131
263
|
this.show();
|
|
132
264
|
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
_proto.show = function show() {
|
|
136
|
-
var _this = this;
|
|
265
|
+
}
|
|
137
266
|
|
|
138
|
-
|
|
267
|
+
show() {
|
|
268
|
+
if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW)) {
|
|
139
269
|
return;
|
|
140
270
|
}
|
|
141
271
|
|
|
142
|
-
|
|
143
|
-
|
|
272
|
+
let actives;
|
|
273
|
+
let activesData;
|
|
144
274
|
|
|
145
275
|
if (this._parent) {
|
|
146
|
-
actives = [].
|
|
147
|
-
if (typeof
|
|
148
|
-
return elem.getAttribute('data-parent') ===
|
|
276
|
+
actives = SelectorEngine__default['default'].find(SELECTOR_ACTIVES, this._parent).filter(elem => {
|
|
277
|
+
if (typeof this._config.parent === 'string') {
|
|
278
|
+
return elem.getAttribute('data-bs-parent') === this._config.parent;
|
|
149
279
|
}
|
|
150
280
|
|
|
151
281
|
return elem.classList.contains(CLASS_NAME_COLLAPSE);
|
|
@@ -156,209 +286,221 @@
|
|
|
156
286
|
}
|
|
157
287
|
}
|
|
158
288
|
|
|
289
|
+
const container = SelectorEngine__default['default'].findOne(this._selector);
|
|
290
|
+
|
|
159
291
|
if (actives) {
|
|
160
|
-
|
|
292
|
+
const tempActiveData = actives.find(elem => container !== elem);
|
|
293
|
+
activesData = tempActiveData ? Data__default['default'].get(tempActiveData, DATA_KEY) : null;
|
|
161
294
|
|
|
162
295
|
if (activesData && activesData._isTransitioning) {
|
|
163
296
|
return;
|
|
164
297
|
}
|
|
165
298
|
}
|
|
166
299
|
|
|
167
|
-
|
|
168
|
-
$__default['default'](this._element).trigger(startEvent);
|
|
300
|
+
const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW);
|
|
169
301
|
|
|
170
|
-
if (startEvent.
|
|
302
|
+
if (startEvent.defaultPrevented) {
|
|
171
303
|
return;
|
|
172
304
|
}
|
|
173
305
|
|
|
174
306
|
if (actives) {
|
|
175
|
-
|
|
307
|
+
actives.forEach(elemActive => {
|
|
308
|
+
if (container !== elemActive) {
|
|
309
|
+
Collapse.collapseInterface(elemActive, 'hide');
|
|
310
|
+
}
|
|
176
311
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
312
|
+
if (!activesData) {
|
|
313
|
+
Data__default['default'].set(elemActive, DATA_KEY, null);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
180
316
|
}
|
|
181
317
|
|
|
182
|
-
|
|
318
|
+
const dimension = this._getDimension();
|
|
319
|
+
|
|
320
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSE);
|
|
321
|
+
|
|
322
|
+
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
|
183
323
|
|
|
184
|
-
$__default['default'](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING);
|
|
185
324
|
this._element.style[dimension] = 0;
|
|
186
325
|
|
|
187
326
|
if (this._triggerArray.length) {
|
|
188
|
-
|
|
327
|
+
this._triggerArray.forEach(element => {
|
|
328
|
+
element.classList.remove(CLASS_NAME_COLLAPSED);
|
|
329
|
+
element.setAttribute('aria-expanded', true);
|
|
330
|
+
});
|
|
189
331
|
}
|
|
190
332
|
|
|
191
333
|
this.setTransitioning(true);
|
|
192
334
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
_this._element.style[dimension] = '';
|
|
335
|
+
const complete = () => {
|
|
336
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
|
196
337
|
|
|
197
|
-
|
|
338
|
+
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
|
|
198
339
|
|
|
199
|
-
|
|
340
|
+
this._element.style[dimension] = '';
|
|
341
|
+
this.setTransitioning(false);
|
|
342
|
+
EventHandler__default['default'].trigger(this._element, EVENT_SHOWN);
|
|
200
343
|
};
|
|
201
344
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
this._element
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
_proto.hide = function hide() {
|
|
210
|
-
var _this2 = this;
|
|
345
|
+
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
|
|
346
|
+
const scrollSize = `scroll${capitalizedDimension}`;
|
|
347
|
+
const transitionDuration = getTransitionDurationFromElement(this._element);
|
|
348
|
+
EventHandler__default['default'].one(this._element, 'transitionend', complete);
|
|
349
|
+
emulateTransitionEnd(this._element, transitionDuration);
|
|
350
|
+
this._element.style[dimension] = `${this._element[scrollSize]}px`;
|
|
351
|
+
}
|
|
211
352
|
|
|
212
|
-
|
|
353
|
+
hide() {
|
|
354
|
+
if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW)) {
|
|
213
355
|
return;
|
|
214
356
|
}
|
|
215
357
|
|
|
216
|
-
|
|
217
|
-
$__default['default'](this._element).trigger(startEvent);
|
|
358
|
+
const startEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
|
|
218
359
|
|
|
219
|
-
if (startEvent.
|
|
360
|
+
if (startEvent.defaultPrevented) {
|
|
220
361
|
return;
|
|
221
362
|
}
|
|
222
363
|
|
|
223
|
-
|
|
364
|
+
const dimension = this._getDimension();
|
|
224
365
|
|
|
225
|
-
this._element.style[dimension] = this._element.getBoundingClientRect()[dimension]
|
|
226
|
-
|
|
227
|
-
$__default['default'](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW);
|
|
228
|
-
var triggerArrayLength = this._triggerArray.length;
|
|
366
|
+
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
|
|
367
|
+
reflow(this._element);
|
|
229
368
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
369
|
+
this._element.classList.add(CLASS_NAME_COLLAPSING);
|
|
370
|
+
|
|
371
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);
|
|
372
|
+
|
|
373
|
+
const triggerArrayLength = this._triggerArray.length;
|
|
234
374
|
|
|
235
|
-
|
|
236
|
-
|
|
375
|
+
if (triggerArrayLength > 0) {
|
|
376
|
+
for (let i = 0; i < triggerArrayLength; i++) {
|
|
377
|
+
const trigger = this._triggerArray[i];
|
|
378
|
+
const elem = getElementFromSelector(trigger);
|
|
237
379
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
380
|
+
if (elem && !elem.classList.contains(CLASS_NAME_SHOW)) {
|
|
381
|
+
trigger.classList.add(CLASS_NAME_COLLAPSED);
|
|
382
|
+
trigger.setAttribute('aria-expanded', false);
|
|
241
383
|
}
|
|
242
384
|
}
|
|
243
385
|
}
|
|
244
386
|
|
|
245
387
|
this.setTransitioning(true);
|
|
246
388
|
|
|
247
|
-
|
|
248
|
-
|
|
389
|
+
const complete = () => {
|
|
390
|
+
this.setTransitioning(false);
|
|
391
|
+
|
|
392
|
+
this._element.classList.remove(CLASS_NAME_COLLAPSING);
|
|
249
393
|
|
|
250
|
-
|
|
394
|
+
this._element.classList.add(CLASS_NAME_COLLAPSE);
|
|
395
|
+
|
|
396
|
+
EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
|
|
251
397
|
};
|
|
252
398
|
|
|
253
399
|
this._element.style[dimension] = '';
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
400
|
+
const transitionDuration = getTransitionDurationFromElement(this._element);
|
|
401
|
+
EventHandler__default['default'].one(this._element, 'transitionend', complete);
|
|
402
|
+
emulateTransitionEnd(this._element, transitionDuration);
|
|
403
|
+
}
|
|
257
404
|
|
|
258
|
-
|
|
405
|
+
setTransitioning(isTransitioning) {
|
|
259
406
|
this._isTransitioning = isTransitioning;
|
|
260
|
-
}
|
|
407
|
+
}
|
|
261
408
|
|
|
262
|
-
|
|
263
|
-
|
|
409
|
+
dispose() {
|
|
410
|
+
super.dispose();
|
|
264
411
|
this._config = null;
|
|
265
412
|
this._parent = null;
|
|
266
|
-
this._element = null;
|
|
267
413
|
this._triggerArray = null;
|
|
268
414
|
this._isTransitioning = null;
|
|
269
415
|
} // Private
|
|
270
|
-
;
|
|
271
416
|
|
|
272
|
-
|
|
273
|
-
|
|
417
|
+
|
|
418
|
+
_getConfig(config) {
|
|
419
|
+
config = { ...Default,
|
|
420
|
+
...config
|
|
421
|
+
};
|
|
274
422
|
config.toggle = Boolean(config.toggle); // Coerce string values
|
|
275
423
|
|
|
276
|
-
|
|
424
|
+
typeCheckConfig(NAME, config, DefaultType);
|
|
277
425
|
return config;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
_proto._getDimension = function _getDimension() {
|
|
281
|
-
var hasWidth = $__default['default'](this._element).hasClass(DIMENSION_WIDTH);
|
|
282
|
-
return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT;
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
_proto._getParent = function _getParent() {
|
|
286
|
-
var _this3 = this;
|
|
426
|
+
}
|
|
287
427
|
|
|
288
|
-
|
|
428
|
+
_getDimension() {
|
|
429
|
+
return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT;
|
|
430
|
+
}
|
|
289
431
|
|
|
290
|
-
|
|
291
|
-
|
|
432
|
+
_getParent() {
|
|
433
|
+
let {
|
|
434
|
+
parent
|
|
435
|
+
} = this._config;
|
|
292
436
|
|
|
293
|
-
|
|
294
|
-
|
|
437
|
+
if (isElement(parent)) {
|
|
438
|
+
// it's a jQuery object
|
|
439
|
+
if (typeof parent.jquery !== 'undefined' || typeof parent[0] !== 'undefined') {
|
|
440
|
+
parent = parent[0];
|
|
295
441
|
}
|
|
296
442
|
} else {
|
|
297
|
-
parent =
|
|
443
|
+
parent = SelectorEngine__default['default'].findOne(parent);
|
|
298
444
|
}
|
|
299
445
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
446
|
+
const selector = `${SELECTOR_DATA_TOGGLE}[data-bs-parent="${parent}"]`;
|
|
447
|
+
SelectorEngine__default['default'].find(selector, parent).forEach(element => {
|
|
448
|
+
const selected = getElementFromSelector(element);
|
|
449
|
+
|
|
450
|
+
this._addAriaAndCollapsedClass(selected, [element]);
|
|
304
451
|
});
|
|
305
452
|
return parent;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
_proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
|
|
309
|
-
var isOpen = $__default['default'](element).hasClass(CLASS_NAME_SHOW);
|
|
453
|
+
}
|
|
310
454
|
|
|
311
|
-
|
|
312
|
-
|
|
455
|
+
_addAriaAndCollapsedClass(element, triggerArray) {
|
|
456
|
+
if (!element || !triggerArray.length) {
|
|
457
|
+
return;
|
|
313
458
|
}
|
|
314
|
-
} // Static
|
|
315
|
-
;
|
|
316
459
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
460
|
+
const isOpen = element.classList.contains(CLASS_NAME_SHOW);
|
|
461
|
+
triggerArray.forEach(elem => {
|
|
462
|
+
if (isOpen) {
|
|
463
|
+
elem.classList.remove(CLASS_NAME_COLLAPSED);
|
|
464
|
+
} else {
|
|
465
|
+
elem.classList.add(CLASS_NAME_COLLAPSED);
|
|
466
|
+
}
|
|
321
467
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
var data = $element.data(DATA_KEY);
|
|
468
|
+
elem.setAttribute('aria-expanded', isOpen);
|
|
469
|
+
});
|
|
470
|
+
} // Static
|
|
326
471
|
|
|
327
|
-
var _config = _extends({}, Default, $element.data(), typeof config === 'object' && config ? config : {});
|
|
328
472
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
473
|
+
static collapseInterface(element, config) {
|
|
474
|
+
let data = Data__default['default'].get(element, DATA_KEY);
|
|
475
|
+
const _config = { ...Default,
|
|
476
|
+
...Manipulator__default['default'].getDataAttributes(element),
|
|
477
|
+
...(typeof config === 'object' && config ? config : {})
|
|
478
|
+
};
|
|
332
479
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
}
|
|
480
|
+
if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
|
|
481
|
+
_config.toggle = false;
|
|
482
|
+
}
|
|
337
483
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
}
|
|
484
|
+
if (!data) {
|
|
485
|
+
data = new Collapse(element, _config);
|
|
486
|
+
}
|
|
342
487
|
|
|
343
|
-
|
|
488
|
+
if (typeof config === 'string') {
|
|
489
|
+
if (typeof data[config] === 'undefined') {
|
|
490
|
+
throw new TypeError(`No method named "${config}"`);
|
|
344
491
|
}
|
|
345
|
-
});
|
|
346
|
-
};
|
|
347
492
|
|
|
348
|
-
|
|
349
|
-
key: "VERSION",
|
|
350
|
-
get: function get() {
|
|
351
|
-
return VERSION;
|
|
352
|
-
}
|
|
353
|
-
}, {
|
|
354
|
-
key: "Default",
|
|
355
|
-
get: function get() {
|
|
356
|
-
return Default;
|
|
493
|
+
data[config]();
|
|
357
494
|
}
|
|
358
|
-
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
static jQueryInterface(config) {
|
|
498
|
+
return this.each(function () {
|
|
499
|
+
Collapse.collapseInterface(this, config);
|
|
500
|
+
});
|
|
501
|
+
}
|
|
359
502
|
|
|
360
|
-
|
|
361
|
-
}();
|
|
503
|
+
}
|
|
362
504
|
/**
|
|
363
505
|
* ------------------------------------------------------------------------
|
|
364
506
|
* Data Api implementation
|
|
@@ -366,36 +508,42 @@
|
|
|
366
508
|
*/
|
|
367
509
|
|
|
368
510
|
|
|
369
|
-
|
|
511
|
+
EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
370
512
|
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
|
|
371
|
-
if (event.
|
|
513
|
+
if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
|
|
372
514
|
event.preventDefault();
|
|
373
515
|
}
|
|
374
516
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
517
|
+
const triggerData = Manipulator__default['default'].getDataAttributes(this);
|
|
518
|
+
const selector = getSelectorFromElement(this);
|
|
519
|
+
const selectorElements = SelectorEngine__default['default'].find(selector);
|
|
520
|
+
selectorElements.forEach(element => {
|
|
521
|
+
const data = Data__default['default'].get(element, DATA_KEY);
|
|
522
|
+
let config;
|
|
523
|
+
|
|
524
|
+
if (data) {
|
|
525
|
+
// update parent attribute
|
|
526
|
+
if (data._parent === null && typeof triggerData.parent === 'string') {
|
|
527
|
+
data._config.parent = triggerData.parent;
|
|
528
|
+
data._parent = data._getParent();
|
|
529
|
+
}
|
|
382
530
|
|
|
383
|
-
|
|
531
|
+
config = 'toggle';
|
|
532
|
+
} else {
|
|
533
|
+
config = triggerData;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
Collapse.collapseInterface(element, config);
|
|
384
537
|
});
|
|
385
538
|
});
|
|
386
539
|
/**
|
|
387
540
|
* ------------------------------------------------------------------------
|
|
388
541
|
* jQuery
|
|
389
542
|
* ------------------------------------------------------------------------
|
|
543
|
+
* add .Collapse to jQuery only if jQuery is present
|
|
390
544
|
*/
|
|
391
545
|
|
|
392
|
-
|
|
393
|
-
$__default['default'].fn[NAME].Constructor = Collapse;
|
|
394
|
-
|
|
395
|
-
$__default['default'].fn[NAME].noConflict = function () {
|
|
396
|
-
$__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
|
|
397
|
-
return Collapse._jQueryInterface;
|
|
398
|
-
};
|
|
546
|
+
defineJQueryPlugin(NAME, Collapse);
|
|
399
547
|
|
|
400
548
|
return Collapse;
|
|
401
549
|
|