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