@coreui/coreui 4.1.6 → 4.2.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.
Files changed (208) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +62 -10
  3. package/dist/css/bootstrap-reboot.css +488 -0
  4. package/dist/css/bootstrap-reboot.css.map +1 -0
  5. package/dist/css/bootstrap-reboot.min.css +8 -0
  6. package/dist/css/bootstrap-reboot.min.css.map +1 -0
  7. package/dist/css/coreui-grid.css +22 -4
  8. package/dist/css/coreui-grid.css.map +1 -1
  9. package/dist/css/coreui-grid.min.css +2 -2
  10. package/dist/css/coreui-grid.min.css.map +1 -1
  11. package/dist/css/coreui-grid.rtl.css +23 -5
  12. package/dist/css/coreui-grid.rtl.css.map +1 -1
  13. package/dist/css/coreui-grid.rtl.min.css +3 -3
  14. package/dist/css/coreui-grid.rtl.min.css.map +1 -1
  15. package/dist/css/coreui-reboot.css +34 -41
  16. package/dist/css/coreui-reboot.css.map +1 -1
  17. package/dist/css/coreui-reboot.min.css +2 -2
  18. package/dist/css/coreui-reboot.min.css.map +1 -1
  19. package/dist/css/coreui-reboot.rtl.css +34 -42
  20. package/dist/css/coreui-reboot.rtl.css.map +1 -1
  21. package/dist/css/coreui-reboot.rtl.min.css +3 -3
  22. package/dist/css/coreui-reboot.rtl.min.css.map +1 -1
  23. package/dist/css/coreui-utilities.css +278 -163
  24. package/dist/css/coreui-utilities.css.map +1 -1
  25. package/dist/css/coreui-utilities.min.css +2 -2
  26. package/dist/css/coreui-utilities.min.css.map +1 -1
  27. package/dist/css/coreui-utilities.rtl.css +273 -164
  28. package/dist/css/coreui-utilities.rtl.css.map +1 -1
  29. package/dist/css/coreui-utilities.rtl.min.css +3 -3
  30. package/dist/css/coreui-utilities.rtl.min.css.map +1 -1
  31. package/dist/css/coreui.css +2168 -1240
  32. package/dist/css/coreui.css.map +1 -1
  33. package/dist/css/coreui.min.css +2 -2
  34. package/dist/css/coreui.min.css.map +1 -1
  35. package/dist/css/coreui.rtl.css +2150 -1228
  36. package/dist/css/coreui.rtl.css.map +1 -1
  37. package/dist/css/coreui.rtl.min.css +3 -3
  38. package/dist/css/coreui.rtl.min.css.map +1 -1
  39. package/dist/js/coreui.bundle.js +2095 -1906
  40. package/dist/js/coreui.bundle.js.map +1 -1
  41. package/dist/js/coreui.bundle.min.js +2 -2
  42. package/dist/js/coreui.bundle.min.js.map +1 -1
  43. package/dist/js/coreui.esm.js +2098 -1909
  44. package/dist/js/coreui.esm.js.map +1 -1
  45. package/dist/js/coreui.esm.min.js +2 -2
  46. package/dist/js/coreui.esm.min.js.map +1 -1
  47. package/dist/js/coreui.js +2099 -1910
  48. package/dist/js/coreui.js.map +1 -1
  49. package/dist/js/coreui.min.js +2 -2
  50. package/dist/js/coreui.min.js.map +1 -1
  51. package/js/dist/alert.js +10 -148
  52. package/js/dist/alert.js.map +1 -1
  53. package/js/dist/base-component.js +36 -122
  54. package/js/dist/base-component.js.map +1 -1
  55. package/js/dist/button.js +9 -76
  56. package/js/dist/button.js.map +1 -1
  57. package/js/dist/carousel.js +212 -507
  58. package/js/dist/carousel.js.map +1 -1
  59. package/js/dist/collapse.js +64 -251
  60. package/js/dist/collapse.js.map +1 -1
  61. package/js/dist/dom/data.js +2 -4
  62. package/js/dist/dom/data.js.map +1 -1
  63. package/js/dist/dom/event-handler.js +82 -133
  64. package/js/dist/dom/event-handler.js.map +1 -1
  65. package/js/dist/dom/manipulator.js +22 -26
  66. package/js/dist/dom/manipulator.js.map +1 -1
  67. package/js/dist/dom/selector-engine.js +16 -81
  68. package/js/dist/dom/selector-engine.js.map +1 -1
  69. package/js/dist/dropdown.js +99 -338
  70. package/js/dist/dropdown.js.map +1 -1
  71. package/js/dist/modal.js +106 -774
  72. package/js/dist/modal.js.map +1 -1
  73. package/js/dist/navigation.js +309 -0
  74. package/js/dist/navigation.js.map +1 -0
  75. package/js/dist/offcanvas.js +88 -680
  76. package/js/dist/offcanvas.js.map +1 -1
  77. package/js/dist/popover.js +35 -120
  78. package/js/dist/popover.js.map +1 -1
  79. package/js/dist/scrollspy.js +178 -264
  80. package/js/dist/scrollspy.js.map +1 -1
  81. package/js/dist/sidebar.js +347 -0
  82. package/js/dist/sidebar.js.map +1 -0
  83. package/js/dist/tab.js +226 -216
  84. package/js/dist/tab.js.map +1 -1
  85. package/js/dist/toast.js +27 -216
  86. package/js/dist/toast.js.map +1 -1
  87. package/js/dist/tooltip.js +271 -618
  88. package/js/dist/tooltip.js.map +1 -1
  89. package/js/dist/util/backdrop.js +166 -0
  90. package/js/dist/util/backdrop.js.map +1 -0
  91. package/js/dist/util/component-functions.js +47 -0
  92. package/js/dist/util/component-functions.js.map +1 -0
  93. package/js/dist/util/config.js +80 -0
  94. package/js/dist/util/config.js.map +1 -0
  95. package/js/dist/util/focustrap.js +130 -0
  96. package/js/dist/util/focustrap.js.map +1 -0
  97. package/js/dist/util/index.js +354 -0
  98. package/js/dist/util/index.js.map +1 -0
  99. package/js/dist/util/sanitizer.js +126 -0
  100. package/js/dist/util/sanitizer.js.map +1 -0
  101. package/js/dist/util/scrollbar.js +139 -0
  102. package/js/dist/util/scrollbar.js.map +1 -0
  103. package/js/dist/util/swipe.js +156 -0
  104. package/js/dist/util/swipe.js.map +1 -0
  105. package/js/dist/util/template-factory.js +178 -0
  106. package/js/dist/util/template-factory.js.map +1 -0
  107. package/js/src/alert.js +3 -15
  108. package/js/src/base-component.js +28 -18
  109. package/js/src/button.js +3 -15
  110. package/js/src/carousel.js +203 -320
  111. package/js/src/collapse.js +61 -94
  112. package/js/src/dom/data.js +1 -3
  113. package/js/src/dom/event-handler.js +74 -107
  114. package/js/src/dom/manipulator.js +22 -31
  115. package/js/src/dom/selector-engine.js +10 -19
  116. package/js/src/dropdown.js +84 -138
  117. package/js/src/modal.js +94 -158
  118. package/js/src/navigation.js +12 -13
  119. package/js/src/offcanvas.js +71 -60
  120. package/js/src/popover.js +31 -62
  121. package/js/src/scrollspy.js +166 -171
  122. package/js/src/sidebar.js +5 -8
  123. package/js/src/tab.js +201 -110
  124. package/js/src/toast.js +19 -41
  125. package/js/src/tooltip.js +264 -374
  126. package/js/src/util/backdrop.js +55 -36
  127. package/js/src/util/component-functions.js +1 -1
  128. package/js/src/util/config.js +66 -0
  129. package/js/src/util/focustrap.js +38 -28
  130. package/js/src/util/index.js +41 -57
  131. package/js/src/util/sanitizer.js +9 -17
  132. package/js/src/util/scrollbar.js +47 -30
  133. package/js/src/util/swipe.js +146 -0
  134. package/js/src/util/template-factory.js +160 -0
  135. package/package.json +36 -36
  136. package/scss/_accordion.scss +53 -25
  137. package/scss/_alert.scss +29 -9
  138. package/scss/_badge.scss +15 -6
  139. package/scss/_breadcrumb.scss +23 -11
  140. package/scss/_button-group.scss +3 -0
  141. package/scss/_buttons.scss +71 -50
  142. package/scss/_callout.scss +18 -6
  143. package/scss/_card.scss +55 -37
  144. package/scss/_carousel.scss +6 -6
  145. package/scss/_close.scss +4 -4
  146. package/scss/_containers.scss +1 -1
  147. package/scss/_dropdown.scss +86 -64
  148. package/scss/_footer.scss +15 -5
  149. package/scss/_functions.scss +11 -24
  150. package/scss/_grid.scss +3 -3
  151. package/scss/_header.scss +59 -34
  152. package/scss/_helpers.scss +1 -0
  153. package/scss/_images.scss +3 -3
  154. package/scss/_list-group.scss +47 -29
  155. package/scss/_maps.scss +54 -0
  156. package/scss/_modal.scss +70 -43
  157. package/scss/_nav.scss +53 -20
  158. package/scss/_navbar.scss +84 -94
  159. package/scss/_offcanvas.scss +120 -60
  160. package/scss/_pagination.scss +66 -21
  161. package/scss/_popover.scss +90 -52
  162. package/scss/_progress.scss +20 -9
  163. package/scss/_reboot.scss +31 -58
  164. package/scss/_root.scss +41 -19
  165. package/scss/_spinners.scss +37 -21
  166. package/scss/_subheader.scss +9 -9
  167. package/scss/_tables.scss +34 -36
  168. package/scss/_toasts.scss +35 -19
  169. package/scss/_tooltip.scss +61 -56
  170. package/scss/_utilities.scss +42 -25
  171. package/scss/_variables.scss +169 -148
  172. package/scss/bootstrap-reboot.scss +14 -0
  173. package/scss/coreui-grid.rtl.scss +1 -1
  174. package/scss/coreui-grid.scss +2 -1
  175. package/scss/coreui-reboot.rtl.scss +1 -1
  176. package/scss/coreui-reboot.scss +1 -1
  177. package/scss/coreui-utilities.rtl.scss +1 -1
  178. package/scss/coreui-utilities.scss +2 -1
  179. package/scss/coreui.rtl.scss +1 -1
  180. package/scss/coreui.scss +2 -1
  181. package/scss/forms/_floating-labels.scss +14 -3
  182. package/scss/forms/_form-check.scss +41 -18
  183. package/scss/forms/_form-control.scss +25 -50
  184. package/scss/forms/_form-range.scss +8 -8
  185. package/scss/forms/_form-select.scss +8 -8
  186. package/scss/forms/_form-text.scss +1 -1
  187. package/scss/forms/_input-group.scss +3 -3
  188. package/scss/forms/_labels.scss +2 -2
  189. package/scss/helpers/_color-bg.scss +10 -0
  190. package/scss/helpers/_colored-links.scss +2 -2
  191. package/scss/helpers/_position.scss +7 -1
  192. package/scss/helpers/_ratio.scss +2 -2
  193. package/scss/helpers/_vr.scss +1 -0
  194. package/scss/mixins/_alert.scss +10 -10
  195. package/scss/mixins/_breakpoints.scss +8 -8
  196. package/scss/mixins/_buttons.scss +45 -47
  197. package/scss/mixins/_container.scss +4 -2
  198. package/scss/mixins/_css-vars.scss +47 -47
  199. package/scss/mixins/_forms.scss +8 -0
  200. package/scss/mixins/_gradients.scss +1 -1
  201. package/scss/mixins/_grid.scss +11 -11
  202. package/scss/mixins/_list-group.scss +7 -9
  203. package/scss/mixins/_pagination.scss +4 -25
  204. package/scss/mixins/_table-variants.scss +20 -12
  205. package/scss/mixins/_utilities.scss +8 -3
  206. package/scss/sidebar/_sidebar-narrow.scss +10 -10
  207. package/scss/sidebar/_sidebar-nav.scss +33 -32
  208. package/scss/sidebar/_sidebar.scss +110 -56
