@coreui/coreui 4.0.5 → 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 (140) 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 +693 -327
  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 +676 -325
  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 +776 -702
  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 +659 -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 +669 -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 +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 +3 -3
  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 +26 -7
  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
package/js/dist/modal.js CHANGED
@@ -1,21 +1,30 @@
1
1
  /*!
2
- * CoreUI modal.js v4.0.5 (https://coreui.io)
2
+ * CoreUI modal.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
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/selector-engine.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.SelectorEngine, global.EventHandler, global.Manipulator, global.Base));
10
- }(this, (function (SelectorEngine, EventHandler, Manipulator, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['./dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
+ })(this, (function (EventHandler, Manipulator, SelectorEngine, 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 EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
16
- var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
17
- var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
14
+ const EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
15
+ const Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
16
+ const SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
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;
@@ -128,7 +137,35 @@
128
137
  return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
129
138
  };
130
139
 
131
- const reflow = element => element.offsetHeight;
140
+ const isDisabled = element => {
141
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
142
+ return true;
143
+ }
144
+
145
+ if (element.classList.contains('disabled')) {
146
+ return true;
147
+ }
148
+
149
+ if (typeof element.disabled !== 'undefined') {
150
+ return element.disabled;
151
+ }
152
+
153
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
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
+
164
+
165
+ const reflow = element => {
166
+ // eslint-disable-next-line no-unused-expressions
167
+ element.offsetHeight;
168
+ };
132
169
 
133
170
  const getjQuery = () => {
134
171
  const {
@@ -218,7 +255,7 @@
218
255
 
219
256
  /**
220
257
  * --------------------------------------------------------------------------
221
- * Bootstrap (v5.0.2): util/scrollBar.js
258
+ * Bootstrap (v5.1.3): util/scrollBar.js
222
259
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
223
260
  * --------------------------------------------------------------------------
224
261
  */
@@ -287,18 +324,18 @@
287
324
  const actualValue = element.style[styleProp];
288
325
 
289
326
  if (actualValue) {
290
- Manipulator__default['default'].setDataAttribute(element, styleProp, actualValue);
327
+ Manipulator__default.default.setDataAttribute(element, styleProp, actualValue);
291
328
  }
292
329
  }
293
330
 
294
331
  _resetElementAttributes(selector, styleProp) {
295
332
  const manipulationCallBack = element => {
296
- const value = Manipulator__default['default'].getDataAttribute(element, styleProp);
333
+ const value = Manipulator__default.default.getDataAttribute(element, styleProp);
297
334
 
298
335
  if (typeof value === 'undefined') {
299
336
  element.style.removeProperty(styleProp);
300
337
  } else {
301
- Manipulator__default['default'].removeDataAttribute(element, styleProp);
338
+ Manipulator__default.default.removeDataAttribute(element, styleProp);
302
339
  element.style[styleProp] = value;
303
340
  }
304
341
  };
@@ -310,7 +347,7 @@
310
347
  if (isElement(selector)) {
311
348
  callBack(selector);
312
349
  } else {
313
- SelectorEngine__default['default'].find(selector, this._element).forEach(callBack);
350
+ SelectorEngine__default.default.find(selector, this._element).forEach(callBack);
314
351
  }
315
352
  }
316
353
 
@@ -322,11 +359,12 @@
322
359
 
323
360
  /**
324
361
  * --------------------------------------------------------------------------
325
- * Bootstrap (v5.0.2): util/backdrop.js
326
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
362
+ * Bootstrap (v5.1.3): util/backdrop.js
363
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
327
364
  * --------------------------------------------------------------------------
328
365
  */
