bootstrap 5.1.3 → 5.2.2
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/README.md +24 -4
- data/assets/javascripts/bootstrap/alert.js +11 -146
- data/assets/javascripts/bootstrap/base-component.js +37 -120
- data/assets/javascripts/bootstrap/button.js +10 -74
- data/assets/javascripts/bootstrap/carousel.js +213 -485
- data/assets/javascripts/bootstrap/collapse.js +65 -249
- data/assets/javascripts/bootstrap/dom/data.js +3 -5
- data/assets/javascripts/bootstrap/dom/event-handler.js +94 -132
- data/assets/javascripts/bootstrap/dom/manipulator.js +23 -27
- data/assets/javascripts/bootstrap/dom/selector-engine.js +16 -58
- data/assets/javascripts/bootstrap/dropdown.js +103 -317
- data/assets/javascripts/bootstrap/modal.js +107 -749
- data/assets/javascripts/bootstrap/offcanvas.js +90 -659
- data/assets/javascripts/bootstrap/popover.js +36 -118
- data/assets/javascripts/bootstrap/scrollspy.js +183 -262
- data/assets/javascripts/bootstrap/tab.js +215 -214
- data/assets/javascripts/bootstrap/toast.js +36 -218
- data/assets/javascripts/bootstrap/tooltip.js +280 -629
- data/assets/javascripts/bootstrap/util/backdrop.js +165 -0
- data/assets/javascripts/bootstrap/util/component-functions.js +46 -0
- data/assets/javascripts/bootstrap/util/config.js +79 -0
- data/assets/javascripts/bootstrap/util/focustrap.js +129 -0
- data/assets/javascripts/bootstrap/util/index.js +350 -0
- data/assets/javascripts/bootstrap/util/sanitizer.js +122 -0
- data/assets/javascripts/bootstrap/util/scrollbar.js +138 -0
- data/assets/javascripts/bootstrap/util/swipe.js +155 -0
- data/assets/javascripts/bootstrap/util/template-factory.js +177 -0
- data/assets/javascripts/bootstrap-global-this-define.js +1 -1
- data/assets/javascripts/bootstrap-sprockets.js +17 -8
- data/assets/javascripts/bootstrap.js +2093 -1881
- data/assets/javascripts/bootstrap.min.js +3 -3
- data/assets/stylesheets/_bootstrap-grid.scss +3 -6
- data/assets/stylesheets/_bootstrap-reboot.scss +3 -7
- data/assets/stylesheets/_bootstrap.scss +4 -6
- data/assets/stylesheets/bootstrap/_accordion.scss +56 -25
- data/assets/stylesheets/bootstrap/_alert.scss +18 -4
- data/assets/stylesheets/bootstrap/_badge.scss +14 -5
- data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -10
- data/assets/stylesheets/bootstrap/_button-group.scss +4 -1
- data/assets/stylesheets/bootstrap/_buttons.scss +125 -29
- data/assets/stylesheets/bootstrap/_card.scss +55 -37
- data/assets/stylesheets/bootstrap/_close.scss +1 -1
- data/assets/stylesheets/bootstrap/_containers.scss +1 -1
- data/assets/stylesheets/bootstrap/_dropdown.scss +85 -76
- data/assets/stylesheets/bootstrap/_functions.scss +8 -8
- data/assets/stylesheets/bootstrap/_grid.scss +3 -3
- data/assets/stylesheets/bootstrap/_helpers.scss +1 -0
- data/assets/stylesheets/bootstrap/_list-group.scss +48 -30
- data/assets/stylesheets/bootstrap/_maps.scss +54 -0
- data/assets/stylesheets/bootstrap/_modal.scss +71 -43
- data/assets/stylesheets/bootstrap/_nav.scss +53 -20
- data/assets/stylesheets/bootstrap/_navbar.scss +93 -150
- data/assets/stylesheets/bootstrap/_offcanvas.scss +120 -59
- data/assets/stylesheets/bootstrap/_pagination.scss +66 -21
- data/assets/stylesheets/bootstrap/_placeholders.scss +1 -1
- data/assets/stylesheets/bootstrap/_popover.scss +90 -52
- data/assets/stylesheets/bootstrap/_progress.scss +20 -9
- data/assets/stylesheets/bootstrap/_reboot.scss +25 -40
- data/assets/stylesheets/bootstrap/_root.scss +40 -21
- data/assets/stylesheets/bootstrap/_spinners.scss +38 -22
- data/assets/stylesheets/bootstrap/_tables.scss +32 -23
- data/assets/stylesheets/bootstrap/_toasts.scss +38 -16
- data/assets/stylesheets/bootstrap/_tooltip.scss +61 -56
- data/assets/stylesheets/bootstrap/_type.scss +2 -0
- data/assets/stylesheets/bootstrap/_utilities.scss +43 -26
- data/assets/stylesheets/bootstrap/_variables.scss +128 -135
- data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +3 -6
- data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +15 -3
- data/assets/stylesheets/bootstrap/forms/_form-check.scss +28 -5
- data/assets/stylesheets/bootstrap/forms/_form-control.scss +12 -37
- data/assets/stylesheets/bootstrap/forms/_form-select.scss +0 -1
- data/assets/stylesheets/bootstrap/forms/_input-group.scss +19 -8
- data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +10 -0
- data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_position.scss +7 -1
- data/assets/stylesheets/bootstrap/helpers/_ratio.scss +2 -2
- data/assets/stylesheets/bootstrap/helpers/_vr.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_alert.scss +7 -3
- data/assets/stylesheets/bootstrap/mixins/_banner.scss +9 -0
- data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +8 -8
- data/assets/stylesheets/bootstrap/mixins/_buttons.scss +32 -95
- data/assets/stylesheets/bootstrap/mixins/_container.scss +4 -2
- data/assets/stylesheets/bootstrap/mixins/_forms.scss +18 -10
- data/assets/stylesheets/bootstrap/mixins/_gradients.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_grid.scss +12 -12
- data/assets/stylesheets/bootstrap/mixins/_pagination.scss +4 -25
- data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +1 -1
- data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +12 -9
- data/assets/stylesheets/bootstrap/mixins/_utilities.scss +13 -5
- data/bootstrap.gemspec +1 -1
- data/lib/bootstrap/version.rb +2 -2
- data/tasks/updater/js.rb +10 -5
- data/tasks/updater.rb +2 -2
- metadata +16 -4
|
@@ -1,620 +1,31 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Bootstrap offcanvas.js v5.
|
|
3
|
-
* Copyright 2011-
|
|
2
|
+
* Bootstrap offcanvas.js v5.2.2 (https://getbootstrap.com/)
|
|
3
|
+
* Copyright 2011-2022 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.Offcanvas = factory(global.
|
|
10
|
-
})(this, (function (
|
|
7
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./util/index'), require('./util/scrollbar'), require('./dom/event-handler'), require('./base-component'), require('./dom/selector-engine'), require('./util/backdrop'), require('./util/focustrap'), require('./util/component-functions')) :
|
|
8
|
+
typeof define === 'function' && define.amd ? define(['./util/index', './util/scrollbar', './dom/event-handler', './base-component', './dom/selector-engine', './util/backdrop', './util/focustrap', './util/component-functions'], factory) :
|
|
9
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Offcanvas = factory(global.Index, global.Scrollbar, global.EventHandler, global.BaseComponent, global.SelectorEngine, global.Backdrop, global.Focustrap, global.ComponentFunctions));
|
|
10
|
+
})(this, (function (index, ScrollBarHelper, EventHandler, BaseComponent, SelectorEngine, Backdrop, FocusTrap, componentFunctions) { 'use strict';
|
|
11
11
|
|
|
12
12
|
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
|
|
13
13
|
|
|
14
|
-
const
|
|
15
|
-
const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
|
|
14
|
+
const ScrollBarHelper__default = /*#__PURE__*/_interopDefaultLegacy(ScrollBarHelper);
|
|
16
15
|
const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
|
|
17
16
|
const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
|
|
17
|
+
const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
|
|
18
|
+
const Backdrop__default = /*#__PURE__*/_interopDefaultLegacy(Backdrop);
|
|
19
|
+
const FocusTrap__default = /*#__PURE__*/_interopDefaultLegacy(FocusTrap);
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* --------------------------------------------------------------------------
|
|
21
|
-
* Bootstrap (v5.
|
|
22
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
23
|
-
* --------------------------------------------------------------------------
|
|
24
|
-
*/
|
|
25
|
-
const MILLISECONDS_MULTIPLIER = 1000;
|
|
26
|
-
const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
|
|
27
|
-
|
|
28
|
-
const toType = obj => {
|
|
29
|
-
if (obj === null || obj === undefined) {
|
|
30
|
-
return `${obj}`;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const getSelector = element => {
|
|
37
|
-
let selector = element.getAttribute('data-bs-target');
|
|
38
|
-
|
|
39
|
-
if (!selector || selector === '#') {
|
|
40
|
-
let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
|
|
41
|
-
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
|
|
42
|
-
// `document.querySelector` will rightfully complain it is invalid.
|
|
43
|
-
// See https://github.com/twbs/bootstrap/issues/32273
|
|
44
|
-
|
|
45
|
-
if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
|
|
46
|
-
return null;
|
|
47
|
-
} // Just in case some CMS puts out a full URL with the anchor appended
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
|
|
51
|
-
hrefAttr = `#${hrefAttr.split('#')[1]}`;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return selector;
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const getElementFromSelector = element => {
|
|
61
|
-
const selector = getSelector(element);
|
|
62
|
-
return selector ? document.querySelector(selector) : null;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const getTransitionDurationFromElement = element => {
|
|
66
|
-
if (!element) {
|
|
67
|
-
return 0;
|
|
68
|
-
} // Get transition-duration of the element
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
let {
|
|
72
|
-
transitionDuration,
|
|
73
|
-
transitionDelay
|
|
74
|
-
} = window.getComputedStyle(element);
|
|
75
|
-
const floatTransitionDuration = Number.parseFloat(transitionDuration);
|
|
76
|
-
const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
|
|
77
|
-
|
|
78
|
-
if (!floatTransitionDuration && !floatTransitionDelay) {
|
|
79
|
-
return 0;
|
|
80
|
-
} // If multiple durations are defined, take the first
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
transitionDuration = transitionDuration.split(',')[0];
|
|
84
|
-
transitionDelay = transitionDelay.split(',')[0];
|
|
85
|
-
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const triggerTransitionEnd = element => {
|
|
89
|
-
element.dispatchEvent(new Event(TRANSITION_END));
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const isElement = obj => {
|
|
93
|
-
if (!obj || typeof obj !== 'object') {
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
if (typeof obj.jquery !== 'undefined') {
|
|
98
|
-
obj = obj[0];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return typeof obj.nodeType !== 'undefined';
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const getElement = obj => {
|
|
105
|
-
if (isElement(obj)) {
|
|
106
|
-
// it's a jQuery object or a node element
|
|
107
|
-
return obj.jquery ? obj[0] : obj;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (typeof obj === 'string' && obj.length > 0) {
|
|
111
|
-
return document.querySelector(obj);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return null;
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
const typeCheckConfig = (componentName, config, configTypes) => {
|
|
118
|
-
Object.keys(configTypes).forEach(property => {
|
|
119
|
-
const expectedTypes = configTypes[property];
|
|
120
|
-
const value = config[property];
|
|
121
|
-
const valueType = value && isElement(value) ? 'element' : toType(value);
|
|
122
|
-
|
|
123
|
-
if (!new RegExp(expectedTypes).test(valueType)) {
|
|
124
|
-
throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
const isVisible = element => {
|
|
130
|
-
if (!isElement(element) || element.getClientRects().length === 0) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
const isDisabled = element => {
|
|
138
|
-
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (element.classList.contains('disabled')) {
|
|
143
|
-
return true;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (typeof element.disabled !== 'undefined') {
|
|
147
|
-
return element.disabled;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
|
|
151
|
-
};
|
|
152
|
-
/**
|
|
153
|
-
* Trick to restart an element's animation
|
|
154
|
-
*
|
|
155
|
-
* @param {HTMLElement} element
|
|
156
|
-
* @return void
|
|
157
|
-
*
|
|
158
|
-
* @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
|
|
159
|
-
*/
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const reflow = element => {
|
|
163
|
-
// eslint-disable-next-line no-unused-expressions
|
|
164
|
-
element.offsetHeight;
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const getjQuery = () => {
|
|
168
|
-
const {
|
|
169
|
-
jQuery
|
|
170
|
-
} = window;
|
|
171
|
-
|
|
172
|
-
if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
|
|
173
|
-
return jQuery;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return null;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
const DOMContentLoadedCallbacks = [];
|
|
180
|
-
|
|
181
|
-
const onDOMContentLoaded = callback => {
|
|
182
|
-
if (document.readyState === 'loading') {
|
|
183
|
-
// add listener on the first call when the document is in loading state
|
|
184
|
-
if (!DOMContentLoadedCallbacks.length) {
|
|
185
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
186
|
-
DOMContentLoadedCallbacks.forEach(callback => callback());
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
DOMContentLoadedCallbacks.push(callback);
|
|
191
|
-
} else {
|
|
192
|
-
callback();
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
const defineJQueryPlugin = plugin => {
|
|
197
|
-
onDOMContentLoaded(() => {
|
|
198
|
-
const $ = getjQuery();
|
|
199
|
-
/* istanbul ignore if */
|
|
200
|
-
|
|
201
|
-
if ($) {
|
|
202
|
-
const name = plugin.NAME;
|
|
203
|
-
const JQUERY_NO_CONFLICT = $.fn[name];
|
|
204
|
-
$.fn[name] = plugin.jQueryInterface;
|
|
205
|
-
$.fn[name].Constructor = plugin;
|
|
206
|
-
|
|
207
|
-
$.fn[name].noConflict = () => {
|
|
208
|
-
$.fn[name] = JQUERY_NO_CONFLICT;
|
|
209
|
-
return plugin.jQueryInterface;
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
};
|
|
214
|
-
|
|
215
|
-
const execute = callback => {
|
|
216
|
-
if (typeof callback === 'function') {
|
|
217
|
-
callback();
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
|
|
222
|
-
if (!waitForTransition) {
|
|
223
|
-
execute(callback);
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
const durationPadding = 5;
|
|
228
|
-
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
|
|
229
|
-
let called = false;
|
|
230
|
-
|
|
231
|
-
const handler = ({
|
|
232
|
-
target
|
|
233
|
-
}) => {
|
|
234
|
-
if (target !== transitionElement) {
|
|
235
|
-
return;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
called = true;
|
|
239
|
-
transitionElement.removeEventListener(TRANSITION_END, handler);
|
|
240
|
-
execute(callback);
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
transitionElement.addEventListener(TRANSITION_END, handler);
|
|
244
|
-
setTimeout(() => {
|
|
245
|
-
if (!called) {
|
|
246
|
-
triggerTransitionEnd(transitionElement);
|
|
247
|
-
}
|
|
248
|
-
}, emulatedDuration);
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* --------------------------------------------------------------------------
|
|
253
|
-
* Bootstrap (v5.1.3): util/scrollBar.js
|
|
254
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
255
|
-
* --------------------------------------------------------------------------
|
|
256
|
-
*/
|
|
257
|
-
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
|
|
258
|
-
const SELECTOR_STICKY_CONTENT = '.sticky-top';
|
|
259
|
-
|
|
260
|
-
class ScrollBarHelper {
|
|
261
|
-
constructor() {
|
|
262
|
-
this._element = document.body;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
getWidth() {
|
|
266
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
|
|
267
|
-
const documentWidth = document.documentElement.clientWidth;
|
|
268
|
-
return Math.abs(window.innerWidth - documentWidth);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
hide() {
|
|
272
|
-
const width = this.getWidth();
|
|
273
|
-
|
|
274
|
-
this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
|
|
281
|
-
|
|
282
|
-
this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
_disableOverFlow() {
|
|
286
|
-
this._saveInitialAttribute(this._element, 'overflow');
|
|
287
|
-
|
|
288
|
-
this._element.style.overflow = 'hidden';
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
_setElementAttributes(selector, styleProp, callback) {
|
|
292
|
-
const scrollbarWidth = this.getWidth();
|
|
293
|
-
|
|
294
|
-
const manipulationCallBack = element => {
|
|
295
|
-
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
this._saveInitialAttribute(element, styleProp);
|
|
300
|
-
|
|
301
|
-
const calculatedValue = window.getComputedStyle(element)[styleProp];
|
|
302
|
-
element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
reset() {
|
|
309
|
-
this._resetElementAttributes(this._element, 'overflow');
|
|
310
|
-
|
|
311
|
-
this._resetElementAttributes(this._element, 'paddingRight');
|
|
312
|
-
|
|
313
|
-
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
|
|
314
|
-
|
|
315
|
-
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
_saveInitialAttribute(element, styleProp) {
|
|
319
|
-
const actualValue = element.style[styleProp];
|
|
320
|
-
|
|
321
|
-
if (actualValue) {
|
|
322
|
-
Manipulator__default.default.setDataAttribute(element, styleProp, actualValue);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
_resetElementAttributes(selector, styleProp) {
|
|
327
|
-
const manipulationCallBack = element => {
|
|
328
|
-
const value = Manipulator__default.default.getDataAttribute(element, styleProp);
|
|
329
|
-
|
|
330
|
-
if (typeof value === 'undefined') {
|
|
331
|
-
element.style.removeProperty(styleProp);
|
|
332
|
-
} else {
|
|
333
|
-
Manipulator__default.default.removeDataAttribute(element, styleProp);
|
|
334
|
-
element.style[styleProp] = value;
|
|
335
|
-
}
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
this._applyManipulationCallback(selector, manipulationCallBack);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
_applyManipulationCallback(selector, callBack) {
|
|
342
|
-
if (isElement(selector)) {
|
|
343
|
-
callBack(selector);
|
|
344
|
-
} else {
|
|
345
|
-
SelectorEngine__default.default.find(selector, this._element).forEach(callBack);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
isOverflowing() {
|
|
350
|
-
return this.getWidth() > 0;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* --------------------------------------------------------------------------
|
|
357
|
-
* Bootstrap (v5.1.3): util/backdrop.js
|
|
358
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
359
|
-
* --------------------------------------------------------------------------
|
|
360
|
-
*/
|
|
361
|
-
const Default$2 = {
|
|
362
|
-
className: 'modal-backdrop',
|
|
363
|
-
isVisible: true,
|
|
364
|
-
// if false, we use the backdrop helper without adding any element to the dom
|
|
365
|
-
isAnimated: false,
|
|
366
|
-
rootElement: 'body',
|
|
367
|
-
// give the choice to place backdrop under different elements
|
|
368
|
-
clickCallback: null
|
|
369
|
-
};
|
|
370
|
-
const DefaultType$2 = {
|
|
371
|
-
className: 'string',
|
|
372
|
-
isVisible: 'boolean',
|
|
373
|
-
isAnimated: 'boolean',
|
|
374
|
-
rootElement: '(element|string)',
|
|
375
|
-
clickCallback: '(function|null)'
|
|
376
|
-
};
|
|
377
|
-
const NAME$2 = 'backdrop';
|
|
378
|
-
const CLASS_NAME_FADE = 'fade';
|
|
379
|
-
const CLASS_NAME_SHOW$1 = 'show';
|
|
380
|
-
const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$2}`;
|
|
381
|
-
|
|
382
|
-
class Backdrop {
|
|
383
|
-
constructor(config) {
|
|
384
|
-
this._config = this._getConfig(config);
|
|
385
|
-
this._isAppended = false;
|
|
386
|
-
this._element = null;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
show(callback) {
|
|
390
|
-
if (!this._config.isVisible) {
|
|
391
|
-
execute(callback);
|
|
392
|
-
return;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
this._append();
|
|
396
|
-
|
|
397
|
-
if (this._config.isAnimated) {
|
|
398
|
-
reflow(this._getElement());
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
this._getElement().classList.add(CLASS_NAME_SHOW$1);
|
|
402
|
-
|
|
403
|
-
this._emulateAnimation(() => {
|
|
404
|
-
execute(callback);
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
hide(callback) {
|
|
409
|
-
if (!this._config.isVisible) {
|
|
410
|
-
execute(callback);
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
this._getElement().classList.remove(CLASS_NAME_SHOW$1);
|
|
415
|
-
|
|
416
|
-
this._emulateAnimation(() => {
|
|
417
|
-
this.dispose();
|
|
418
|
-
execute(callback);
|
|
419
|
-
});
|
|
420
|
-
} // Private
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
_getElement() {
|
|
424
|
-
if (!this._element) {
|
|
425
|
-
const backdrop = document.createElement('div');
|
|
426
|
-
backdrop.className = this._config.className;
|
|
427
|
-
|
|
428
|
-
if (this._config.isAnimated) {
|
|
429
|
-
backdrop.classList.add(CLASS_NAME_FADE);
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
this._element = backdrop;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
return this._element;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
_getConfig(config) {
|
|
439
|
-
config = { ...Default$2,
|
|
440
|
-
...(typeof config === 'object' ? config : {})
|
|
441
|
-
}; // use getElement() with the default "body" to get a fresh Element on each instantiation
|
|
442
|
-
|
|
443
|
-
config.rootElement = getElement(config.rootElement);
|
|
444
|
-
typeCheckConfig(NAME$2, config, DefaultType$2);
|
|
445
|
-
return config;
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
_append() {
|
|
449
|
-
if (this._isAppended) {
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
this._config.rootElement.append(this._getElement());
|
|
454
|
-
|
|
455
|
-
EventHandler__default.default.on(this._getElement(), EVENT_MOUSEDOWN, () => {
|
|
456
|
-
execute(this._config.clickCallback);
|
|
457
|
-
});
|
|
458
|
-
this._isAppended = true;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
dispose() {
|
|
462
|
-
if (!this._isAppended) {
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
EventHandler__default.default.off(this._element, EVENT_MOUSEDOWN);
|
|
467
|
-
|
|
468
|
-
this._element.remove();
|
|
469
|
-
|
|
470
|
-
this._isAppended = false;
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
_emulateAnimation(callback) {
|
|
474
|
-
executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/**
|
|
480
|
-
* --------------------------------------------------------------------------
|
|
481
|
-
* Bootstrap (v5.1.3): util/focustrap.js
|
|
482
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
483
|
-
* --------------------------------------------------------------------------
|
|
484
|
-
*/
|
|
485
|
-
const Default$1 = {
|
|
486
|
-
trapElement: null,
|
|
487
|
-
// The element to trap focus inside of
|
|
488
|
-
autofocus: true
|
|
489
|
-
};
|
|
490
|
-
const DefaultType$1 = {
|
|
491
|
-
trapElement: 'element',
|
|
492
|
-
autofocus: 'boolean'
|
|
493
|
-
};
|
|
494
|
-
const NAME$1 = 'focustrap';
|
|
495
|
-
const DATA_KEY$1 = 'bs.focustrap';
|
|
496
|
-
const EVENT_KEY$1 = `.${DATA_KEY$1}`;
|
|
497
|
-
const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
|
|
498
|
-
const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
|
|
499
|
-
const TAB_KEY = 'Tab';
|
|
500
|
-
const TAB_NAV_FORWARD = 'forward';
|
|
501
|
-
const TAB_NAV_BACKWARD = 'backward';
|
|
502
|
-
|
|
503
|
-
class FocusTrap {
|
|
504
|
-
constructor(config) {
|
|
505
|
-
this._config = this._getConfig(config);
|
|
506
|
-
this._isActive = false;
|
|
507
|
-
this._lastTabNavDirection = null;
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
activate() {
|
|
511
|
-
const {
|
|
512
|
-
trapElement,
|
|
513
|
-
autofocus
|
|
514
|
-
} = this._config;
|
|
515
|
-
|
|
516
|
-
if (this._isActive) {
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
if (autofocus) {
|
|
521
|
-
trapElement.focus();
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
EventHandler__default.default.off(document, EVENT_KEY$1); // guard against infinite focus loop
|
|
525
|
-
|
|
526
|
-
EventHandler__default.default.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
|
|
527
|
-
EventHandler__default.default.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
|
|
528
|
-
this._isActive = true;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
deactivate() {
|
|
532
|
-
if (!this._isActive) {
|
|
533
|
-
return;
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
this._isActive = false;
|
|
537
|
-
EventHandler__default.default.off(document, EVENT_KEY$1);
|
|
538
|
-
} // Private
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
_handleFocusin(event) {
|
|
542
|
-
const {
|
|
543
|
-
target
|
|
544
|
-
} = event;
|
|
545
|
-
const {
|
|
546
|
-
trapElement
|
|
547
|
-
} = this._config;
|
|
548
|
-
|
|
549
|
-
if (target === document || target === trapElement || trapElement.contains(target)) {
|
|
550
|
-
return;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
const elements = SelectorEngine__default.default.focusableChildren(trapElement);
|
|
554
|
-
|
|
555
|
-
if (elements.length === 0) {
|
|
556
|
-
trapElement.focus();
|
|
557
|
-
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
|
|
558
|
-
elements[elements.length - 1].focus();
|
|
559
|
-
} else {
|
|
560
|
-
elements[0].focus();
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
_handleKeydown(event) {
|
|
565
|
-
if (event.key !== TAB_KEY) {
|
|
566
|
-
return;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
|
|
570
|
-
}
|
|
571
|
-
|
|
572
|
-
_getConfig(config) {
|
|
573
|
-
config = { ...Default$1,
|
|
574
|
-
...(typeof config === 'object' ? config : {})
|
|
575
|
-
};
|
|
576
|
-
typeCheckConfig(NAME$1, config, DefaultType$1);
|
|
577
|
-
return config;
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
/**
|
|
583
|
-
* --------------------------------------------------------------------------
|
|
584
|
-
* Bootstrap (v5.1.3): util/component-functions.js
|
|
585
|
-
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
586
|
-
* --------------------------------------------------------------------------
|
|
587
|
-
*/
|
|
588
|
-
|
|
589
|
-
const enableDismissTrigger = (component, method = 'hide') => {
|
|
590
|
-
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
|
|
591
|
-
const name = component.NAME;
|
|
592
|
-
EventHandler__default.default.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
|
|
593
|
-
if (['A', 'AREA'].includes(this.tagName)) {
|
|
594
|
-
event.preventDefault();
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
if (isDisabled(this)) {
|
|
598
|
-
return;
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
const target = getElementFromSelector(this) || this.closest(`.${name}`);
|
|
602
|
-
const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
|
|
603
|
-
|
|
604
|
-
instance[method]();
|
|
605
|
-
});
|
|
606
|
-
};
|
|
607
|
-
|
|
608
|
-
/**
|
|
609
|
-
* --------------------------------------------------------------------------
|
|
610
|
-
* Bootstrap (v5.1.3): offcanvas.js
|
|
23
|
+
* Bootstrap (v5.2.2): offcanvas.js
|
|
611
24
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
612
25
|
* --------------------------------------------------------------------------
|
|
613
26
|
*/
|
|
614
27
|
/**
|
|
615
|
-
* ------------------------------------------------------------------------
|
|
616
28
|
* Constants
|
|
617
|
-
* ------------------------------------------------------------------------
|
|
618
29
|
*/
|
|
619
30
|
|
|
620
31
|
const NAME = 'offcanvas';
|
|
@@ -623,36 +34,37 @@
|
|
|
623
34
|
const DATA_API_KEY = '.data-api';
|
|
624
35
|
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;
|
|
625
36
|
const ESCAPE_KEY = 'Escape';
|
|
626
|
-
const Default = {
|
|
627
|
-
backdrop: true,
|
|
628
|
-
keyboard: true,
|
|
629
|
-
scroll: false
|
|
630
|
-
};
|
|
631
|
-
const DefaultType = {
|
|
632
|
-
backdrop: 'boolean',
|
|
633
|
-
keyboard: 'boolean',
|
|
634
|
-
scroll: 'boolean'
|
|
635
|
-
};
|
|
636
37
|
const CLASS_NAME_SHOW = 'show';
|
|
38
|
+
const CLASS_NAME_SHOWING = 'showing';
|
|
39
|
+
const CLASS_NAME_HIDING = 'hiding';
|
|
637
40
|
const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
|
|
638
41
|
const OPEN_SELECTOR = '.offcanvas.show';
|
|
639
42
|
const EVENT_SHOW = `show${EVENT_KEY}`;
|
|
640
43
|
const EVENT_SHOWN = `shown${EVENT_KEY}`;
|
|
641
44
|
const EVENT_HIDE = `hide${EVENT_KEY}`;
|
|
45
|
+
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;
|
|
642
46
|
const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
|
|
47
|
+
const EVENT_RESIZE = `resize${EVENT_KEY}`;
|
|
643
48
|
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
|
|
644
49
|
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
|
|
645
50
|
const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]';
|
|
51
|
+
const Default = {
|
|
52
|
+
backdrop: true,
|
|
53
|
+
keyboard: true,
|
|
54
|
+
scroll: false
|
|
55
|
+
};
|
|
56
|
+
const DefaultType = {
|
|
57
|
+
backdrop: '(boolean|string)',
|
|
58
|
+
keyboard: 'boolean',
|
|
59
|
+
scroll: 'boolean'
|
|
60
|
+
};
|
|
646
61
|
/**
|
|
647
|
-
*
|
|
648
|
-
* Class Definition
|
|
649
|
-
* ------------------------------------------------------------------------
|
|
62
|
+
* Class definition
|
|
650
63
|
*/
|
|
651
64
|
|
|
652
65
|
class Offcanvas extends BaseComponent__default.default {
|
|
653
66
|
constructor(element, config) {
|
|
654
|
-
super(element);
|
|
655
|
-
this._config = this._getConfig(config);
|
|
67
|
+
super(element, config);
|
|
656
68
|
this._isShown = false;
|
|
657
69
|
this._backdrop = this._initializeBackDrop();
|
|
658
70
|
this._focustrap = this._initializeFocusTrap();
|
|
@@ -661,12 +73,16 @@
|
|
|
661
73
|
} // Getters
|
|
662
74
|
|
|
663
75
|
|
|
664
|
-
static get NAME() {
|
|
665
|
-
return NAME;
|
|
666
|
-
}
|
|
667
|
-
|
|
668
76
|
static get Default() {
|
|
669
77
|
return Default;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static get DefaultType() {
|
|
81
|
+
return DefaultType;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static get NAME() {
|
|
85
|
+
return NAME;
|
|
670
86
|
} // Public
|
|
671
87
|
|
|
672
88
|
|
|
@@ -688,27 +104,28 @@
|
|
|
688
104
|
}
|
|
689
105
|
|
|
690
106
|
this._isShown = true;
|
|
691
|
-
this._element.style.visibility = 'visible';
|
|
692
107
|
|
|
693
108
|
this._backdrop.show();
|
|
694
109
|
|
|
695
110
|
if (!this._config.scroll) {
|
|
696
|
-
new
|
|
111
|
+
new ScrollBarHelper__default.default().hide();
|
|
697
112
|
}
|
|
698
113
|
|
|
699
|
-
this._element.removeAttribute('aria-hidden');
|
|
700
|
-
|
|
701
114
|
this._element.setAttribute('aria-modal', true);
|
|
702
115
|
|
|
703
116
|
this._element.setAttribute('role', 'dialog');
|
|
704
117
|
|
|
705
|
-
this._element.classList.add(
|
|
118
|
+
this._element.classList.add(CLASS_NAME_SHOWING);
|
|
706
119
|
|
|
707
120
|
const completeCallBack = () => {
|
|
708
|
-
if (!this._config.scroll) {
|
|
121
|
+
if (!this._config.scroll || this._config.backdrop) {
|
|
709
122
|
this._focustrap.activate();
|
|
710
123
|
}
|
|
711
124
|
|
|
125
|
+
this._element.classList.add(CLASS_NAME_SHOW);
|
|
126
|
+
|
|
127
|
+
this._element.classList.remove(CLASS_NAME_SHOWING);
|
|
128
|
+
|
|
712
129
|
EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
|
|
713
130
|
relatedTarget
|
|
714
131
|
});
|
|
@@ -734,21 +151,19 @@
|
|
|
734
151
|
|
|
735
152
|
this._isShown = false;
|
|
736
153
|
|
|
737
|
-
this._element.classList.
|
|
154
|
+
this._element.classList.add(CLASS_NAME_HIDING);
|
|
738
155
|
|
|
739
156
|
this._backdrop.hide();
|
|
740
157
|
|
|
741
158
|
const completeCallback = () => {
|
|
742
|
-
this._element.
|
|
159
|
+
this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING);
|
|
743
160
|
|
|
744
161
|
this._element.removeAttribute('aria-modal');
|
|
745
162
|
|
|
746
163
|
this._element.removeAttribute('role');
|
|
747
164
|
|
|
748
|
-
this._element.style.visibility = 'hidden';
|
|
749
|
-
|
|
750
165
|
if (!this._config.scroll) {
|
|
751
|
-
new
|
|
166
|
+
new ScrollBarHelper__default.default().reset();
|
|
752
167
|
}
|
|
753
168
|
|
|
754
169
|
EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
|
|
@@ -766,36 +181,45 @@
|
|
|
766
181
|
} // Private
|
|
767
182
|
|
|
768
183
|
|
|
769
|
-
_getConfig(config) {
|
|
770
|
-
config = { ...Default,
|
|
771
|
-
...Manipulator__default.default.getDataAttributes(this._element),
|
|
772
|
-
...(typeof config === 'object' ? config : {})
|
|
773
|
-
};
|
|
774
|
-
typeCheckConfig(NAME, config, DefaultType);
|
|
775
|
-
return config;
|
|
776
|
-
}
|
|
777
|
-
|
|
778
184
|
_initializeBackDrop() {
|
|
779
|
-
|
|
185
|
+
const clickCallback = () => {
|
|
186
|
+
if (this._config.backdrop === 'static') {
|
|
187
|
+
EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
this.hide();
|
|
192
|
+
}; // 'static' option will be translated to true, and booleans will keep their value
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
const isVisible = Boolean(this._config.backdrop);
|
|
196
|
+
return new Backdrop__default.default({
|
|
780
197
|
className: CLASS_NAME_BACKDROP,
|
|
781
|
-
isVisible
|
|
198
|
+
isVisible,
|
|
782
199
|
isAnimated: true,
|
|
783
200
|
rootElement: this._element.parentNode,
|
|
784
|
-
clickCallback:
|
|
201
|
+
clickCallback: isVisible ? clickCallback : null
|
|
785
202
|
});
|
|
786
203
|
}
|
|
787
204
|
|
|
788
205
|
_initializeFocusTrap() {
|
|
789
|
-
return new
|
|
206
|
+
return new FocusTrap__default.default({
|
|
790
207
|
trapElement: this._element
|
|
791
208
|
});
|
|
792
209
|
}
|
|
793
210
|
|
|
794
211
|
_addEventListeners() {
|
|
795
212
|
EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
|
796
|
-
if (
|
|
797
|
-
|
|
213
|
+
if (event.key !== ESCAPE_KEY) {
|
|
214
|
+
return;
|
|
798
215
|
}
|
|
216
|
+
|
|
217
|
+
if (!this._config.keyboard) {
|
|
218
|
+
EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
this.hide();
|
|
799
223
|
});
|
|
800
224
|
} // Static
|
|
801
225
|
|
|
@@ -818,48 +242,55 @@
|
|
|
818
242
|
|
|
819
243
|
}
|
|
820
244
|
/**
|
|
821
|
-
*
|
|
822
|
-
* Data Api implementation
|
|
823
|
-
* ------------------------------------------------------------------------
|
|
245
|
+
* Data API implementation
|
|
824
246
|
*/
|
|
825
247
|
|
|
826
248
|
|
|
827
249
|
EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
828
|
-
const target = getElementFromSelector(this);
|
|
250
|
+
const target = index.getElementFromSelector(this);
|
|
829
251
|
|
|
830
252
|
if (['A', 'AREA'].includes(this.tagName)) {
|
|
831
253
|
event.preventDefault();
|
|
832
254
|
}
|
|
833
255
|
|
|
834
|
-
if (isDisabled(this)) {
|
|
256
|
+
if (index.isDisabled(this)) {
|
|
835
257
|
return;
|
|
836
258
|
}
|
|
837
259
|
|
|
838
260
|
EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
|
|
839
261
|
// focus on trigger when it is closed
|
|
840
|
-
if (isVisible(this)) {
|
|
262
|
+
if (index.isVisible(this)) {
|
|
841
263
|
this.focus();
|
|
842
264
|
}
|
|
843
265
|
}); // avoid conflict when clicking a toggler of an offcanvas, while another is open
|
|
844
266
|
|
|
845
|
-
const
|
|
267
|
+
const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
|
|
846
268
|
|
|
847
|
-
if (
|
|
848
|
-
Offcanvas.getInstance(
|
|
269
|
+
if (alreadyOpen && alreadyOpen !== target) {
|
|
270
|
+
Offcanvas.getInstance(alreadyOpen).hide();
|
|
849
271
|
}
|
|
850
272
|
|
|
851
273
|
const data = Offcanvas.getOrCreateInstance(target);
|
|
852
274
|
data.toggle(this);
|
|
853
275
|
});
|
|
854
|
-
EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () =>
|
|
855
|
-
|
|
276
|
+
EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => {
|
|
277
|
+
for (const selector of SelectorEngine__default.default.find(OPEN_SELECTOR)) {
|
|
278
|
+
Offcanvas.getOrCreateInstance(selector).show();
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
EventHandler__default.default.on(window, EVENT_RESIZE, () => {
|
|
282
|
+
for (const element of SelectorEngine__default.default.find('[aria-modal][class*=show][class*=offcanvas-]')) {
|
|
283
|
+
if (getComputedStyle(element).position !== 'fixed') {
|
|
284
|
+
Offcanvas.getOrCreateInstance(element).hide();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
componentFunctions.enableDismissTrigger(Offcanvas);
|
|
856
289
|
/**
|
|
857
|
-
* ------------------------------------------------------------------------
|
|
858
290
|
* jQuery
|
|
859
|
-
* ------------------------------------------------------------------------
|
|
860
291
|
*/
|
|
861
292
|
|
|
862
|
-
defineJQueryPlugin(Offcanvas);
|
|
293
|
+
index.defineJQueryPlugin(Offcanvas);
|
|
863
294
|
|
|
864
295
|
return Offcanvas;
|
|
865
296
|
|