@@ -1,636 +1,26 @@
1
1
  /*!
2
- * CoreUI offcanvas.js v4.1.6 (https://coreui.io)
2
+ * CoreUI offcanvas.js v4.2.0 (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('./dom/selector-engine.js'), require('./dom/manipulator.js'), require('./dom/event-handler.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/manipulator', './dom/event-handler', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Offcanvas = factory(global.SelectorEngine, global.Manipulator, global.EventHandler, global.Base));
10
- })(this, (function (SelectorEngine, Manipulator, EventHandler, BaseComponent) { 'use strict';
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 SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
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.6): alert.js
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.6): dropdown.js
23
+ * CoreUI (v4.2.0): 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 ScrollBarHelper().hide();
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(CLASS_NAME_SHOW);
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.remove(CLASS_NAME_SHOW);
157
+ this._element.classList.add(CLASS_NAME_HIDING);
764
158
 
765
159
  this._backdrop.hide();
766
160
 
767
161
  const completeCallback = () => {
768
- this._element.setAttribute('aria-hidden', true);
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 ScrollBarHelper().reset();
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
- return new Backdrop({
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: this._config.backdrop,
201
+ isVisible,
808
202
  isAnimated: true,
809
203
  rootElement: this._element.parentNode,
810
- clickCallback: () => this.hide()
204
+ clickCallback: isVisible ? clickCallback : null
811
205
  });
812
206
  }
813
207
 
814
208
  _initializeFocusTrap() {
815
- return new FocusTrap({
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 (this._config.keyboard && event.key === ESCAPE_KEY) {
823
- this.hide();
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 allReadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
270
+ const alreadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
872
271
 
873
- if (allReadyOpen && allReadyOpen !== target) {
874
- Offcanvas.getInstance(allReadyOpen).hide();
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, () => SelectorEngine__default.default.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
881
- enableDismissTrigger(Offcanvas);
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