@coreui/coreui 4.0.5 → 4.1.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.
Files changed (143) hide show
  1. package/README.md +4 -7
  2. package/dist/css/coreui-grid.css +254 -205
  3. package/dist/css/coreui-grid.css.map +1 -1
  4. package/dist/css/coreui-grid.min.css +2 -2
  5. package/dist/css/coreui-grid.min.css.map +1 -1
  6. package/dist/css/coreui-grid.rtl.css +255 -206
  7. package/dist/css/coreui-grid.rtl.css.map +1 -1
  8. package/dist/css/coreui-grid.rtl.min.css +3 -3
  9. package/dist/css/coreui-grid.rtl.min.css.map +1 -1
  10. package/dist/css/coreui-reboot.css +63 -8
  11. package/dist/css/coreui-reboot.css.map +1 -1
  12. package/dist/css/coreui-reboot.min.css +2 -2
  13. package/dist/css/coreui-reboot.min.css.map +1 -1
  14. package/dist/css/coreui-reboot.rtl.css +64 -9
  15. package/dist/css/coreui-reboot.rtl.css.map +1 -1
  16. package/dist/css/coreui-reboot.rtl.min.css +3 -3
  17. package/dist/css/coreui-reboot.rtl.min.css.map +1 -1
  18. package/dist/css/coreui-utilities.css +181 -81
  19. package/dist/css/coreui-utilities.css.map +1 -1
  20. package/dist/css/coreui-utilities.min.css +2 -2
  21. package/dist/css/coreui-utilities.min.css.map +1 -1
  22. package/dist/css/coreui-utilities.rtl.css +182 -82
  23. package/dist/css/coreui-utilities.rtl.css.map +1 -1
  24. package/dist/css/coreui-utilities.rtl.min.css +3 -3
  25. package/dist/css/coreui-utilities.rtl.min.css.map +1 -1
  26. package/dist/css/coreui.css +713 -346
  27. package/dist/css/coreui.css.map +1 -1
  28. package/dist/css/coreui.min.css +2 -2
  29. package/dist/css/coreui.min.css.map +1 -1
  30. package/dist/css/coreui.rtl.css +699 -347
  31. package/dist/css/coreui.rtl.css.map +1 -1
  32. package/dist/css/coreui.rtl.min.css +3 -3
  33. package/dist/css/coreui.rtl.min.css.map +1 -1
  34. package/dist/js/coreui.bundle.js +851 -746
  35. package/dist/js/coreui.bundle.js.map +1 -1
  36. package/dist/js/coreui.bundle.min.js +3 -3
  37. package/dist/js/coreui.bundle.min.js.map +1 -1
  38. package/dist/js/coreui.esm.js +704 -644
  39. package/dist/js/coreui.esm.js.map +1 -1
  40. package/dist/js/coreui.esm.min.js +3 -3
  41. package/dist/js/coreui.esm.min.js.map +1 -1
  42. package/dist/js/coreui.js +714 -656
  43. package/dist/js/coreui.js.map +1 -1
  44. package/dist/js/coreui.min.js +3 -3
  45. package/dist/js/coreui.min.js.map +1 -1
  46. package/js/dist/alert.js +82 -49
  47. package/js/dist/alert.js.map +1 -1
  48. package/js/dist/base-component.js +26 -18
  49. package/js/dist/base-component.js.map +1 -1
  50. package/js/dist/button.js +23 -13
  51. package/js/dist/button.js.map +1 -1
  52. package/js/dist/carousel.js +95 -50
  53. package/js/dist/carousel.js.map +1 -1
  54. package/js/dist/collapse.js +125 -139
  55. package/js/dist/collapse.js.map +1 -1
  56. package/js/dist/dom/data.js +6 -6
  57. package/js/dist/dom/data.js.map +1 -1
  58. package/js/dist/dom/event-handler.js +15 -6
  59. package/js/dist/dom/event-handler.js.map +1 -1
  60. package/js/dist/dom/manipulator.js +7 -7
  61. package/js/dist/dom/manipulator.js.map +1 -1
  62. package/js/dist/dom/selector-engine.js +74 -9
  63. package/js/dist/dom/selector-engine.js.map +1 -1
  64. package/js/dist/dropdown.js +125 -112
  65. package/js/dist/dropdown.js.map +1 -1
  66. package/js/dist/modal.js +270 -93
  67. package/js/dist/modal.js.map +1 -1
  68. package/js/dist/offcanvas.js +231 -62
  69. package/js/dist/offcanvas.js.map +1 -1
  70. package/js/dist/popover.js +29 -59
  71. package/js/dist/popover.js.map +1 -1
  72. package/js/dist/scrollspy.js +45 -35
  73. package/js/dist/scrollspy.js.map +1 -1
  74. package/js/dist/tab.js +45 -23
  75. package/js/dist/tab.js.map +1 -1
  76. package/js/dist/toast.js +132 -34
  77. package/js/dist/toast.js.map +1 -1
  78. package/js/dist/tooltip.js +127 -109
  79. package/js/dist/tooltip.js.map +1 -1
  80. package/js/src/alert.js +21 -47
  81. package/js/src/base-component.js +3 -3
  82. package/js/src/button.js +1 -1
  83. package/js/src/carousel.js +10 -4
  84. package/js/src/collapse.js +66 -119
  85. package/js/src/dom/data.js +1 -1
  86. package/js/src/dom/event-handler.js +1 -2
  87. package/js/src/dom/manipulator.js +3 -3
  88. package/js/src/dom/selector-engine.js +18 -1
  89. package/js/src/dropdown.js +53 -68
  90. package/js/src/modal.js +24 -35
  91. package/js/src/navigation.js +1 -1
  92. package/js/src/offcanvas.js +16 -18
  93. package/js/src/popover.js +7 -49
  94. package/js/src/scrollspy.js +1 -1
  95. package/js/src/sidebar.js +21 -27
  96. package/js/src/tab.js +1 -1
  97. package/js/src/toast.js +11 -11
  98. package/js/src/tooltip.js +66 -50
  99. package/js/src/util/backdrop.js +6 -5
  100. package/js/src/util/component-functions.js +34 -0
  101. package/js/src/util/focustrap.js +105 -0
  102. package/js/src/util/index.js +39 -11
  103. package/js/src/util/sanitizer.js +21 -22
  104. package/js/src/util/scrollbar.js +1 -1
  105. package/package.json +54 -55
  106. package/scss/_buttons.scss +1 -2
  107. package/scss/_card.scss +2 -1
  108. package/scss/_dropdown.scss +1 -1
  109. package/scss/_functions.scss +51 -12
  110. package/scss/_grid.scss +0 -23
  111. package/scss/_helpers.scss +2 -0
  112. package/scss/_mixins.scss +1 -0
  113. package/scss/_modal.scss +2 -12
  114. package/scss/_nav.scss +1 -2
  115. package/scss/_navbar.scss +30 -1
  116. package/scss/_offcanvas.scss +6 -2
  117. package/scss/_placeholders.scss +51 -0
  118. package/scss/_reboot.scss +12 -8
  119. package/scss/_root.scss +36 -7
  120. package/scss/_tables.scss +9 -5
  121. package/scss/_toasts.scss +2 -2
  122. package/scss/_transitions.scss +6 -0
  123. package/scss/_utilities.scss +31 -8
  124. package/scss/_variables.scss +188 -13
  125. package/scss/coreui-grid.rtl.scss +1 -1
  126. package/scss/coreui-grid.scss +3 -1
  127. package/scss/coreui-reboot.rtl.scss +1 -1
  128. package/scss/coreui-reboot.scss +2 -4
  129. package/scss/coreui-utilities.rtl.scss +1 -1
  130. package/scss/coreui-utilities.scss +1 -1
  131. package/scss/coreui.rtl.scss +1 -1
  132. package/scss/coreui.scss +2 -1
  133. package/scss/forms/_form-control.scss +1 -1
  134. package/scss/forms/_form-select.scss +2 -0
  135. package/scss/helpers/_stacks.scss +15 -0
  136. package/scss/helpers/_vr.scss +8 -0
  137. package/scss/mixins/_backdrop.scss +14 -0
  138. package/scss/mixins/_grid.scss +26 -7
  139. package/scss/mixins/_ltr-rtl.scss +21 -0
  140. package/scss/mixins/_reset-text.scss +1 -1
  141. package/scss/mixins/_utilities.scss +28 -33
  142. package/scss/mixins/_visually-hidden.scss +1 -1
  143. package/scss/sidebar/_sidebar-nav.scss +1 -0