329
- const Default$1 = {
366
+ const Default$2 = {
367
+ className: 'modal-backdrop',
330
368
  isVisible: true,
331
369
  // if false, we use the backdrop helper without adding any element to the dom
332
370
  isAnimated: false,
@@ -334,17 +372,17 @@
334
372
  // give the choice to place backdrop under different elements
335
373
  clickCallback: null
336
374
  };
337
- const DefaultType$1 = {
375
+ const DefaultType$2 = {
376
+ className: 'string',
338
377
  isVisible: 'boolean',
339
378
  isAnimated: 'boolean',
340
379
  rootElement: '(element|string)',
341
380
  clickCallback: '(function|null)'
342
381
  };
343
- const NAME$1 = 'backdrop';
344
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
382
+ const NAME$2 = 'backdrop';
345
383
  const CLASS_NAME_FADE$1 = 'fade';
346
384
  const CLASS_NAME_SHOW$1 = 'show';
347
- const EVENT_MOUSEDOWN = `mousedown.coreui.${NAME$1}`;
385
+ const EVENT_MOUSEDOWN = `mousedown.coreui.${NAME$2}`;
348
386
 
349
387
  class Backdrop {
350
388
  constructor(config) {
@@ -390,7 +428,7 @@
390
428
  _getElement() {
391
429
  if (!this._element) {
392
430
  const backdrop = document.createElement('div');
393
- backdrop.className = CLASS_NAME_BACKDROP;
431
+ backdrop.className = this._config.className;
394
432
 
395
433
  if (this._config.isAnimated) {
396
434
  backdrop.classList.add(CLASS_NAME_FADE$1);
@@ -403,12 +441,12 @@
403
441
  }
404
442
 
405
443
  _getConfig(config) {
406
- config = { ...Default$1,
444
+ config = { ...Default$2,
407
445
  ...(typeof config === 'object' ? config : {})
408
446
  }; // use getElement() with the default "body" to get a fresh Element on each instantiation
409
447
 
410
448
  config.rootElement = getElement(config.rootElement);
411
- typeCheckConfig(NAME$1, config, DefaultType$1);
449
+ typeCheckConfig(NAME$2, config, DefaultType$2);
412
450
  return config;
413
451
  }
414
452
 
@@ -417,9 +455,9 @@
417
455
  return;
418
456
  }
419
457
 
420
- this._config.rootElement.appendChild(this._getElement());
458
+ this._config.rootElement.append(this._getElement());
421
459
 
422
- EventHandler__default['default'].on(this._getElement(), EVENT_MOUSEDOWN, () => {
460
+ EventHandler__default.default.on(this._getElement(), EVENT_MOUSEDOWN, () => {
423
461
  execute(this._config.clickCallback);
424
462
  });
425
463
  this._isAppended = true;
@@ -430,7 +468,7 @@
430
468
  return;
431
469
  }
432
470
 
433
- EventHandler__default['default'].off(this._element, EVENT_MOUSEDOWN);
471
+ EventHandler__default.default.off(this._element, EVENT_MOUSEDOWN);
434
472
 
435
473
  this._element.remove();
436
474
 
@@ -445,7 +483,136 @@
445
483
 
446
484
  /**
447
485
  * --------------------------------------------------------------------------
448
- * CoreUI (v4.0.5): modal.js
486
+ * Bootstrap (v5.1.3): util/focustrap.js
487
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
488
+ * --------------------------------------------------------------------------
489
+ */
490
+ const Default$1 = {
491
+ trapElement: null,
492
+ // The element to trap focus inside of
493
+ autofocus: true
494
+ };
495
+ const DefaultType$1 = {
496
+ trapElement: 'element',
497
+ autofocus: 'boolean'
498
+ };
499
+ const NAME$1 = 'focustrap';
500
+ const DATA_KEY$1 = 'coreui.focustrap';
501
+ const EVENT_KEY$1 = `.${DATA_KEY$1}`;
502
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
503
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$1}`;
504
+ const TAB_KEY = 'Tab';
505
+ const TAB_NAV_FORWARD = 'forward';
506
+ const TAB_NAV_BACKWARD = 'backward';
507
+
508
+ class FocusTrap {
509
+ constructor(config) {
510
+ this._config = this._getConfig(config);
511
+ this._isActive = false;
512
+ this._lastTabNavDirection = null;
513
+ }
514
+
515
+ activate() {
516
+ const {
517
+ trapElement,
518
+ autofocus
519
+ } = this._config;
520
+
521
+ if (this._isActive) {
522
+ return;
523
+ }
524
+
525
+ if (autofocus) {
526
+ trapElement.focus();
527
+ }
528
+
529
+ EventHandler__default.default.off(document, EVENT_KEY$1); // guard against infinite focus loop
530
+
531
+ EventHandler__default.default.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));
532
+ EventHandler__default.default.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
533
+ this._isActive = true;
534
+ }
535
+
536
+ deactivate() {
537
+ if (!this._isActive) {
538
+ return;
539
+ }
540
+
541
+ this._isActive = false;
542
+ EventHandler__default.default.off(document, EVENT_KEY$1);
543
+ } // Private
544
+
545
+
546
+ _handleFocusin(event) {
547
+ const {
548
+ target
549
+ } = event;
550
+ const {
551
+ trapElement
552
+ } = this._config;
553
+
554
+ if (target === document || target === trapElement || trapElement.contains(target)) {
555
+ return;
556
+ }
557
+
558
+ const elements = SelectorEngine__default.default.focusableChildren(trapElement);
559
+
560
+ if (elements.length === 0) {
561
+ trapElement.focus();
562
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
563
+ elements[elements.length - 1].focus();
564
+ } else {
565
+ elements[0].focus();
566
+ }
567
+ }
568
+
569
+ _handleKeydown(event) {
570
+ if (event.key !== TAB_KEY) {
571
+ return;
572
+ }
573
+
574
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
575
+ }
576
+
577
+ _getConfig(config) {
578
+ config = { ...Default$1,
579
+ ...(typeof config === 'object' ? config : {})
580
+ };
581
+ typeCheckConfig(NAME$1, config, DefaultType$1);
582
+ return config;
583
+ }
584
+
585
+ }
586
+
587
+ /**
588
+ * --------------------------------------------------------------------------
589
+ * Bootstrap (v5.1.3): util/component-functions.js
590
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
591
+ * --------------------------------------------------------------------------
592
+ */
593
+
594
+ const enableDismissTrigger = (component, method = 'hide') => {
595
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
596
+ const name = component.NAME;
597
+ EventHandler__default.default.on(document, clickEvent, `[data-coreui-dismiss="${name}"]`, function (event) {
598
+ if (['A', 'AREA'].includes(this.tagName)) {
599
+ event.preventDefault();
600
+ }
601
+
602
+ if (isDisabled(this)) {
603
+ return;
604
+ }
605
+
606
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
607
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
608
+
609
+ instance[method]();
610
+ });
611
+ };
612
+
613
+ /**
614
+ * --------------------------------------------------------------------------
615
+ * CoreUI (v4.1.0): modal.js
449
616
  * Licensed under MIT (https://coreui.io/license)
450
617
  *
451
618
  * This component is a modified version of the Bootstrap's modal.js
@@ -478,7 +645,6 @@
478
645
  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
479
646
  const EVENT_SHOW = `show${EVENT_KEY}`;
480
647
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
481
- const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
482
648
  const EVENT_RESIZE = `resize${EVENT_KEY}`;
483
649
  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
484
650
  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;
@@ -489,22 +655,23 @@
489
655
  const CLASS_NAME_FADE = 'fade';
490
656
  const CLASS_NAME_SHOW = 'show';
491
657
  const CLASS_NAME_STATIC = 'modal-static';
658
+ const OPEN_SELECTOR = '.modal.show';
492
659
  const SELECTOR_DIALOG = '.modal-dialog';
493
660
  const SELECTOR_MODAL_BODY = '.modal-body';
494
661
  const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="modal"]';
495
- const SELECTOR_DATA_DISMISS = '[data-coreui-dismiss="modal"]';
496
662
  /**
497
663
  * ------------------------------------------------------------------------
498
664
  * Class Definition
499
665
  * ------------------------------------------------------------------------
500
666
  */
501
667
 
502
- class Modal extends BaseComponent__default['default'] {
668
+ class Modal extends BaseComponent__default.default {
503
669
  constructor(element, config) {
504
670
  super(element);
505
671
  this._config = this._getConfig(config);
506
- this._dialog = SelectorEngine__default['default'].findOne(SELECTOR_DIALOG, this._element);
672
+ this._dialog = SelectorEngine__default.default.findOne(SELECTOR_DIALOG, this._element);
507
673
  this._backdrop = this._initializeBackDrop();
674
+ this._focustrap = this._initializeFocusTrap();
508
675
  this._isShown = false;
509
676
  this._ignoreBackdropClick = false;
510
677
  this._isTransitioning = false;
@@ -530,7 +697,7 @@
530
697
  return;
531
698
  }
532
699
 
533
- const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, {
700
+ const showEvent = EventHandler__default.default.trigger(this._element, EVENT_SHOW, {
534
701
  relatedTarget
535
702
  });
536
703
 
@@ -554,9 +721,8 @@
554
721
 
555
722
  this._setResizeEvent();
556
723
 
557
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, event => this.hide(event));
558
- EventHandler__default['default'].on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
559
- EventHandler__default['default'].one(this._element, EVENT_MOUSEUP_DISMISS, event => {
724
+ EventHandler__default.default.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
725
+ EventHandler__default.default.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
560
726
  if (event.target === this._element) {
561
727
  this._ignoreBackdropClick = true;
562
728
  }
@@ -566,16 +732,12 @@
566
732
  this._showBackdrop(() => this._showElement(relatedTarget));
567
733
  }
568
734
 
569
- hide(event) {
570
- if (event && ['A', 'AREA'].includes(event.target.tagName)) {
571
- event.preventDefault();
572
- }
573
-
735
+ hide() {
574
736
  if (!this._isShown || this._isTransitioning) {
575
737
  return;
576
738
  }
577
739
 
578
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE);
740
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE);
579
741
 
580
742
  if (hideEvent.defaultPrevented) {
581
743
  return;
@@ -593,29 +755,24 @@
593
755
 
594
756
  this._setResizeEvent();
595
757
 
596
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
758
+ this._focustrap.deactivate();
597
759
 
598
760
  this._element.classList.remove(CLASS_NAME_SHOW);
599
761
 
600
- EventHandler__default['default'].off(this._element, EVENT_CLICK_DISMISS);
601
- EventHandler__default['default'].off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
762
+ EventHandler__default.default.off(this._element, EVENT_CLICK_DISMISS);
763
+ EventHandler__default.default.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
602
764
 
603
765
  this._queueCallback(() => this._hideModal(), this._element, isAnimated);
604
766
  }
605
767
 
606
768
  dispose() {
607
- [window, this._dialog].forEach(htmlElement => EventHandler__default['default'].off(htmlElement, EVENT_KEY));
769
+ [window, this._dialog].forEach(htmlElement => EventHandler__default.default.off(htmlElement, EVENT_KEY));
608
770
 
609
771
  this._backdrop.dispose();
610
772
 
611
- super.dispose();
612
- /**
613
- * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
614
- * Do not move `document` in `htmlElements` array
615
- * It will remove `EVENT_CLICK_DATA_API` event that should remain
616
- */
773
+ this._focustrap.deactivate();
617
774
 
618
- EventHandler__default['default'].off(document, EVENT_FOCUSIN);
775
+ super.dispose();
619
776
  }
620
777
 
621
778
  handleUpdate() {
@@ -631,9 +788,15 @@
631
788
  });
632
789
  }
633
790
 
791
+ _initializeFocusTrap() {
792
+ return new FocusTrap({
793
+ trapElement: this._element
794
+ });
795
+ }
796
+
634
797
  _getConfig(config) {
635
798
  config = { ...Default,
636
- ...Manipulator__default['default'].getDataAttributes(this._element),
799
+ ...Manipulator__default.default.getDataAttributes(this._element),
637
800
  ...(typeof config === 'object' ? config : {})
638
801
  };
639
802
  typeCheckConfig(NAME, config, DefaultType);
@@ -643,11 +806,11 @@
643
806
  _showElement(relatedTarget) {
644
807
  const isAnimated = this._isAnimated();
645
808
 
646
- const modalBody = SelectorEngine__default['default'].findOne(SELECTOR_MODAL_BODY, this._dialog);
809
+ const modalBody = SelectorEngine__default.default.findOne(SELECTOR_MODAL_BODY, this._dialog);
647
810
 
648
811
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
649
812
  // Don't move modal's DOM position
650
- document.body.appendChild(this._element);
813
+ document.body.append(this._element);
651
814
  }
652
815
 
653
816
  this._element.style.display = 'block';
@@ -670,17 +833,13 @@
670
833
 
671
834
  this._element.classList.add(CLASS_NAME_SHOW);
672
835
 
673
- if (this._config.focus) {
674
- this._enforceFocus();
675
- }
676
-
677
836
  const transitionComplete = () => {
678
837
  if (this._config.focus) {
679
- this._element.focus();
838
+ this._focustrap.activate();
680
839
  }
681
840
 
682
841
  this._isTransitioning = false;
683
- EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, {
842
+ EventHandler__default.default.trigger(this._element, EVENT_SHOWN, {
684
843
  relatedTarget
685
844
  });
686
845
  };
@@ -688,19 +847,9 @@
688
847
  this._queueCallback(transitionComplete, this._dialog, isAnimated);
689
848
  }
690
849
 
691
- _enforceFocus() {
692
- EventHandler__default['default'].off(document, EVENT_FOCUSIN); // guard against infinite focus loop
693
-
694
- EventHandler__default['default'].on(document, EVENT_FOCUSIN, event => {
695
- if (document !== event.target && this._element !== event.target && !this._element.contains(event.target)) {
696
- this._element.focus();
697
- }
698
- });
699
- }
700
-
701
850
  _setEscapeEvent() {
702
851
  if (this._isShown) {
703
- EventHandler__default['default'].on(this._element, EVENT_KEYDOWN_DISMISS, event => {
852
+ EventHandler__default.default.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
704
853
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
705
854
  event.preventDefault();
706
855
  this.hide();
@@ -709,15 +858,15 @@
709
858
  }
710
859
  });
711
860
  } else {
712
- EventHandler__default['default'].off(this._element, EVENT_KEYDOWN_DISMISS);
861
+ EventHandler__default.default.off(this._element, EVENT_KEYDOWN_DISMISS);
713
862
  }
714
863
  }
715
864
 
716
865
  _setResizeEvent() {
717
866
  if (this._isShown) {
718
- EventHandler__default['default'].on(window, EVENT_RESIZE, () => this._adjustDialog());
867
+ EventHandler__default.default.on(window, EVENT_RESIZE, () => this._adjustDialog());
719
868
  } else {
720
- EventHandler__default['default'].off(window, EVENT_RESIZE);
869
+ EventHandler__default.default.off(window, EVENT_RESIZE);
721
870
  }
722
871
  }
723
872
 
@@ -739,12 +888,12 @@
739
888
 
740
889
  this._scrollBar.reset();
741
890
 
742
- EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN);
891
+ EventHandler__default.default.trigger(this._element, EVENT_HIDDEN);
743
892
  });
744
893
  }
745
894
 
746
895
  _showBackdrop(callback) {
747
- EventHandler__default['default'].on(this._element, EVENT_CLICK_DISMISS, event => {
896
+ EventHandler__default.default.on(this._element, EVENT_CLICK_DISMISS, event => {
748
897
  if (this._ignoreBackdropClick) {
749
898
  this._ignoreBackdropClick = false;
750
899
  return;
@@ -769,7 +918,7 @@
769
918
  }
770
919
 
771
920
  _triggerBackdropTransition() {
772
- const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE_PREVENTED);
921
+ const hideEvent = EventHandler__default.default.trigger(this._element, EVENT_HIDE_PREVENTED);
773
922
 
774
923
  if (hideEvent.defaultPrevented) {
775
924
  return;
@@ -854,28 +1003,36 @@
854
1003
  */
855
1004
 
856
1005
 
857
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
1006
+ EventHandler__default.default.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
858
1007
  const target = getElementFromSelector(this);
859
1008
 
860
1009
  if (['A', 'AREA'].includes(this.tagName)) {
861
1010
  event.preventDefault();
862
1011
  }
863
1012
 
864
- EventHandler__default['default'].one(target, EVENT_SHOW, showEvent => {
1013
+ EventHandler__default.default.one(target, EVENT_SHOW, showEvent => {
865
1014
  if (showEvent.defaultPrevented) {
866
1015
  // only register focus restorer if modal will actually get shown
867
1016
  return;
868
1017
  }
869
1018
 
870
- EventHandler__default['default'].one(target, EVENT_HIDDEN, () => {
1019
+ EventHandler__default.default.one(target, EVENT_HIDDEN, () => {
871
1020
  if (isVisible(this)) {
872
1021
  this.focus();
873
1022
  }
874
1023
  });
875
- });
1024
+ }); // avoid conflict when clicking moddal toggler while another one is open
1025
+
1026
+ const allReadyOpen = SelectorEngine__default.default.findOne(OPEN_SELECTOR);
1027
+
1028
+ if (allReadyOpen) {
1029
+ Modal.getInstance(allReadyOpen).hide();
1030
+ }
1031
+
876
1032
  const data = Modal.getOrCreateInstance(target);
877
1033
  data.toggle(this);
878
1034
  });
1035
+ enableDismissTrigger(Modal);
879
1036
  /**
880
1037
  * ------------------------------------------------------------------------
881
1038
  * jQuery
@@ -887,5 +1044,5 @@
887
1044
 
888
1045
  return Modal;
889
1046
 
890
- })));
1047
+ }));
891
1048
  //# sourceMappingURL=modal.js.map