@coreui/coreui 4.0.2 → 4.1.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 (141) hide show
  1. package/README.md +5 -8
  2. package/dist/css/coreui-grid.css +255 -206
  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 +256 -207
  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 +725 -350
  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 +733 -373
  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 +782 -704
  35. package/dist/js/coreui.bundle.js.map +1 -1
  36. package/dist/js/coreui.bundle.min.js +2 -2
  37. package/dist/js/coreui.bundle.min.js.map +1 -1
  38. package/dist/js/coreui.esm.js +663 -611
  39. package/dist/js/coreui.esm.js.map +1 -1
  40. package/dist/js/coreui.esm.min.js +2 -2
  41. package/dist/js/coreui.esm.min.js.map +1 -1
  42. package/dist/js/coreui.js +673 -623
  43. package/dist/js/coreui.js.map +1 -1
  44. package/dist/js/coreui.min.js +2 -2
  45. package/dist/js/coreui.min.js.map +1 -1
  46. package/js/dist/alert.js +81 -48
  47. package/js/dist/alert.js.map +1 -1
  48. package/js/dist/base-component.js +25 -17
  49. package/js/dist/base-component.js.map +1 -1
  50. package/js/dist/button.js +22 -12
  51. package/js/dist/button.js.map +1 -1
  52. package/js/dist/carousel.js +69 -44
  53. package/js/dist/carousel.js.map +1 -1
  54. package/js/dist/collapse.js +117 -131
  55. package/js/dist/collapse.js.map +1 -1
  56. package/js/dist/dom/data.js +5 -5
  57. package/js/dist/dom/data.js.map +1 -1
  58. package/js/dist/dom/event-handler.js +14 -5
  59. package/js/dist/dom/event-handler.js.map +1 -1
  60. package/js/dist/dom/manipulator.js +6 -6
  61. package/js/dist/dom/manipulator.js.map +1 -1
  62. package/js/dist/dom/selector-engine.js +53 -8
  63. package/js/dist/dom/selector-engine.js.map +1 -1
  64. package/js/dist/dropdown.js +99 -106
  65. package/js/dist/dropdown.js.map +1 -1
  66. package/js/dist/modal.js +244 -87
  67. package/js/dist/modal.js.map +1 -1
  68. package/js/dist/offcanvas.js +205 -56
  69. package/js/dist/offcanvas.js.map +1 -1
  70. package/js/dist/popover.js +28 -58
  71. package/js/dist/popover.js.map +1 -1
  72. package/js/dist/scrollspy.js +40 -30
  73. package/js/dist/scrollspy.js.map +1 -1
  74. package/js/dist/tab.js +44 -22
  75. package/js/dist/tab.js.map +1 -1
  76. package/js/dist/toast.js +127 -29
  77. package/js/dist/toast.js.map +1 -1
  78. package/js/dist/tooltip.js +122 -104
  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 +9 -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 +6 -4
  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 +6 -4
  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 +14 -5
  103. package/js/src/util/sanitizer.js +21 -22
  104. package/js/src/util/scrollbar.js +1 -1
  105. package/package.json +47 -44
  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 +1 -11
  114. package/scss/_navbar.scss +30 -1
  115. package/scss/_offcanvas.scss +6 -2
  116. package/scss/_placeholders.scss +51 -0
  117. package/scss/_reboot.scss +12 -8
  118. package/scss/_root.scss +36 -7
  119. package/scss/_tables.scss +9 -5
  120. package/scss/_toasts.scss +2 -2
  121. package/scss/_transitions.scss +6 -0
  122. package/scss/_utilities.scss +31 -8
  123. package/scss/_variables.scss +184 -12
  124. package/scss/coreui-grid.rtl.scss +1 -1
  125. package/scss/coreui-grid.scss +3 -1
  126. package/scss/coreui-reboot.rtl.scss +1 -1
  127. package/scss/coreui-reboot.scss +2 -4
  128. package/scss/coreui-utilities.rtl.scss +1 -1
  129. package/scss/coreui-utilities.scss +1 -1
  130. package/scss/coreui.rtl.scss +1 -1
  131. package/scss/coreui.scss +2 -1
  132. package/scss/forms/_form-control.scss +1 -1
  133. package/scss/forms/_form-select.scss +2 -0
  134. package/scss/helpers/_stacks.scss +15 -0
  135. package/scss/helpers/_vr.scss +8 -0
  136. package/scss/mixins/_backdrop.scss +14 -0
  137. package/scss/mixins/_grid.scss +29 -10
  138. package/scss/mixins/_ltr-rtl.scss +21 -0
  139. package/scss/mixins/_utilities.scss +26 -26
  140. package/scss/mixins/_visually-hidden.scss +1 -1
  141. package/scss/sidebar/_sidebar.scss +22 -16
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * CoreUI offcanvas.js v4.0.2 (https://coreui.io)
2
+ * CoreUI offcanvas.js v4.1.0 (https://coreui.io)
3
3
  * Copyright 2021 The CoreUI Team (https://github.com/orgs/coreui/people)
4
4
  * Licensed under MIT (https://coreui.io)
5
5
  */
@@ -7,15 +7,24 @@
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.0): 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
 
@@ -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;
@@ -143,8 +152,20 @@
143
152
 
144
153
  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
145
154
  };
155
+ /**
156
+ * Trick to restart an element's animation
157
+ *
158
+ * @param {HTMLElement} element
159
+ * @return void
160
+ *
161
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
162
+ */
163
+
146
164
 
147
- const reflow = element => element.offsetHeight;
165
+ const reflow = element => {
166
+ // eslint-disable-next-line no-unused-expressions
167
+ element.offsetHeight;
168
+ };
148
169
 
149
170
  const getjQuery = () => {
150
171
  const {
@@ -232,7 +253,7 @@
232
253
 
233
254
  /**
234
255
  * --------------------------------------------------------------------------
235
- * Bootstrap (v5.0.2): util/scrollBar.js
256
+ * Bootstrap (v5.1.3): util/scrollBar.js
236
257
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
237
258
  * --------------------------------------------------------------------------
238
259
  */
@@ -301,18 +322,18 @@
301
322
  const actualValue = element.style[styleProp];
302
323
 
303
324
  if (actualValue) {
304
- Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
325
+ Manipulator__default.default.setDataAttribute(element, styleProp, actualValue);
305
326
  }
306
327
  }
307
328
 
308
329
  _resetElementAttributes(selector, styleProp) {
309
330
  const manipulationCallBack = element => {
310
- const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
331
+ const value = Manipulator__default.default.getDataAttribute(element, styleProp);
311
332
 
312
333
  if (typeof value === 'undefined') {
313
334
  element.style.removeProperty(styleProp);
314
335
  } else {
315
- Manipulator__default['default'].removeDataAttribute(element, styleProp);
336
+ Manipulator__default.default.removeDataAttribute(element, styleProp);
316
337
  element.style[styleProp] = value;
317
338
  }
318
339
  };
@@ -324,7 +345,7 @@
324
345
  if (isElement(selector)) {
325
346
  callBack(selector);
326
347
  } else {
327
- SelectorEngine__default['default'].find(selector, this._element).forEach(callBack);
348
+ SelectorEngine__default.default.find(selector, this._element).forEach(callBack);
328
349
  }
329
350
  }
330
351
 
@@ -336,11 +357,12 @@
336
357
 
337
358
  /**
338
359
  * --------------------------------------------------------------------------
339
- * Bootstrap (v5.0.2): util/backdrop.js
340
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
360
+ * Bootstrap (v5.1.3): util/backdrop.js
361
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
341
362
  * --------------------------------------------------------------------------
342
363
  */
343
- const Default$1 = {
364
+ const Default$2 = {
365
+ className: 'modal-backdrop',
344
366
  isVisible: true,
345
367
  // if false, we use the backdrop helper without adding any element to the dom
346
368
  isAnimated: false,
@@ -348,17 +370,17 @@
348
370
  // give the choice to place backdrop under different elements
349
371
  clickCallback: null
350
372
  };
351
- const DefaultType$1 = {
373
+ const DefaultType$2 = {
374
+ className: 'string',
352
375
  isVisible: 'boolean',
353
376
  isAnimated: 'boolean',
354
377
  rootElement: '(element|string)',
355
378
  clickCallback: '(function|null)'
356
379
  };
357
- const NAME$1 = 'backdrop';
358
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
380
+ const NAME$2 = 'backdrop';
359
381
  const CLASS_NAME_FADE = 'fade';
360
382
  const CLASS_NAME_SHOW$1 = 'show';
361
- const EVENT_MOUSEDOWN = `mousedown.coreui.${NAME$1}`;
383
+ const EVENT_MOUSEDOWN = `mousedown.coreui.${NAME$2}`;
362
384
 
363
385
  class Backdrop {
364
386
  constructor(config) {
@@ -404,7 +426,7 @@
404
426
  _getElement() {
405
427
  if (!this._element) {
406
428
  const backdrop = document.createElement('div');
407
- backdrop.className = CLASS_NAME_BACKDROP;
429
+ backdrop.className = this._config.className;
408
430
 
409
431
  if (this._config.isAnimated) {
410
432
  backdrop.classList.add(CLASS_NAME_FADE);
@@ -417,12 +439,12 @@
417
439
  }
418
440
 
419
441
  _getConfig(config) {
420
- config = { ...Default$1,
442
+ config = { ...Default$2,
421
443
  ...(typeof config === 'object' ? config : {})
422
444
  }; // use getElement() with the default "body" to get a fresh Element on each instantiation
423
445
 
424
446
  config.rootElement = getElement(config.rootElement);
425
- typeCheckConfig(NAME$1, config, DefaultType$1);
447
+ typeCheckConfig(NAME$2, config, DefaultType$2);
426
448
  return config;
427
449
  }
428
450
 
@@ -431,9 +453,9 @@
431
453
  return;
432
454
  }
433
455
 
434
- this._config.rootElement.appendChild(this._getElement());
456
+ this._config.rootElement.append(this._getElement());
435
457
 
436
- EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
458
+ EventHandler__default.default.on(this._getElement(), EVENT_MOUSEDOWN, () => {
437
459
  execute(this._config.clickCallback);
438
460
  });
439
461
  this._isAppended = true;
@@ -444,7 +466,7 @@
444
466
  return;
445
467
  }
446
468
 
447
- EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
469
+ EventHandler__default.default.off(this._element, EVENT_MOUSEDOWN);
448
470
 
449
471
  this._element.remove();
450
472
 
@@ -459,7 +481,136 @@
459
481
 
460
482
  /**
461
483
  * --------------------------------------------------------------------------
462
- * CoreUI (v4.0.2): dropdown.js
484
+ * Bootstrap (v5.1.3): util/focustrap.js
485
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
486
+ * --------------------------------------------------------------------------
487
+ */
488
+ const Default$1 = {
489
+ trapElement: null,
490
+ // The element to trap focus inside of
491
+ autofocus: true
492
+ };
493
+ const DefaultType$1 = {
494
+ trapElement: 'element',
495
+ autofocus: 'boolean'
496
+ };
497
+ const NAME$1 = 'focustrap';
498
+ const DATA_KEY$1 = 'coreui.focustrap';
499
+ const EVENT_KEY$1 = `.${DATA_KEY$1}`;
500
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
501
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
502
+ const TAB_KEY = 'Tab';
503
+ const TAB_NAV_FORWARD = 'forward';
504
+ const TAB_NAV_BACKWARD = 'backward';
505
+
506
+ class FocusTrap {
507
+ constructor(config) {
508
+ this._config = this._getConfig(config);
509
+ this._isActive = false;
510
+ this._lastTabNavDirection = null;
511
+ }
512
+
513
+ activate() {
514
+ const {
515
+ trapElement,
516
+ autofocus
517
+ } = this._config;
518
+
519
+ if (this._isActive) {
520
+ return;
521
+ }
522
+
523
+ if (autofocus) {
524
+ trapElement.focus();
525
+ }
526
+
527
+ EventHandler__default.default.off(document, EVENT_KEY$1); // guard against infinite focus loop
528
+
529
+ EventHandler__default.default.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
530
+ EventHandler__default.default.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
531
+ this._isActive = true;
532
+ }
533
+
534
+ deactivate() {
535
+ if (!this._isActive) {
536
+ return;
537
+ }
538
+
539
+ this._isActive = false;
540
+ EventHandler__default.default.off(document, EVENT_KEY$1);
541
+ } // Private
542
+
543
+
544
+ _handleFocusin(event) {
545
+ const {
546
+ target
547
+ } = event;
548
+ const {
549
+ trapElement
550
+ } = this._config;
551
+
552
+ if (target === document || target === trapElement || trapElement.contains(target)) {
553
+ return;
554
+ }
555
+
556
+ const elements = SelectorEngine__default.default.focusableChildren(trapElement);
557
+
558
+ if (elements.length === 0) {
559
+ trapElement.focus();
560
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
561
+ elements[elements.length - 1].focus();
562
+ } else {
563
+ elements[0].focus();
564
+ }
565
+ }
566
+
567
+ _handleKeydown(event) {
568
+ if (event.key !== TAB_KEY) {
569
+ return;
570
+ }
571
+
572
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
573
+ }
574
+
575
+ _getConfig(config) {
576
+ config = { ...Default$1,
577
+ ...(typeof config === 'object' ? config : {})
578
+ };
579
+ typeCheckConfig(NAME$1, config, DefaultType$1);
580
+ return config;
581
+ }
582
+
583
+ }
584
+
585
+ /**
586
+ * --------------------------------------------------------------------------
587
+ * Bootstrap (v5.1.3): util/component-functions.js
588
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
589
+ * --------------------------------------------------------------------------
590
+ */
591
+
592
+ const enableDismissTrigger = (component, method = 'hide') => {
593
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
594
+ const name = component.NAME;
595
+ EventHandler__default.default.on(document, clickEvent, `[data-coreui-dismiss="${name}"]`, function (event) {
596
+ if (['A', 'AREA'].includes(this.tagName)) {
597
+ event.preventDefault();
598
+ }
599
+
600
+ if (isDisabled(this)) {
601
+ return;
602
+ }
603
+
604
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
605
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
606
+
607
+ instance[method]();
608
+ });
609
+ };
610
+
611
+ /**
612
+ * --------------------------------------------------------------------------
613
+ * CoreUI (v4.1.0): dropdown.js
463
614
  * Licensed under MIT (https://coreui.io/license)
464
615
  *
465
616
  * This component is a modified version of the Bootstrap's offcanvas.js
@@ -489,16 +640,14 @@
489
640
  scroll: 'boolean'
490
641
  };
491
642
  const CLASS_NAME_SHOW = 'show';
643
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
492
644
  const OPEN_SELECTOR = '.offcanvas.show';
493
645
  const EVENT_SHOW = `show${EVENT_KEY}`;
494
646
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
495
647
  const EVENT_HIDE = `hide${EVENT_KEY}`;
496
648
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
497
- const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
498
649
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
499
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
500
650
  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
501
- const SELECTOR_DATA_DISMISS = '[data-coreui-dismiss="offcanvas"]';
502
651
  const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="offcanvas"]';
503
652
  /**
504
653
  * ------------------------------------------------------------------------
@@ -506,12 +655,13 @@
506
655
  * ------------------------------------------------------------------------
507
656
  */
508
657
 
509
- class Offcanvas extends BaseComponent__default['default'] {
658
+ class Offcanvas extends BaseComponent__default.default {
510
659
  constructor(element, config) {
511
660
  super(element);
512
661
  this._config = this._getConfig(config);
513
662
  this._isShown = false;
514
663
  this._backdrop = this._initializeBackDrop();
664
+ this._focustrap = this._initializeFocusTrap();
515
665
 
516
666
  this._addEventListeners();
517
667
  } // Getters
@@ -535,7 +685,7 @@
535
685
  return;
536
686
  }
537
687
 
538
- const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
688
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
539
689
  relatedTarget
540
690
  });
541
691
 
@@ -550,8 +700,6 @@
550
700
 
551
701
  if (!this._config.scroll) {
552
702
  new ScrollBarHelper().hide();
553
-
554
- this._enforceFocusOnElement(this._element);
555
703
  }
556
704
 
557
705
  this._element.removeAttribute('aria-hidden');
@@ -563,7 +711,11 @@
563
711
  this._element.classList.add(CLASS_NAME_SHOW);
564
712
 
565
713
  const completeCallBack = () => {
566
- EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
714
+ if (!this._config.scroll) {
715
+ this._focustrap.activate();
716
+ }
717
+
718
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
567
719
  relatedTarget
568
720
  });
569
721
  };
@@ -576,13 +728,13 @@
576
728
  return;
577
729
  }
578
730
 
579
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
731
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
580
732
 
581
733
  if (hideEvent.defaultPrevented) {
582
734
  return;
583
735
  }
584
736
 
585
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
737
+ this._focustrap.deactivate();
586
738
 
587
739
  this._element.blur();
588
740
 
@@ -605,7 +757,7 @@
605
757
  new ScrollBarHelper().reset();
606
758
  }
607
759
 
608
- EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
760
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
609
761
  };
610
762
 
611
763
  this._queueCallback(completeCallback, this._element, true);
@@ -614,14 +766,15 @@
614
766
  dispose() {
615
767
  this._backdrop.dispose();
616
768
 
769
+ this._focustrap.deactivate();
770
+
617
771
  super.dispose();
618
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
619
772
  } // Private
620
773
 
621
774
 
622
775
  _getConfig(config) {
623
776
  config = { ...Default,
624
- ...Manipulator__default['default'].getDataAttributes(this._element),
777
+ ...Manipulator__default.default.getDataAttributes(this._element),
625
778
  ...(typeof config === 'object' ? config : {})
626
779
  };
627
780
  typeCheckConfig(NAME, config, DefaultType);
@@ -630,6 +783,7 @@
630
783
 
631
784
  _initializeBackDrop() {
632
785
  return new Backdrop({
786
+ className: CLASS_NAME_BACKDROP,
633
787
  isVisible: this._config.backdrop,
634
788
  isAnimated: true,
635
789
  rootElement: this._element.parentNode,
@@ -637,20 +791,14 @@
637
791
  });
638
792
  }
639
793
 
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
- }
794
+ _initializeFocusTrap() {
795
+ return new FocusTrap({
796
+ trapElement: this._element
647
797
  });
648
- element.focus();
649
798
  }
650
799
 
651
800
  _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 => {
801
+ EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
654
802
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
655
803
  this.hide();
656
804
  }
@@ -682,7 +830,7 @@
682
830
  */
683
831
 
684
832
 
685
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
833
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
686
834
  const target = getElementFromSelector(this);
687
835
 
688
836
  if (['A', 'AREA'].includes(this.tagName)) {
@@ -693,14 +841,14 @@
693
841
  return;
694
842
  }
695
843
 
696
- EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
844
+ EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
697
845
  // focus on trigger when it is closed
698
846
  if (isVisible(this)) {
699
847
  this.focus();
700
848
  }
701
849
  }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
702
850
 
703
- const allReadyOpen = SelectorEngine__default['default'].findOne(OPEN_SELECTOR);
851
+ const allReadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
704
852
 
705
853
  if (allReadyOpen && allReadyOpen !== target) {
706
854
  Offcanvas.getInstance(allReadyOpen).hide();
@@ -709,7 +857,8 @@
709
857
  const data = Offcanvas.getOrCreateInstance(target);
710
858
  data.toggle(this);
711
859
  });
712
- EventHandler__default['default'].on(window, EVENT_LOAD_DATA_API, () => SelectorEngine__default['default'].find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
860
+ EventHandler__default.default.on(window, EVENT_LOAD_DATA_API, () => SelectorEngine__default.default.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
861
+ enableDismissTrigger(Offcanvas);
713
862
  /**
714
863
  * ------------------------------------------------------------------------
715
864
  * jQuery
@@ -720,5 +869,5 @@
720
869
 
721
870
  return Offcanvas;
722
871
 
723
- })));
872
+ }));
724
873
  //# sourceMappingURL=offcanvas.js.map