@@ -1,30 +1,39 @@
1
1
  /*!
2
- * CoreUI offcanvas.js v4.0.5 (https://coreui.io)
3
- * Copyright 2021 The CoreUI Team (https://github.com/orgs/coreui/people)
2
+ * CoreUI offcanvas.js v4.1.2 (https://coreui.io)
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
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
8
  typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/manipulator', './dom/event-handler', './base-component'], factory) :
9
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';
10
+ })(this, (function (SelectorEngine, Manipulator, EventHandler, BaseComponent) { 'use strict';
11
11
 
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
12
+ const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e };
13
13
 
14
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
- var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
- var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
17
- var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
14
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
15
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
17
+ const BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
18
18
 
19
+ /**
20
+ * --------------------------------------------------------------------------
21
+ * CoreUI (v4.1.2): 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
+ */
19
28
  const MILLISECONDS_MULTIPLIER = 1000;
20
29
  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
21
30
 
22
- const toType = obj => {
23
- if (obj === null || obj === undefined) {
24
- return `${obj}`;
31
+ const toType = object => {
32
+ if (object === null || object === undefined) {
33
+ return `${object}`;
25
34
  }
26
35
 
27
- return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
36
+ return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
28
37
  };
29
38
 
30
39
  const getSelector = element => {
@@ -102,7 +111,7 @@
102
111
  }
103
112
 
104
113
  if (typeof obj === 'string' && obj.length > 0) {
105
- return SelectorEngine__default['default'].findOne(obj);
114
+ return document.querySelector(obj);
106
115
  }
107
116
 
108
117
  return null;
@@ -125,7 +134,27 @@
125
134
  return false;
126
135
  }
127
136
 
128
- return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
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;
129
158
  };
130
159
 
131
160
  const isDisabled = element => {
@@ -143,8 +172,20 @@
143
172
 
144
173
  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
145
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
+
146
184
 
147
- const reflow = element => element.offsetHeight;
185
+ const reflow = element => {
186
+ // eslint-disable-next-line no-unused-expressions
187
+ element.offsetHeight;
188
+ };
148
189
 
149
190
  const getjQuery = () => {
150
191
  const {
@@ -232,7 +273,7 @@
232
273
 
233
274
  /**
234
275
  * --------------------------------------------------------------------------
235
- * Bootstrap (v5.0.2): util/scrollBar.js
276
+ * Bootstrap (v5.1.3): util/scrollBar.js
236
277
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
237
278
  * --------------------------------------------------------------------------
238
279
  */
@@ -301,18 +342,18 @@
301
342
  const actualValue = element.style[styleProp];
302
343
 
303
344
  if (actualValue) {
304
- Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
345
+ Manipulator__default.default.setDataAttribute(element, styleProp, actualValue);
305
346
  }
306
347
  }
307
348
 
308
349
  _resetElementAttributes(selector, styleProp) {
309
350
  const manipulationCallBack = element => {
310
- const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
351
+ const value = Manipulator__default.default.getDataAttribute(element, styleProp);
311
352
 
312
353
  if (typeof value === 'undefined') {
313
354
  element.style.removeProperty(styleProp);
314
355
  } else {
315
- Manipulator__default['default'].removeDataAttribute(element, styleProp);
356
+ Manipulator__default.default.removeDataAttribute(element, styleProp);
316
357
  element.style[styleProp] = value;
317
358
  }
318
359
  };
@@ -324,7 +365,7 @@
324
365
  if (isElement(selector)) {
325
366
  callBack(selector);
326
367
  } else {
327
- SelectorEngine__default['default'].find(selector, this._element).forEach(callBack);
368
+ SelectorEngine__default.default.find(selector, this._element).forEach(callBack);
328
369
  }
329
370
  }
330
371
 
@@ -336,11 +377,12 @@
336
377
 
337
378
  /**
338
379
  * --------------------------------------------------------------------------
339
- * Bootstrap (v5.0.2): util/backdrop.js
340
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
380
+ * Bootstrap (v5.1.3): util/backdrop.js
381
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
341
382
  * --------------------------------------------------------------------------
342
383
  */
343
- const Default$1 = {
384
+ const Default$2 = {
385
+ className: 'modal-backdrop',
344
386
  isVisible: true,
345
387
  // if false, we use the backdrop helper without adding any element to the dom
346
388
  isAnimated: false,
@@ -348,17 +390,17 @@
348
390
  // give the choice to place backdrop under different elements
349
391
  clickCallback: null
350
392
  };
351
- const DefaultType$1 = {
393
+ const DefaultType$2 = {
394
+ className: 'string',
352
395
  isVisible: 'boolean',
353
396
  isAnimated: 'boolean',
354
397
  rootElement: '(element|string)',
355
398
  clickCallback: '(function|null)'
356
399
  };
357
- const NAME$1 = 'backdrop';
358
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
400
+ const NAME$2 = 'backdrop';
359
401
  const CLASS_NAME_FADE = 'fade';
360
402
  const CLASS_NAME_SHOW$1 = 'show';
361
- const EVENT_MOUSEDOWN = `mousedown.coreui.${NAME$1}`;
403
+ const EVENT_MOUSEDOWN = `mousedown.coreui.${NAME$2}`;
362
404
 
363
405
  class Backdrop {
364
406
  constructor(config) {
@@ -404,7 +446,7 @@
404
446
  _getElement() {
405
447
  if (!this._element) {
406
448
  const backdrop = document.createElement('div');
407
- backdrop.className = CLASS_NAME_BACKDROP;
449
+ backdrop.className = this._config.className;
408
450
 
409
451
  if (this._config.isAnimated) {
410
452
  backdrop.classList.add(CLASS_NAME_FADE);
@@ -417,12 +459,12 @@
417
459
  }
418
460
 
419
461
  _getConfig(config) {
420
- config = { ...Default$1,
462
+ config = { ...Default$2,
421
463
  ...(typeof config === 'object' ? config : {})
422
464
  }; // use getElement() with the default "body" to get a fresh Element on each instantiation
423
465
 
424
466
  config.rootElement = getElement(config.rootElement);
425
- typeCheckConfig(NAME$1, config, DefaultType$1);
467
+ typeCheckConfig(NAME$2, config, DefaultType$2);
426
468
  return config;
427
469
  }
428
470
 
@@ -431,9 +473,9 @@
431
473
  return;
432
474
  }
433
475
 
434
- this._config.rootElement.appendChild(this._getElement());
476
+ this._config.rootElement.append(this._getElement());
435
477
 
436
- EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
478
+ EventHandler__default.default.on(this._getElement(), EVENT_MOUSEDOWN, () => {
437
479
  execute(this._config.clickCallback);
438
480
  });
439
481
  this._isAppended = true;
@@ -444,7 +486,7 @@
444
486
  return;
445
487
  }
446
488
 
447
- EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
489
+ EventHandler__default.default.off(this._element, EVENT_MOUSEDOWN);
448
490
 
449
491
  this._element.remove();
450
492
 
@@ -459,7 +501,136 @@
459
501
 
460
502
  /**
461
503
  * --------------------------------------------------------------------------
462
- * CoreUI (v4.0.5): dropdown.js
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.2): dropdown.js
463
634
  * Licensed under MIT (https://coreui.io/license)
464
635
  *
465
636
  * This component is a modified version of the Bootstrap's offcanvas.js
@@ -489,16 +660,14 @@
489
660
  scroll: 'boolean'
490
661
  };
491
662
  const CLASS_NAME_SHOW = 'show';
663
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
492
664
  const OPEN_SELECTOR = '.offcanvas.show';
493
665
  const EVENT_SHOW = `show${EVENT_KEY}`;
494
666
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
495
667
  const EVENT_HIDE = `hide${EVENT_KEY}`;
496
668
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
497
- const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
498
669
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
499
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
500
670
  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
501
- const SELECTOR_DATA_DISMISS = '[data-coreui-dismiss="offcanvas"]';
502
671
  const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="offcanvas"]';
503
672
  /**
504
673
  * ------------------------------------------------------------------------
@@ -506,12 +675,13 @@
506
675
  * ------------------------------------------------------------------------
507
676
  */
508
677
 
509
- class Offcanvas extends BaseComponent__default['default'] {
678
+ class Offcanvas extends BaseComponent__default.default {
510
679
  constructor(element, config) {
511
680
  super(element);
512
681
  this._config = this._getConfig(config);
513
682
  this._isShown = false;
514
683
  this._backdrop = this._initializeBackDrop();
684
+ this._focustrap = this._initializeFocusTrap();
515
685
 
516
686
  this._addEventListeners();
517
687
  } // Getters
@@ -535,7 +705,7 @@
535
705
  return;
536
706
  }
537
707
 
538
- const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
708
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
539
709
  relatedTarget
540
710
  });
541
711
 
@@ -550,8 +720,6 @@
550
720
 
551
721
  if (!this._config.scroll) {
552
722
  new ScrollBarHelper().hide();
553
-
554
- this._enforceFocusOnElement(this._element);
555
723
  }
556
724
 
557
725
  this._element.removeAttribute('aria-hidden');
@@ -563,7 +731,11 @@
563
731
  this._element.classList.add(CLASS_NAME_SHOW);
564
732
 
565
733
  const completeCallBack = () => {
566
- EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
734
+ if (!this._config.scroll) {
735
+ this._focustrap.activate();
736
+ }
737
+
738
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
567
739
  relatedTarget
568
740
  });
569
741
  };
@@ -576,13 +748,13 @@
576
748
  return;
577
749
  }
578
750
 
579
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
751
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
580
752
 
581
753
  if (hideEvent.defaultPrevented) {
582
754
  return;
583
755
  }
584
756
 
585
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
757
+ this._focustrap.deactivate();
586
758
 
587
759
  this._element.blur();
588
760
 
@@ -605,7 +777,7 @@
605
777
  new ScrollBarHelper().reset();
606
778
  }
607
779
 
608
- EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
780
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
609
781
  };
610
782
 
611
783
  this._queueCallback(completeCallback, this._element, true);
@@ -614,14 +786,15 @@
614
786
  dispose() {
615
787
  this._backdrop.dispose();
616
788
 
789
+ this._focustrap.deactivate();
790
+
617
791
  super.dispose();
618
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
619
792
  } // Private
620
793
 
621
794
 
622
795
  _getConfig(config) {
623
796
  config = { ...Default,
624
- ...Manipulator__default['default'].getDataAttributes(this._element),
797
+ ...Manipulator__default.default.getDataAttributes(this._element),
625
798
  ...(typeof config === 'object' ? config : {})
626
799
  };
627
800
  typeCheckConfig(NAME, config, DefaultType);
@@ -630,6 +803,7 @@
630
803
 
631
804
  _initializeBackDrop() {
632
805
  return new Backdrop({
806
+ className: CLASS_NAME_BACKDROP,
633
807
  isVisible: this._config.backdrop,
634
808
  isAnimated: true,
635
809
  rootElement: this._element.parentNode,
@@ -637,20 +811,14 @@
637
811
  });
638
812
  }
639
813
 
640
- _enforceFocusOnElement(element) {
641
- EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
642
-
643
- EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => {
644
- if (document !== event.target && element !== event.target && !element.contains(event.target)) {
645
- element.focus();
646
- }
814
+ _initializeFocusTrap() {
815
+ return new FocusTrap({
816
+ trapElement: this._element
647
817
  });
648
- element.focus();
649
818
  }
650
819
 
651
820
  _addEventListeners() {
652
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
653
- EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
821
+ EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
654
822
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
655
823
  this.hide();
656
824
  }
@@ -682,7 +850,7 @@
682
850
  */
683
851
 
684
852
 
685
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
853
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
686
854
  const target = getElementFromSelector(this);
687
855
 
688
856
  if (['A', 'AREA'].includes(this.tagName)) {
@@ -693,14 +861,14 @@
693
861
  return;
694
862
  }
695
863
 
696
- EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
864
+ EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
697
865
  // focus on trigger when it is closed
698
866
  if (isVisible(this)) {
699
867
  this.focus();
700
868
  }
701
869
  }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
702
870
 
703
- const allReadyOpen = SelectorEngine__default['default'].findOne(OPEN_SELECTOR);
871
+ const allReadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
704
872
 
705
873
  if (allReadyOpen && allReadyOpen !== target) {
706
874
  Offcanvas.getInstance(allReadyOpen).hide();
@@ -709,7 +877,8 @@
709
877
  const data = Offcanvas.getOrCreateInstance(target);
710
878
  data.toggle(this);
711
879
  });
712
- EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => SelectorEngine__default['default'].find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
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);
713
882
  /**
714
883
  * ------------------------------------------------------------------------
715
884
  * jQuery
@@ -720,5 +889,5 @@
720
889
 
721
890
  return Offcanvas;
722
891
 
723
- })));
892
+ }));
724
893
  //# sourceMappingURL=offcanvas.js.map