bootstrap 5.0.0.beta3 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/assets/javascripts/bootstrap-sprockets.js +1 -1
  4. data/assets/javascripts/bootstrap.js +509 -459
  5. data/assets/javascripts/bootstrap.min.js +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +4 -4
  7. data/assets/javascripts/bootstrap/base-component.js +9 -7
  8. data/assets/javascripts/bootstrap/button.js +3 -3
  9. data/assets/javascripts/bootstrap/carousel.js +11 -12
  10. data/assets/javascripts/bootstrap/collapse.js +5 -5
  11. data/assets/javascripts/bootstrap/dom/data.js +2 -2
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +32 -14
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +2 -2
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +2 -2
  15. data/assets/javascripts/bootstrap/dropdown.js +109 -94
  16. data/assets/javascripts/bootstrap/modal.js +262 -177
  17. data/assets/javascripts/bootstrap/offcanvas.js +219 -56
  18. data/assets/javascripts/bootstrap/popover.js +3 -3
  19. data/assets/javascripts/bootstrap/scrollspy.js +18 -22
  20. data/assets/javascripts/bootstrap/tab.js +21 -8
  21. data/assets/javascripts/bootstrap/toast.js +4 -5
  22. data/assets/javascripts/bootstrap/tooltip.js +7 -9
  23. data/assets/stylesheets/_bootstrap-grid.scss +1 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +1 -1
  25. data/assets/stylesheets/_bootstrap.scss +1 -1
  26. data/assets/stylesheets/bootstrap/_accordion.scss +4 -2
  27. data/assets/stylesheets/bootstrap/_dropdown.scss +7 -13
  28. data/assets/stylesheets/bootstrap/_list-group.scss +1 -1
  29. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  30. data/assets/stylesheets/bootstrap/_modal.scss +0 -9
  31. data/assets/stylesheets/bootstrap/_offcanvas.scss +11 -11
  32. data/assets/stylesheets/bootstrap/_spinners.scss +2 -2
  33. data/assets/stylesheets/bootstrap/_variables.scss +7 -7
  34. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  35. data/assets/stylesheets/bootstrap/forms/_form-control.scss +5 -5
  36. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  37. data/assets/stylesheets/bootstrap/mixins/_forms.scss +7 -4
  38. data/assets/stylesheets/bootstrap/mixins/_grid.scss +8 -3
  39. data/bootstrap.gemspec +1 -1
  40. data/lib/bootstrap/version.rb +2 -2
  41. data/tasks/updater/js.rb +1 -1
  42. metadata +7 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3cc0d2ec96c189e5fa13c010311e0f02b196239f6ebe8ddba7dc2e226139b13
4
- data.tar.gz: ad6dda67296a47b6256ed254ad2b3bb7df86a47167584b9e147b48a6fe702297
3
+ metadata.gz: ab3cae7213a21110421a1bff463a4f8bccfdc085ce03953a9add6330fcc52f6f
4
+ data.tar.gz: f5e9f214138024c8adafcc459b934119657f9a0989b83c43dacf783ddd01a8a6
5
5
  SHA512:
6
- metadata.gz: 68276da5ce5396260233830bf907f24fe6247bf378b73736644301d3280a38a0318cf34f27b5c4b37ac31050414fc5ddbe06056dc57788cd9ab096eceeeb454e
7
- data.tar.gz: a19d71e99d6fe5c2c0b5d0aafb74a3be68cf2e9b19abbe89209732b02d466bed1a0d688534ac3b7497697b331064d3e54e93081d938b8cc592be6d1f0ca2949b
6
+ metadata.gz: a54dd7911c5a617cce35d57e7e8543859cd891e82fa919a85e74a7242337c6258175c7cacf09957b016d24a77957d85731a9373e948a9cfd1e85311513b05184
7
+ data.tar.gz: 63aac9f119c570a9826c14f6e1fefdf1c472bdd3befeac525c1d86c75a01e73e36c85bb238916ba09968b12541472c6f8727f3ca701366c7a72c161a32ff8c18
data/README.md CHANGED
@@ -20,7 +20,7 @@ Please see the appropriate guide for your environment of choice:
20
20
  Add `bootstrap` to your Gemfile:
21
21
 
22
22
  ```ruby
23
- gem 'bootstrap', '~> 5.0.0.beta3'
23
+ gem 'bootstrap', '~> 5.0.0'
24
24
  ```
25
25
 
26
26
  Ensure that `sprockets-rails` is at least v2.3.2.
@@ -48,7 +48,7 @@ Then, remove all the `*= require` and `*= require_tree` statements from the Sass
48
48
  Do not use `*= require` in Sass or your other stylesheets will not be able to access the Bootstrap mixins and variables.
49
49
 
50
50
  Bootstrap JavaScript can optionally use jQuery.
51
- If you're using Rails 5.1+, you can add add the `jquery-rails` gem to your Gemfile:
51
+ If you're using Rails 5.1+, you can add the `jquery-rails` gem to your Gemfile:
52
52
 
53
53
  ```ruby
54
54
  gem 'jquery-rails'
@@ -1,7 +1,7 @@
1
1
  //= require ./bootstrap-global-this-define
2
2
  //= require ./bootstrap/dom/data
3
- //= require ./bootstrap/base-component
4
3
  //= require ./bootstrap/dom/event-handler
4
+ //= require ./bootstrap/base-component
5
5
  //= require ./bootstrap/alert
6
6
  //= require ./bootstrap/button
7
7
  //= require ./bootstrap/dom/manipulator
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap v5.0.0-beta3 (https://getbootstrap.com/)
2
+ * Bootstrap v5.0.0 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
@@ -33,7 +33,7 @@
33
33
 
34
34
  /**
35
35
  * --------------------------------------------------------------------------
36
- * Bootstrap (v5.0.0-beta3): util/index.js
36
+ * Bootstrap (v5.0.0): util/index.js
37
37
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
38
38
  * --------------------------------------------------------------------------
39
39
  */
@@ -78,7 +78,7 @@
78
78
 
79
79
 
80
80
  if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
81
- hrefAttr = '#' + hrefAttr.split('#')[1];
81
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
82
82
  }
83
83
 
84
84
  selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
@@ -156,7 +156,7 @@
156
156
  const valueType = value && isElement(value) ? 'element' : toType(value);
157
157
 
158
158
  if (!new RegExp(expectedTypes).test(valueType)) {
159
- throw new TypeError(`${componentName.toUpperCase()}: ` + `Option "${property}" provided type "${valueType}" ` + `but expected type "${expectedTypes}".`);
159
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
160
160
  }
161
161
  });
162
162
  };
@@ -214,7 +214,7 @@
214
214
  return findShadowRoot(element.parentNode);
215
215
  };
216
216
 
217
- const noop = () => function () {};
217
+ const noop = () => {};
218
218
 
219
219
  const reflow = element => element.offsetHeight;
220
220
 
@@ -258,9 +258,15 @@
258
258
  });
259
259
  };
260
260
 
261
+ const execute = callback => {
262
+ if (typeof callback === 'function') {
263
+ callback();
264
+ }
265
+ };
266
+
261
267
  /**
262
268
  * --------------------------------------------------------------------------
263
- * Bootstrap (v5.0.0-beta3): dom/data.js
269
+ * Bootstrap (v5.0.0): dom/data.js
264
270
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
265
271
  * --------------------------------------------------------------------------
266
272
  */
@@ -314,7 +320,7 @@
314
320
 
315
321
  /**
316
322
  * --------------------------------------------------------------------------
317
- * Bootstrap (v5.0.0-beta3): dom/event-handler.js
323
+ * Bootstrap (v5.0.0): dom/event-handler.js
318
324
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
319
325
  * --------------------------------------------------------------------------
320
326
  */
@@ -334,6 +340,7 @@
334
340
  mouseenter: 'mouseover',
335
341
  mouseleave: 'mouseout'
336
342
  };
343
+ const customEventsRegex = /^(mouseenter|mouseleave)/i;
337
344
  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
338
345
  /**
339
346
  * ------------------------------------------------------------------------
@@ -377,7 +384,7 @@
377
384
 
378
385
  if (handler.oneOff) {
379
386
  // eslint-disable-next-line unicorn/consistent-destructuring
380
- EventHandler.off(element, event.type, fn);
387
+ EventHandler.off(element, event.type, selector, fn);
381
388
  }
382
389
 
383
390
  return fn.apply(target, [event]);
@@ -406,15 +413,8 @@
406
413
 
407
414
  function normalizeParams(originalTypeEvent, handler, delegationFn) {
408
415
  const delegation = typeof handler === 'string';
409
- const originalHandler = delegation ? delegationFn : handler; // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
410
-
411
- let typeEvent = originalTypeEvent.replace(stripNameRegex, '');
412
- const custom = customEvents[typeEvent];
413
-
414
- if (custom) {
415
- typeEvent = custom;
416
- }
417
-
416
+ const originalHandler = delegation ? delegationFn : handler;
417
+ let typeEvent = getTypeEvent(originalTypeEvent);
418
418
  const isNative = nativeEvents.has(typeEvent);
419
419
 
420
420
  if (!isNative) {
@@ -432,6 +432,24 @@
432
432
  if (!handler) {
433
433
  handler = delegationFn;
434
434
  delegationFn = null;
435
+ } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
436
+ // this prevents the handler from being dispatched the same way as mouseover or mouseout does
437
+
438
+
439
+ if (customEventsRegex.test(originalTypeEvent)) {
440
+ const wrapFn = fn => {
441
+ return function (event) {
442
+ if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
443
+ return fn.call(this, event);
444
+ }
445
+ };
446
+ };
447
+
448
+ if (delegationFn) {
449
+ delegationFn = wrapFn(delegationFn);
450
+ } else {
451
+ handler = wrapFn(handler);
452
+ }
435
453
  }
436
454
 
437
455
  const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
@@ -475,6 +493,12 @@
475
493
  });
476
494
  }
477
495
 
496
+ function getTypeEvent(event) {
497
+ // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
498
+ event = event.replace(stripNameRegex, '');
499
+ return customEvents[event] || event;
500
+ }
501
+
478
502
  const EventHandler = {
479
503
  on(element, event, handler, delegationFn) {
480
504
  addHandler(element, event, handler, delegationFn, false);
@@ -527,7 +551,7 @@
527
551
  }
528
552
 
529
553
  const $ = getjQuery();
530
- const typeEvent = event.replace(stripNameRegex, '');
554
+ const typeEvent = getTypeEvent(event);
531
555
  const inNamespace = event !== typeEvent;
532
556
  const isNative = nativeEvents.has(typeEvent);
533
557
  let jQueryEvent;
@@ -585,7 +609,7 @@
585
609
 
586
610
  /**
587
611
  * --------------------------------------------------------------------------
588
- * Bootstrap (v5.0.0-beta3): base-component.js
612
+ * Bootstrap (v5.0.0): base-component.js
589
613
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
590
614
  * --------------------------------------------------------------------------
591
615
  */
@@ -595,7 +619,7 @@
595
619
  * ------------------------------------------------------------------------
596
620
  */
597
621
 
598
- const VERSION = '5.0.0-beta3';
622
+ const VERSION = '5.0.0';
599
623
 
600
624
  class BaseComponent {
601
625
  constructor(element) {
@@ -611,6 +635,7 @@
611
635
 
612
636
  dispose() {
613
637
  Data.remove(this._element, this.constructor.DATA_KEY);
638
+ EventHandler.off(this._element, `.${this.constructor.DATA_KEY}`);
614
639
  this._element = null;
615
640
  }
616
641
  /** Static */
@@ -628,7 +653,7 @@
628
653
 
629
654
  /**
630
655
  * --------------------------------------------------------------------------
631
- * Bootstrap (v5.0.0-beta3): alert.js
656
+ * Bootstrap (v5.0.0): alert.js
632
657
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
633
658
  * --------------------------------------------------------------------------
634
659
  */
@@ -638,7 +663,7 @@
638
663
  * ------------------------------------------------------------------------
639
664
  */
640
665
 
641
- const NAME$b = 'alert';
666
+ const NAME$c = 'alert';
642
667
  const DATA_KEY$b = 'bs.alert';
643
668
  const EVENT_KEY$b = `.${DATA_KEY$b}`;
644
669
  const DATA_API_KEY$8 = '.data-api';
@@ -647,8 +672,8 @@
647
672
  const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
648
673
  const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$b}${DATA_API_KEY$8}`;
649
674
  const CLASS_NAME_ALERT = 'alert';
650
- const CLASS_NAME_FADE$5 = 'fade';
651
- const CLASS_NAME_SHOW$8 = 'show';
675
+ const CLASS_NAME_FADE$6 = 'fade';
676
+ const CLASS_NAME_SHOW$9 = 'show';
652
677
  /**
653
678
  * ------------------------------------------------------------------------
654
679
  * Class Definition
@@ -684,9 +709,9 @@
684
709
  }
685
710
 
686
711
  _removeElement(element) {
687
- element.classList.remove(CLASS_NAME_SHOW$8);
712
+ element.classList.remove(CLASS_NAME_SHOW$9);
688
713
 
689
- if (!element.classList.contains(CLASS_NAME_FADE$5)) {
714
+ if (!element.classList.contains(CLASS_NAME_FADE$6)) {
690
715
  this._destroyElement(element);
691
716
 
692
717
  return;
@@ -746,11 +771,11 @@
746
771
  * add .Alert to jQuery only if jQuery is present
747
772
  */
748
773
 
749
- defineJQueryPlugin(NAME$b, Alert);
774
+ defineJQueryPlugin(NAME$c, Alert);
750
775
 
751
776
  /**
752
777
  * --------------------------------------------------------------------------
753
- * Bootstrap (v5.0.0-beta3): button.js
778
+ * Bootstrap (v5.0.0): button.js
754
779
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
755
780
  * --------------------------------------------------------------------------
756
781
  */
@@ -760,7 +785,7 @@
760
785
  * ------------------------------------------------------------------------
761
786
  */
762
787
 
763
- const NAME$a = 'button';
788
+ const NAME$b = 'button';
764
789
  const DATA_KEY$a = 'bs.button';
765
790
  const EVENT_KEY$a = `.${DATA_KEY$a}`;
766
791
  const DATA_API_KEY$7 = '.data-api';
@@ -826,11 +851,11 @@
826
851
  * add .Button to jQuery only if jQuery is present
827
852
  */
828
853
 
829
- defineJQueryPlugin(NAME$a, Button);
854
+ defineJQueryPlugin(NAME$b, Button);
830
855
 
831
856
  /**
832
857
  * --------------------------------------------------------------------------
833
- * Bootstrap (v5.0.0-beta3): dom/manipulator.js
858
+ * Bootstrap (v5.0.0): dom/manipulator.js
834
859
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
835
860
  * --------------------------------------------------------------------------
836
861
  */
@@ -904,7 +929,7 @@
904
929
 
905
930
  /**
906
931
  * --------------------------------------------------------------------------
907
- * Bootstrap (v5.0.0-beta3): dom/selector-engine.js
932
+ * Bootstrap (v5.0.0): dom/selector-engine.js
908
933
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
909
934
  * --------------------------------------------------------------------------
910
935
  */
@@ -975,7 +1000,7 @@
975
1000
 
976
1001
  /**
977
1002
  * --------------------------------------------------------------------------
978
- * Bootstrap (v5.0.0-beta3): carousel.js
1003
+ * Bootstrap (v5.0.0): carousel.js
979
1004
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
980
1005
  * --------------------------------------------------------------------------
981
1006
  */
@@ -985,7 +1010,7 @@
985
1010
  * ------------------------------------------------------------------------
986
1011
  */
987
1012
 
988
- const NAME$9 = 'carousel';
1013
+ const NAME$a = 'carousel';
989
1014
  const DATA_KEY$9 = 'bs.carousel';
990
1015
  const EVENT_KEY$9 = `.${DATA_KEY$9}`;
991
1016
  const DATA_API_KEY$6 = '.data-api';
@@ -994,7 +1019,7 @@
994
1019
  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
995
1020
 
996
1021
  const SWIPE_THRESHOLD = 40;
997
- const Default$8 = {
1022
+ const Default$9 = {
998
1023
  interval: 5000,
999
1024
  keyboard: true,
1000
1025
  slide: false,
@@ -1002,7 +1027,7 @@
1002
1027
  wrap: true,
1003
1028
  touch: true
1004
1029
  };
1005
- const DefaultType$8 = {
1030
+ const DefaultType$9 = {
1006
1031
  interval: '(number|boolean)',
1007
1032
  keyboard: 'boolean',
1008
1033
  slide: '(boolean|string)',
@@ -1073,7 +1098,7 @@
1073
1098
 
1074
1099
 
1075
1100
  static get Default() {
1076
- return Default$8;
1101
+ return Default$9;
1077
1102
  }
1078
1103
 
1079
1104
  static get DATA_KEY() {
@@ -1158,7 +1183,6 @@
1158
1183
  }
1159
1184
 
1160
1185
  dispose() {
1161
- EventHandler.off(this._element, EVENT_KEY$9);
1162
1186
  this._items = null;
1163
1187
  this._config = null;
1164
1188
  this._interval = null;
@@ -1171,10 +1195,10 @@
1171
1195
 
1172
1196
 
1173
1197
  _getConfig(config) {
1174
- config = { ...Default$8,
1198
+ config = { ...Default$9,
1175
1199
  ...config
1176
1200
  };
1177
- typeCheckConfig(NAME$9, config, DefaultType$8);
1201
+ typeCheckConfig(NAME$a, config, DefaultType$9);
1178
1202
  return config;
1179
1203
  }
1180
1204
 
@@ -1273,11 +1297,11 @@
1273
1297
  if (event.key === ARROW_LEFT_KEY) {
1274
1298
  event.preventDefault();
1275
1299
 
1276
- this._slide(DIRECTION_LEFT);
1300
+ this._slide(DIRECTION_RIGHT);
1277
1301
  } else if (event.key === ARROW_RIGHT_KEY) {
1278
1302
  event.preventDefault();
1279
1303
 
1280
- this._slide(DIRECTION_RIGHT);
1304
+ this._slide(DIRECTION_LEFT);
1281
1305
  }
1282
1306
  }
1283
1307
 
@@ -1439,10 +1463,10 @@
1439
1463
  }
1440
1464
 
1441
1465
  if (isRTL()) {
1442
- return direction === DIRECTION_RIGHT ? ORDER_PREV : ORDER_NEXT;
1466
+ return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
1443
1467
  }
1444
1468
 
1445
- return direction === DIRECTION_RIGHT ? ORDER_NEXT : ORDER_PREV;
1469
+ return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
1446
1470
  }
1447
1471
 
1448
1472
  _orderToDirection(order) {
@@ -1451,16 +1475,16 @@
1451
1475
  }
1452
1476
 
1453
1477
  if (isRTL()) {
1454
- return order === ORDER_NEXT ? DIRECTION_LEFT : DIRECTION_RIGHT;
1478
+ return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
1455
1479
  }
1456
1480
 
1457
- return order === ORDER_NEXT ? DIRECTION_RIGHT : DIRECTION_LEFT;
1481
+ return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
1458
1482
  } // Static
1459
1483
 
1460
1484
 
1461
1485
  static carouselInterface(element, config) {
1462
1486
  let data = Data.get(element, DATA_KEY$9);
1463
- let _config = { ...Default$8,
1487
+ let _config = { ...Default$9,
1464
1488
  ...Manipulator.getDataAttributes(element)
1465
1489
  };
1466
1490
 
@@ -1544,11 +1568,11 @@
1544
1568
  * add .Carousel to jQuery only if jQuery is present
1545
1569
  */
1546
1570
 
1547
- defineJQueryPlugin(NAME$9, Carousel);
1571
+ defineJQueryPlugin(NAME$a, Carousel);
1548
1572
 
1549
1573
  /**
1550
1574
  * --------------------------------------------------------------------------
1551
- * Bootstrap (v5.0.0-beta3): collapse.js
1575
+ * Bootstrap (v5.0.0): collapse.js
1552
1576
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1553
1577
  * --------------------------------------------------------------------------
1554
1578
  */
@@ -1558,15 +1582,15 @@
1558
1582
  * ------------------------------------------------------------------------
1559
1583
  */
1560
1584
 
1561
- const NAME$8 = 'collapse';
1585
+ const NAME$9 = 'collapse';
1562
1586
  const DATA_KEY$8 = 'bs.collapse';
1563
1587
  const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1564
1588
  const DATA_API_KEY$5 = '.data-api';
1565
- const Default$7 = {
1589
+ const Default$8 = {
1566
1590
  toggle: true,
1567
1591
  parent: ''
1568
1592
  };
1569
- const DefaultType$7 = {
1593
+ const DefaultType$8 = {
1570
1594
  toggle: 'boolean',
1571
1595
  parent: '(string|element)'
1572
1596
  };
@@ -1575,7 +1599,7 @@
1575
1599
  const EVENT_HIDE$5 = `hide${EVENT_KEY$8}`;
1576
1600
  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$8}`;
1577
1601
  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
1578
- const CLASS_NAME_SHOW$7 = 'show';
1602
+ const CLASS_NAME_SHOW$8 = 'show';
1579
1603
  const CLASS_NAME_COLLAPSE = 'collapse';
1580
1604
  const CLASS_NAME_COLLAPSING = 'collapsing';
1581
1605
  const CLASS_NAME_COLLAPSED = 'collapsed';
@@ -1622,7 +1646,7 @@
1622
1646
 
1623
1647
 
1624
1648
  static get Default() {
1625
- return Default$7;
1649
+ return Default$8;
1626
1650
  }
1627
1651
 
1628
1652
  static get DATA_KEY() {
@@ -1631,7 +1655,7 @@
1631
1655
 
1632
1656
 
1633
1657
  toggle() {
1634
- if (this._element.classList.contains(CLASS_NAME_SHOW$7)) {
1658
+ if (this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1635
1659
  this.hide();
1636
1660
  } else {
1637
1661
  this.show();
@@ -1639,7 +1663,7 @@
1639
1663
  }
1640
1664
 
1641
1665
  show() {
1642
- if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW$7)) {
1666
+ if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1643
1667
  return;
1644
1668
  }
1645
1669
 
@@ -1709,7 +1733,7 @@
1709
1733
  const complete = () => {
1710
1734
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
1711
1735
 
1712
- this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1736
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8);
1713
1737
 
1714
1738
  this._element.style[dimension] = '';
1715
1739
  this.setTransitioning(false);
@@ -1725,7 +1749,7 @@
1725
1749
  }
1726
1750
 
1727
1751
  hide() {
1728
- if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW$7)) {
1752
+ if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1729
1753
  return;
1730
1754
  }
1731
1755
 
@@ -1742,7 +1766,7 @@
1742
1766
 
1743
1767
  this._element.classList.add(CLASS_NAME_COLLAPSING);
1744
1768
 
1745
- this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1769
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8);
1746
1770
 
1747
1771
  const triggerArrayLength = this._triggerArray.length;
1748
1772
 
@@ -1751,7 +1775,7 @@
1751
1775
  const trigger = this._triggerArray[i];
1752
1776
  const elem = getElementFromSelector(trigger);
1753
1777
 
1754
- if (elem && !elem.classList.contains(CLASS_NAME_SHOW$7)) {
1778
+ if (elem && !elem.classList.contains(CLASS_NAME_SHOW$8)) {
1755
1779
  trigger.classList.add(CLASS_NAME_COLLAPSED);
1756
1780
  trigger.setAttribute('aria-expanded', false);
1757
1781
  }
@@ -1790,12 +1814,12 @@
1790
1814
 
1791
1815
 
1792
1816
  _getConfig(config) {
1793
- config = { ...Default$7,
1817
+ config = { ...Default$8,
1794
1818
  ...config
1795
1819
  };
1796
1820
  config.toggle = Boolean(config.toggle); // Coerce string values
1797
1821
 
1798
- typeCheckConfig(NAME$8, config, DefaultType$7);
1822
+ typeCheckConfig(NAME$9, config, DefaultType$8);
1799
1823
  return config;
1800
1824
  }
1801
1825
 
@@ -1831,7 +1855,7 @@
1831
1855
  return;
1832
1856
  }
1833
1857
 
1834
- const isOpen = element.classList.contains(CLASS_NAME_SHOW$7);
1858
+ const isOpen = element.classList.contains(CLASS_NAME_SHOW$8);
1835
1859
  triggerArray.forEach(elem => {
1836
1860
  if (isOpen) {
1837
1861
  elem.classList.remove(CLASS_NAME_COLLAPSED);
@@ -1846,7 +1870,7 @@
1846
1870
 
1847
1871
  static collapseInterface(element, config) {
1848
1872
  let data = Data.get(element, DATA_KEY$8);
1849
- const _config = { ...Default$7,
1873
+ const _config = { ...Default$8,
1850
1874
  ...Manipulator.getDataAttributes(element),
1851
1875
  ...(typeof config === 'object' && config ? config : {})
1852
1876
  };
@@ -1917,11 +1941,11 @@
1917
1941
  * add .Collapse to jQuery only if jQuery is present
1918
1942
  */
1919
1943
 
1920
- defineJQueryPlugin(NAME$8, Collapse);
1944
+ defineJQueryPlugin(NAME$9, Collapse);
1921
1945
 
1922
1946
  /**
1923
1947
  * --------------------------------------------------------------------------
1924
- * Bootstrap (v5.0.0-beta3): dropdown.js
1948
+ * Bootstrap (v5.0.0): dropdown.js
1925
1949
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1926
1950
  * --------------------------------------------------------------------------
1927
1951
  */
@@ -1931,7 +1955,7 @@
1931
1955
  * ------------------------------------------------------------------------
1932
1956
  */
1933
1957
 
1934
- const NAME$7 = 'dropdown';
1958
+ const NAME$8 = 'dropdown';
1935
1959
  const DATA_KEY$7 = 'bs.dropdown';
1936
1960
  const EVENT_KEY$7 = `.${DATA_KEY$7}`;
1937
1961
  const DATA_API_KEY$4 = '.data-api';
@@ -1951,8 +1975,7 @@
1951
1975
  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
1952
1976
  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$7}${DATA_API_KEY$4}`;
1953
1977
  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$7}${DATA_API_KEY$4}`;
1954
- const CLASS_NAME_DISABLED = 'disabled';
1955
- const CLASS_NAME_SHOW$6 = 'show';
1978
+ const CLASS_NAME_SHOW$7 = 'show';
1956
1979
  const CLASS_NAME_DROPUP = 'dropup';
1957
1980
  const CLASS_NAME_DROPEND = 'dropend';
1958
1981
  const CLASS_NAME_DROPSTART = 'dropstart';
@@ -1967,19 +1990,21 @@
1967
1990
  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
1968
1991
  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
1969
1992
  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
1970
- const Default$6 = {
1993
+ const Default$7 = {
1971
1994
  offset: [0, 2],
1972
1995
  boundary: 'clippingParents',
1973
1996
  reference: 'toggle',
1974
1997
  display: 'dynamic',
1975
- popperConfig: null
1998
+ popperConfig: null,
1999
+ autoClose: true
1976
2000
  };
1977
- const DefaultType$6 = {
2001
+ const DefaultType$7 = {
1978
2002
  offset: '(array|string|function)',
1979
2003
  boundary: '(string|element)',
1980
2004
  reference: '(string|element|object)',
1981
2005
  display: 'string',
1982
- popperConfig: '(null|object|function)'
2006
+ popperConfig: '(null|object|function)',
2007
+ autoClose: '(boolean|string)'
1983
2008
  };
1984
2009
  /**
1985
2010
  * ------------------------------------------------------------------------
@@ -2000,11 +2025,11 @@
2000
2025
 
2001
2026
 
2002
2027
  static get Default() {
2003
- return Default$6;
2028
+ return Default$7;
2004
2029
  }
2005
2030
 
2006
2031
  static get DefaultType() {
2007
- return DefaultType$6;
2032
+ return DefaultType$7;
2008
2033
  }
2009
2034
 
2010
2035
  static get DATA_KEY() {
@@ -2013,15 +2038,14 @@
2013
2038
 
2014
2039
 
2015
2040
  toggle() {
2016
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
2041
+ if (isDisabled(this._element)) {
2017
2042
  return;
2018
2043
  }
2019
2044
 
2020
- const isActive = this._element.classList.contains(CLASS_NAME_SHOW$6);
2021
-
2022
- Dropdown.clearMenus();
2045
+ const isActive = this._element.classList.contains(CLASS_NAME_SHOW$7);
2023
2046
 
2024
2047
  if (isActive) {
2048
+ this.hide();
2025
2049
  return;
2026
2050
  }
2027
2051
 
@@ -2029,7 +2053,7 @@
2029
2053
  }
2030
2054
 
2031
2055
  show() {
2032
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW$6)) {
2056
+ if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW$7)) {
2033
2057
  return;
2034
2058
  }
2035
2059
 
@@ -2080,48 +2104,33 @@
2080
2104
 
2081
2105
 
2082
2106
  if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
2083
- [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', null, noop()));
2107
+ [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));
2084
2108
  }
2085
2109
 
2086
2110
  this._element.focus();
2087
2111
 
2088
2112
  this._element.setAttribute('aria-expanded', true);
2089
2113
 
2090
- this._menu.classList.toggle(CLASS_NAME_SHOW$6);
2114
+ this._menu.classList.toggle(CLASS_NAME_SHOW$7);
2091
2115
 
2092
- this._element.classList.toggle(CLASS_NAME_SHOW$6);
2116
+ this._element.classList.toggle(CLASS_NAME_SHOW$7);
2093
2117
 
2094
2118
  EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
2095
2119
  }
2096
2120
 
2097
2121
  hide() {
2098
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW$6)) {
2122
+ if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW$7)) {
2099
2123
  return;
2100
2124
  }
2101
2125
 
2102
2126
  const relatedTarget = {
2103
2127
  relatedTarget: this._element
2104
2128
  };
2105
- const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
2106
-
2107
- if (hideEvent.defaultPrevented) {
2108
- return;
2109
- }
2110
-
2111
- if (this._popper) {
2112
- this._popper.destroy();
2113
- }
2114
-
2115
- this._menu.classList.toggle(CLASS_NAME_SHOW$6);
2116
-
2117
- this._element.classList.toggle(CLASS_NAME_SHOW$6);
2118
2129
 
2119
- Manipulator.removeDataAttribute(this._menu, 'popper');
2120
- EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);
2130
+ this._completeHide(relatedTarget);
2121
2131
  }
2122
2132
 
2123
2133
  dispose() {
2124
- EventHandler.off(this._element, EVENT_KEY$7);
2125
2134
  this._menu = null;
2126
2135
 
2127
2136
  if (this._popper) {
@@ -2149,16 +2158,43 @@
2149
2158
  });
2150
2159
  }
2151
2160
 
2161
+ _completeHide(relatedTarget) {
2162
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
2163
+
2164
+ if (hideEvent.defaultPrevented) {
2165
+ return;
2166
+ } // If this is a touch-enabled device we remove the extra
2167
+ // empty mouseover listeners we added for iOS support
2168
+
2169
+
2170
+ if ('ontouchstart' in document.documentElement) {
2171
+ [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));
2172
+ }
2173
+
2174
+ if (this._popper) {
2175
+ this._popper.destroy();
2176
+ }
2177
+
2178
+ this._menu.classList.remove(CLASS_NAME_SHOW$7);
2179
+
2180
+ this._element.classList.remove(CLASS_NAME_SHOW$7);
2181
+
2182
+ this._element.setAttribute('aria-expanded', 'false');
2183
+
2184
+ Manipulator.removeDataAttribute(this._menu, 'popper');
2185
+ EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);
2186
+ }
2187
+
2152
2188
  _getConfig(config) {
2153
2189
  config = { ...this.constructor.Default,
2154
2190
  ...Manipulator.getDataAttributes(this._element),
2155
2191
  ...config
2156
2192
  };
2157
- typeCheckConfig(NAME$7, config, this.constructor.DefaultType);
2193
+ typeCheckConfig(NAME$8, config, this.constructor.DefaultType);
2158
2194
 
2159
2195
  if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
2160
2196
  // Popper virtual elements require a getBoundingClientRect method
2161
- throw new TypeError(`${NAME$7.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2197
+ throw new TypeError(`${NAME$8.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2162
2198
  }
2163
2199
 
2164
2200
  return config;
@@ -2235,6 +2271,29 @@
2235
2271
  return { ...defaultBsPopperConfig,
2236
2272
  ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
2237
2273
  };
2274
+ }
2275
+
2276
+ _selectMenuItem(event) {
2277
+ const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
2278
+
2279
+ if (!items.length) {
2280
+ return;
2281
+ }
2282
+
2283
+ let index = items.indexOf(event.target); // Up
2284
+
2285
+ if (event.key === ARROW_UP_KEY && index > 0) {
2286
+ index--;
2287
+ } // Down
2288
+
2289
+
2290
+ if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
2291
+ index++;
2292
+ } // index is -1 if the first keydown is an ArrowUp
2293
+
2294
+
2295
+ index = index === -1 ? 0 : index;
2296
+ items[index].focus();
2238
2297
  } // Static
2239
2298
 
2240
2299
 
@@ -2268,7 +2327,7 @@
2268
2327
  return;
2269
2328
  }
2270
2329
 
2271
- if (/input|select|textarea|form/i.test(event.target.tagName)) {
2330
+ if (/input|select|option|textarea|form/i.test(event.target.tagName)) {
2272
2331
  return;
2273
2332
  }
2274
2333
  }
@@ -2277,58 +2336,38 @@
2277
2336
 
2278
2337
  for (let i = 0, len = toggles.length; i < len; i++) {
2279
2338
  const context = Data.get(toggles[i], DATA_KEY$7);
2280
- const relatedTarget = {
2281
- relatedTarget: toggles[i]
2282
- };
2283
2339
 
2284
- if (event && event.type === 'click') {
2285
- relatedTarget.clickEvent = event;
2286
- }
2287
-
2288
- if (!context) {
2340
+ if (!context || context._config.autoClose === false) {
2289
2341
  continue;
2290
2342
  }
2291
2343
 
2292
- const dropdownMenu = context._menu;
2293
-
2294
- if (!toggles[i].classList.contains(CLASS_NAME_SHOW$6)) {
2344
+ if (!context._element.classList.contains(CLASS_NAME_SHOW$7)) {
2295
2345
  continue;
2296
2346
  }
2297
2347
 
2348
+ const relatedTarget = {
2349
+ relatedTarget: context._element
2350
+ };
2351
+
2298
2352
  if (event) {
2299
- // Don't close the menu if the clicked element or one of its parents is the dropdown button
2300
- if ([context._element].some(element => event.composedPath().includes(element))) {
2353
+ const composedPath = event.composedPath();
2354
+ const isMenuTarget = composedPath.includes(context._menu);
2355
+
2356
+ if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
2301
2357
  continue;
2302
2358
  } // Tab navigation through the dropdown menu shouldn't close the menu
2303
2359
 
2304
2360
 
2305
- if (event.type === 'keyup' && event.key === TAB_KEY && dropdownMenu.contains(event.target)) {
2361
+ if (event.type === 'keyup' && event.key === TAB_KEY && context._menu.contains(event.target)) {
2306
2362
  continue;
2307
2363
  }
2308
- }
2309
-
2310
- const hideEvent = EventHandler.trigger(toggles[i], EVENT_HIDE$4, relatedTarget);
2311
-
2312
- if (hideEvent.defaultPrevented) {
2313
- continue;
2314
- } // If this is a touch-enabled device we remove the extra
2315
- // empty mouseover listeners we added for iOS support
2316
-
2317
-
2318
- if ('ontouchstart' in document.documentElement) {
2319
- [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', null, noop()));
2320
- }
2321
-
2322
- toggles[i].setAttribute('aria-expanded', 'false');
2323
2364
 
2324
- if (context._popper) {
2325
- context._popper.destroy();
2365
+ if (event.type === 'click') {
2366
+ relatedTarget.clickEvent = event;
2367
+ }
2326
2368
  }
2327
2369
 
2328
- dropdownMenu.classList.remove(CLASS_NAME_SHOW$6);
2329
- toggles[i].classList.remove(CLASS_NAME_SHOW$6);
2330
- Manipulator.removeDataAttribute(dropdownMenu, 'popper');
2331
- EventHandler.trigger(toggles[i], EVENT_HIDDEN$4, relatedTarget);
2370
+ context._completeHide(relatedTarget);
2332
2371
  }
2333
2372
  }
2334
2373
 
@@ -2348,26 +2387,29 @@
2348
2387
  return;
2349
2388
  }
2350
2389
 
2390
+ const isActive = this.classList.contains(CLASS_NAME_SHOW$7);
2391
+
2392
+ if (!isActive && event.key === ESCAPE_KEY$2) {
2393
+ return;
2394
+ }
2395
+
2351
2396
  event.preventDefault();
2352
2397
  event.stopPropagation();
2353
2398
 
2354
- if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
2399
+ if (isDisabled(this)) {
2355
2400
  return;
2356
2401
  }
2357
2402
 
2358
- const parent = Dropdown.getParentFromElement(this);
2359
- const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
2403
+ const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2360
2404
 
2361
2405
  if (event.key === ESCAPE_KEY$2) {
2362
- const button = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2363
- button.focus();
2406
+ getToggleButton().focus();
2364
2407
  Dropdown.clearMenus();
2365
2408
  return;
2366
2409
  }
2367
2410
 
2368
2411
  if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
2369
- const button = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2370
- button.click();
2412
+ getToggleButton().click();
2371
2413
  return;
2372
2414
  }
2373
2415
 
@@ -2376,26 +2418,7 @@
2376
2418
  return;
2377
2419
  }
2378
2420
 
2379
- const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible);
2380
-
2381
- if (!items.length) {
2382
- return;
2383
- }
2384
-
2385
- let index = items.indexOf(event.target); // Up
2386
-
2387
- if (event.key === ARROW_UP_KEY && index > 0) {
2388
- index--;
2389
- } // Down
2390
-
2391
-
2392
- if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
2393
- index++;
2394
- } // index is -1 if the first keydown is an ArrowUp
2395
-
2396
-
2397
- index = index === -1 ? 0 : index;
2398
- items[index].focus();
2421
+ Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
2399
2422
  }
2400
2423
 
2401
2424
  }
@@ -2421,11 +2444,213 @@
2421
2444
  * add .Dropdown to jQuery only if jQuery is present
2422
2445
  */
2423
2446
 
2424
- defineJQueryPlugin(NAME$7, Dropdown);
2447
+ defineJQueryPlugin(NAME$8, Dropdown);
2425
2448
 
2426
2449
  /**
2427
2450
  * --------------------------------------------------------------------------
2428
- * Bootstrap (v5.0.0-beta3): modal.js
2451
+ * Bootstrap (v5.0.0): util/scrollBar.js
2452
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2453
+ * --------------------------------------------------------------------------
2454
+ */
2455
+ const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2456
+ const SELECTOR_STICKY_CONTENT = '.sticky-top';
2457
+
2458
+ const getWidth = () => {
2459
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
2460
+ const documentWidth = document.documentElement.clientWidth;
2461
+ return Math.abs(window.innerWidth - documentWidth);
2462
+ };
2463
+
2464
+ const hide = (width = getWidth()) => {
2465
+ _disableOverFlow(); // give padding to element to balances the hidden scrollbar width
2466
+
2467
+
2468
+ _setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements, to keep shown fullwidth
2469
+
2470
+
2471
+ _setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
2472
+
2473
+ _setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
2474
+ };
2475
+
2476
+ const _disableOverFlow = () => {
2477
+ const actualValue = document.body.style.overflow;
2478
+
2479
+ if (actualValue) {
2480
+ Manipulator.setDataAttribute(document.body, 'overflow', actualValue);
2481
+ }
2482
+
2483
+ document.body.style.overflow = 'hidden';
2484
+ };
2485
+
2486
+ const _setElementAttributes = (selector, styleProp, callback) => {
2487
+ const scrollbarWidth = getWidth();
2488
+ SelectorEngine.find(selector).forEach(element => {
2489
+ if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
2490
+ return;
2491
+ }
2492
+
2493
+ const actualValue = element.style[styleProp];
2494
+ const calculatedValue = window.getComputedStyle(element)[styleProp];
2495
+ Manipulator.setDataAttribute(element, styleProp, actualValue);
2496
+ element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
2497
+ });
2498
+ };
2499
+
2500
+ const reset = () => {
2501
+ _resetElementAttributes('body', 'overflow');
2502
+
2503
+ _resetElementAttributes('body', 'paddingRight');
2504
+
2505
+ _resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
2506
+
2507
+ _resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
2508
+ };
2509
+
2510
+ const _resetElementAttributes = (selector, styleProp) => {
2511
+ SelectorEngine.find(selector).forEach(element => {
2512
+ const value = Manipulator.getDataAttribute(element, styleProp);
2513
+
2514
+ if (typeof value === 'undefined') {
2515
+ element.style.removeProperty(styleProp);
2516
+ } else {
2517
+ Manipulator.removeDataAttribute(element, styleProp);
2518
+ element.style[styleProp] = value;
2519
+ }
2520
+ });
2521
+ };
2522
+
2523
+ /**
2524
+ * --------------------------------------------------------------------------
2525
+ * Bootstrap (v5.0.0): util/backdrop.js
2526
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2527
+ * --------------------------------------------------------------------------
2528
+ */
2529
+ const Default$6 = {
2530
+ isVisible: true,
2531
+ // if false, we use the backdrop helper without adding any element to the dom
2532
+ isAnimated: false,
2533
+ rootElement: document.body,
2534
+ // give the choice to place backdrop under different elements
2535
+ clickCallback: null
2536
+ };
2537
+ const DefaultType$6 = {
2538
+ isVisible: 'boolean',
2539
+ isAnimated: 'boolean',
2540
+ rootElement: 'element',
2541
+ clickCallback: '(function|null)'
2542
+ };
2543
+ const NAME$7 = 'backdrop';
2544
+ const CLASS_NAME_BACKDROP = 'modal-backdrop';
2545
+ const CLASS_NAME_FADE$5 = 'fade';
2546
+ const CLASS_NAME_SHOW$6 = 'show';
2547
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$7}`;
2548
+
2549
+ class Backdrop {
2550
+ constructor(config) {
2551
+ this._config = this._getConfig(config);
2552
+ this._isAppended = false;
2553
+ this._element = null;
2554
+ }
2555
+
2556
+ show(callback) {
2557
+ if (!this._config.isVisible) {
2558
+ execute(callback);
2559
+ return;
2560
+ }
2561
+
2562
+ this._append();
2563
+
2564
+ if (this._config.isAnimated) {
2565
+ reflow(this._getElement());
2566
+ }
2567
+
2568
+ this._getElement().classList.add(CLASS_NAME_SHOW$6);
2569
+
2570
+ this._emulateAnimation(() => {
2571
+ execute(callback);
2572
+ });
2573
+ }
2574
+
2575
+ hide(callback) {
2576
+ if (!this._config.isVisible) {
2577
+ execute(callback);
2578
+ return;
2579
+ }
2580
+
2581
+ this._getElement().classList.remove(CLASS_NAME_SHOW$6);
2582
+
2583
+ this._emulateAnimation(() => {
2584
+ this.dispose();
2585
+ execute(callback);
2586
+ });
2587
+ } // Private
2588
+
2589
+
2590
+ _getElement() {
2591
+ if (!this._element) {
2592
+ const backdrop = document.createElement('div');
2593
+ backdrop.className = CLASS_NAME_BACKDROP;
2594
+
2595
+ if (this._config.isAnimated) {
2596
+ backdrop.classList.add(CLASS_NAME_FADE$5);
2597
+ }
2598
+
2599
+ this._element = backdrop;
2600
+ }
2601
+
2602
+ return this._element;
2603
+ }
2604
+
2605
+ _getConfig(config) {
2606
+ config = { ...Default$6,
2607
+ ...(typeof config === 'object' ? config : {})
2608
+ };
2609
+ typeCheckConfig(NAME$7, config, DefaultType$6);
2610
+ return config;
2611
+ }
2612
+
2613
+ _append() {
2614
+ if (this._isAppended) {
2615
+ return;
2616
+ }
2617
+
2618
+ this._config.rootElement.appendChild(this._getElement());
2619
+
2620
+ EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
2621
+ execute(this._config.clickCallback);
2622
+ });
2623
+ this._isAppended = true;
2624
+ }
2625
+
2626
+ dispose() {
2627
+ if (!this._isAppended) {
2628
+ return;
2629
+ }
2630
+
2631
+ EventHandler.off(this._element, EVENT_MOUSEDOWN);
2632
+
2633
+ this._getElement().parentNode.removeChild(this._element);
2634
+
2635
+ this._isAppended = false;
2636
+ }
2637
+
2638
+ _emulateAnimation(callback) {
2639
+ if (!this._config.isAnimated) {
2640
+ execute(callback);
2641
+ return;
2642
+ }
2643
+
2644
+ const backdropTransitionDuration = getTransitionDurationFromElement(this._getElement());
2645
+ EventHandler.one(this._getElement(), 'transitionend', () => execute(callback));
2646
+ emulateTransitionEnd(this._getElement(), backdropTransitionDuration);
2647
+ }
2648
+
2649
+ }
2650
+
2651
+ /**
2652
+ * --------------------------------------------------------------------------
2653
+ * Bootstrap (v5.0.0): modal.js
2429
2654
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2430
2655
  * --------------------------------------------------------------------------
2431
2656
  */
@@ -2458,12 +2683,10 @@
2458
2683
  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$6}`;
2459
2684
  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;
2460
2685
  const EVENT_CLICK_DISMISS$2 = `click.dismiss${EVENT_KEY$6}`;
2461
- const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$6}`;
2686
+ const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
2462
2687
  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
2463
2688
  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
2464
2689
  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
2465
- const CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure';
2466
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
2467
2690
  const CLASS_NAME_OPEN = 'modal-open';
2468
2691
  const CLASS_NAME_FADE$4 = 'fade';
2469
2692
  const CLASS_NAME_SHOW$5 = 'show';
@@ -2472,8 +2695,6 @@
2472
2695
  const SELECTOR_MODAL_BODY = '.modal-body';
2473
2696
  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
2474
2697
  const SELECTOR_DATA_DISMISS$2 = '[data-bs-dismiss="modal"]';
2475
- const SELECTOR_FIXED_CONTENT$1 = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2476
- const SELECTOR_STICKY_CONTENT$1 = '.sticky-top';
2477
2698
  /**
2478
2699
  * ------------------------------------------------------------------------
2479
2700
  * Class Definition
@@ -2485,12 +2706,10 @@
2485
2706
  super(element);
2486
2707
  this._config = this._getConfig(config);
2487
2708
  this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
2488
- this._backdrop = null;
2709
+ this._backdrop = this._initializeBackDrop();
2489
2710
  this._isShown = false;
2490
- this._isBodyOverflowing = false;
2491
2711
  this._ignoreBackdropClick = false;
2492
2712
  this._isTransitioning = false;
2493
- this._scrollbarWidth = 0;
2494
2713
  } // Getters
2495
2714
 
2496
2715
 
@@ -2525,10 +2744,8 @@
2525
2744
  }
2526
2745
 
2527
2746
  this._isShown = true;
2528
-
2529
- this._checkScrollbar();
2530
-
2531
- this._setScrollbar();
2747
+ hide();
2748
+ document.body.classList.add(CLASS_NAME_OPEN);
2532
2749
 
2533
2750
  this._adjustDialog();
2534
2751
 
@@ -2592,7 +2809,7 @@
2592
2809
  }
2593
2810
 
2594
2811
  dispose() {
2595
- [window, this._element, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));
2812
+ [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));
2596
2813
  super.dispose();
2597
2814
  /**
2598
2815
  * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
@@ -2603,12 +2820,13 @@
2603
2820
  EventHandler.off(document, EVENT_FOCUSIN$1);
2604
2821
  this._config = null;
2605
2822
  this._dialog = null;
2823
+
2824
+ this._backdrop.dispose();
2825
+
2606
2826
  this._backdrop = null;
2607
2827
  this._isShown = null;
2608
- this._isBodyOverflowing = null;
2609
2828
  this._ignoreBackdropClick = null;
2610
2829
  this._isTransitioning = null;
2611
- this._scrollbarWidth = null;
2612
2830
  }
2613
2831
 
2614
2832
  handleUpdate() {
@@ -2616,8 +2834,17 @@
2616
2834
  } // Private
2617
2835
 
2618
2836
 
2837
+ _initializeBackDrop() {
2838
+ return new Backdrop({
2839
+ isVisible: Boolean(this._config.backdrop),
2840
+ // 'static' option will be translated to true, and booleans will keep their value
2841
+ isAnimated: this._isAnimated()
2842
+ });
2843
+ }
2844
+
2619
2845
  _getConfig(config) {
2620
2846
  config = { ...Default$5,
2847
+ ...Manipulator.getDataAttributes(this._element),
2621
2848
  ...config
2622
2849
  };
2623
2850
  typeCheckConfig(NAME$6, config, DefaultType$5);
@@ -2690,7 +2917,7 @@
2690
2917
 
2691
2918
  _setEscapeEvent() {
2692
2919
  if (this._isShown) {
2693
- EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
2920
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
2694
2921
  if (this._config.keyboard && event.key === ESCAPE_KEY$1) {
2695
2922
  event.preventDefault();
2696
2923
  this.hide();
@@ -2699,7 +2926,7 @@
2699
2926
  }
2700
2927
  });
2701
2928
  } else {
2702
- EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS);
2929
+ EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);
2703
2930
  }
2704
2931
  }
2705
2932
 
@@ -2722,85 +2949,35 @@
2722
2949
 
2723
2950
  this._isTransitioning = false;
2724
2951
 
2725
- this._showBackdrop(() => {
2952
+ this._backdrop.hide(() => {
2726
2953
  document.body.classList.remove(CLASS_NAME_OPEN);
2727
2954
 
2728
2955
  this._resetAdjustments();
2729
2956
 
2730
- this._resetScrollbar();
2731
-
2957
+ reset();
2732
2958
  EventHandler.trigger(this._element, EVENT_HIDDEN$3);
2733
2959
  });
2734
2960
  }
2735
2961
 
2736
- _removeBackdrop() {
2737
- this._backdrop.parentNode.removeChild(this._backdrop);
2738
-
2739
- this._backdrop = null;
2740
- }
2741
-
2742
2962
  _showBackdrop(callback) {
2743
- const isAnimated = this._isAnimated();
2744
-
2745
- if (this._isShown && this._config.backdrop) {
2746
- this._backdrop = document.createElement('div');
2747
- this._backdrop.className = CLASS_NAME_BACKDROP;
2748
-
2749
- if (isAnimated) {
2750
- this._backdrop.classList.add(CLASS_NAME_FADE$4);
2751
- }
2752
-
2753
- document.body.appendChild(this._backdrop);
2754
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, event => {
2755
- if (this._ignoreBackdropClick) {
2756
- this._ignoreBackdropClick = false;
2757
- return;
2758
- }
2759
-
2760
- if (event.target !== event.currentTarget) {
2761
- return;
2762
- }
2763
-
2764
- if (this._config.backdrop === 'static') {
2765
- this._triggerBackdropTransition();
2766
- } else {
2767
- this.hide();
2768
- }
2769
- });
2770
-
2771
- if (isAnimated) {
2772
- reflow(this._backdrop);
2963
+ EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, event => {
2964
+ if (this._ignoreBackdropClick) {
2965
+ this._ignoreBackdropClick = false;
2966
+ return;
2773
2967
  }
2774
2968
 
2775
- this._backdrop.classList.add(CLASS_NAME_SHOW$5);
2776
-
2777
- if (!isAnimated) {
2778
- callback();
2969
+ if (event.target !== event.currentTarget) {
2779
2970
  return;
2780
2971
  }
2781
2972
 
2782
- const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop);
2783
- EventHandler.one(this._backdrop, 'transitionend', callback);
2784
- emulateTransitionEnd(this._backdrop, backdropTransitionDuration);
2785
- } else if (!this._isShown && this._backdrop) {
2786
- this._backdrop.classList.remove(CLASS_NAME_SHOW$5);
2787
-
2788
- const callbackRemove = () => {
2789
- this._removeBackdrop();
2790
-
2791
- callback();
2792
- };
2793
-
2794
- if (isAnimated) {
2795
- const backdropTransitionDuration = getTransitionDurationFromElement(this._backdrop);
2796
- EventHandler.one(this._backdrop, 'transitionend', callbackRemove);
2797
- emulateTransitionEnd(this._backdrop, backdropTransitionDuration);
2798
- } else {
2799
- callbackRemove();
2973
+ if (this._config.backdrop === true) {
2974
+ this.hide();
2975
+ } else if (this._config.backdrop === 'static') {
2976
+ this._triggerBackdropTransition();
2800
2977
  }
2801
- } else {
2802
- callback();
2803
- }
2978
+ });
2979
+
2980
+ this._backdrop.show(callback);
2804
2981
  }
2805
2982
 
2806
2983
  _isAnimated() {
@@ -2844,103 +3021,37 @@
2844
3021
 
2845
3022
  _adjustDialog() {
2846
3023
  const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
3024
+ const scrollbarWidth = getWidth();
3025
+ const isBodyOverflowing = scrollbarWidth > 0;
2847
3026
 
2848
- if (!this._isBodyOverflowing && isModalOverflowing && !isRTL() || this._isBodyOverflowing && !isModalOverflowing && isRTL()) {
2849
- this._element.style.paddingLeft = `${this._scrollbarWidth}px`;
3027
+ if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
3028
+ this._element.style.paddingLeft = `${scrollbarWidth}px`;
2850
3029
  }
2851
3030
 
2852
- if (this._isBodyOverflowing && !isModalOverflowing && !isRTL() || !this._isBodyOverflowing && isModalOverflowing && isRTL()) {
2853
- this._element.style.paddingRight = `${this._scrollbarWidth}px`;
3031
+ if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
3032
+ this._element.style.paddingRight = `${scrollbarWidth}px`;
2854
3033
  }
2855
3034
  }
2856
3035
 
2857
3036
  _resetAdjustments() {
2858
3037
  this._element.style.paddingLeft = '';
2859
3038
  this._element.style.paddingRight = '';
2860
- }
2861
-
2862
- _checkScrollbar() {
2863
- const rect = document.body.getBoundingClientRect();
2864
- this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth;
2865
- this._scrollbarWidth = this._getScrollbarWidth();
2866
- }
2867
-
2868
- _setScrollbar() {
2869
- if (this._isBodyOverflowing) {
2870
- this._setElementAttributes(SELECTOR_FIXED_CONTENT$1, 'paddingRight', calculatedValue => calculatedValue + this._scrollbarWidth);
2871
-
2872
- this._setElementAttributes(SELECTOR_STICKY_CONTENT$1, 'marginRight', calculatedValue => calculatedValue - this._scrollbarWidth);
2873
-
2874
- this._setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + this._scrollbarWidth);
2875
- }
2876
-
2877
- document.body.classList.add(CLASS_NAME_OPEN);
2878
- }
2879
-
2880
- _setElementAttributes(selector, styleProp, callback) {
2881
- SelectorEngine.find(selector).forEach(element => {
2882
- if (element !== document.body && window.innerWidth > element.clientWidth + this._scrollbarWidth) {
2883
- return;
2884
- }
2885
-
2886
- const actualValue = element.style[styleProp];
2887
- const calculatedValue = window.getComputedStyle(element)[styleProp];
2888
- Manipulator.setDataAttribute(element, styleProp, actualValue);
2889
- element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px';
2890
- });
2891
- }
2892
-
2893
- _resetScrollbar() {
2894
- this._resetElementAttributes(SELECTOR_FIXED_CONTENT$1, 'paddingRight');
2895
-
2896
- this._resetElementAttributes(SELECTOR_STICKY_CONTENT$1, 'marginRight');
2897
-
2898
- this._resetElementAttributes('body', 'paddingRight');
2899
- }
2900
-
2901
- _resetElementAttributes(selector, styleProp) {
2902
- SelectorEngine.find(selector).forEach(element => {
2903
- const value = Manipulator.getDataAttribute(element, styleProp);
2904
-
2905
- if (typeof value === 'undefined' && element === document.body) {
2906
- element.style[styleProp] = '';
2907
- } else {
2908
- Manipulator.removeDataAttribute(element, styleProp);
2909
- element.style[styleProp] = value;
2910
- }
2911
- });
2912
- }
2913
-
2914
- _getScrollbarWidth() {
2915
- // thx d.walsh
2916
- const scrollDiv = document.createElement('div');
2917
- scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER;
2918
- document.body.appendChild(scrollDiv);
2919
- const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
2920
- document.body.removeChild(scrollDiv);
2921
- return scrollbarWidth;
2922
3039
  } // Static
2923
3040
 
2924
3041
 
2925
3042
  static jQueryInterface(config, relatedTarget) {
2926
3043
  return this.each(function () {
2927
- let data = Data.get(this, DATA_KEY$6);
2928
- const _config = { ...Default$5,
2929
- ...Manipulator.getDataAttributes(this),
2930
- ...(typeof config === 'object' && config ? config : {})
2931
- };
3044
+ const data = Modal.getInstance(this) || new Modal(this, typeof config === 'object' ? config : {});
2932
3045
 
2933
- if (!data) {
2934
- data = new Modal(this, _config);
3046
+ if (typeof config !== 'string') {
3047
+ return;
2935
3048
  }
2936
3049
 
2937
- if (typeof config === 'string') {
2938
- if (typeof data[config] === 'undefined') {
2939
- throw new TypeError(`No method named "${config}"`);
2940
- }
2941
-
2942
- data[config](relatedTarget);
3050
+ if (typeof data[config] === 'undefined') {
3051
+ throw new TypeError(`No method named "${config}"`);
2943
3052
  }
3053
+
3054
+ data[config](relatedTarget);
2944
3055
  });
2945
3056
  }
2946
3057
 
@@ -2955,7 +3066,7 @@
2955
3066
  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
2956
3067
  const target = getElementFromSelector(this);
2957
3068
 
2958
- if (this.tagName === 'A' || this.tagName === 'AREA') {
3069
+ if (['A', 'AREA'].includes(this.tagName)) {
2959
3070
  event.preventDefault();
2960
3071
  }
2961
3072
 
@@ -2971,15 +3082,7 @@
2971
3082
  }
2972
3083
  });
2973
3084
  });
2974
- let data = Data.get(target, DATA_KEY$6);
2975
-
2976
- if (!data) {
2977
- const config = { ...Manipulator.getDataAttributes(target),
2978
- ...Manipulator.getDataAttributes(this)
2979
- };
2980
- data = new Modal(target, config);
2981
- }
2982
-
3085
+ const data = Modal.getInstance(target) || new Modal(target);
2983
3086
  data.toggle(this);
2984
3087
  });
2985
3088
  /**
@@ -2993,69 +3096,7 @@
2993
3096
 
2994
3097
  /**
2995
3098
  * --------------------------------------------------------------------------
2996
- * Bootstrap (v5.0.0-beta3): util/scrollBar.js
2997
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2998
- * --------------------------------------------------------------------------
2999
- */
3000
- const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed';
3001
- const SELECTOR_STICKY_CONTENT = '.sticky-top';
3002
-
3003
- const getWidth = () => {
3004
- // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
3005
- const documentWidth = document.documentElement.clientWidth;
3006
- return Math.abs(window.innerWidth - documentWidth);
3007
- };
3008
-
3009
- const hide = (width = getWidth()) => {
3010
- document.body.style.overflow = 'hidden';
3011
-
3012
- _setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
3013
-
3014
- _setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
3015
-
3016
- _setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + width);
3017
- };
3018
-
3019
- const _setElementAttributes = (selector, styleProp, callback) => {
3020
- const scrollbarWidth = getWidth();
3021
- SelectorEngine.find(selector).forEach(element => {
3022
- if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
3023
- return;
3024
- }
3025
-
3026
- const actualValue = element.style[styleProp];
3027
- const calculatedValue = window.getComputedStyle(element)[styleProp];
3028
- Manipulator.setDataAttribute(element, styleProp, actualValue);
3029
- element.style[styleProp] = callback(Number.parseFloat(calculatedValue)) + 'px';
3030
- });
3031
- };
3032
-
3033
- const reset = () => {
3034
- document.body.style.overflow = 'auto';
3035
-
3036
- _resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
3037
-
3038
- _resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
3039
-
3040
- _resetElementAttributes('body', 'paddingRight');
3041
- };
3042
-
3043
- const _resetElementAttributes = (selector, styleProp) => {
3044
- SelectorEngine.find(selector).forEach(element => {
3045
- const value = Manipulator.getDataAttribute(element, styleProp);
3046
-
3047
- if (typeof value === 'undefined' && element === document.body) {
3048
- element.style.removeProperty(styleProp);
3049
- } else {
3050
- Manipulator.removeDataAttribute(element, styleProp);
3051
- element.style[styleProp] = value;
3052
- }
3053
- });
3054
- };
3055
-
3056
- /**
3057
- * --------------------------------------------------------------------------
3058
- * Bootstrap (v5.0.0-beta3): offcanvas.js
3099
+ * Bootstrap (v5.0.0): offcanvas.js
3059
3100
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
3060
3101
  * --------------------------------------------------------------------------
3061
3102
  */
@@ -3081,11 +3122,8 @@
3081
3122
  keyboard: 'boolean',
3082
3123
  scroll: 'boolean'
3083
3124
  };
3084
- const CLASS_NAME_BACKDROP_BODY = 'offcanvas-backdrop';
3085
3125
  const CLASS_NAME_SHOW$4 = 'show';
3086
- const CLASS_NAME_TOGGLING = 'offcanvas-toggling';
3087
3126
  const OPEN_SELECTOR = '.offcanvas.show';
3088
- const ACTIVE_SELECTOR = `${OPEN_SELECTOR}, .${CLASS_NAME_TOGGLING}`;
3089
3127
  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
3090
3128
  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
3091
3129
  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
@@ -3093,6 +3131,7 @@
3093
3131
  const EVENT_FOCUSIN = `focusin${EVENT_KEY$5}`;
3094
3132
  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
3095
3133
  const EVENT_CLICK_DISMISS$1 = `click.dismiss${EVENT_KEY$5}`;
3134
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
3096
3135
  const SELECTOR_DATA_DISMISS$1 = '[data-bs-dismiss="offcanvas"]';
3097
3136
  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
3098
3137
  /**
@@ -3106,6 +3145,7 @@
3106
3145
  super(element);
3107
3146
  this._config = this._getConfig(config);
3108
3147
  this._isShown = false;
3148
+ this._backdrop = this._initializeBackDrop();
3109
3149
 
3110
3150
  this._addEventListeners();
3111
3151
  } // Getters
@@ -3140,15 +3180,13 @@
3140
3180
  this._isShown = true;
3141
3181
  this._element.style.visibility = 'visible';
3142
3182
 
3143
- if (this._config.backdrop) {
3144
- document.body.classList.add(CLASS_NAME_BACKDROP_BODY);
3145
- }
3183
+ this._backdrop.show();
3146
3184
 
3147
3185
  if (!this._config.scroll) {
3148
3186
  hide();
3149
- }
3150
3187
 
3151
- this._element.classList.add(CLASS_NAME_TOGGLING);
3188
+ this._enforceFocusOnElement(this._element);
3189
+ }
3152
3190
 
3153
3191
  this._element.removeAttribute('aria-hidden');
3154
3192
 
@@ -3159,16 +3197,14 @@
3159
3197
  this._element.classList.add(CLASS_NAME_SHOW$4);
3160
3198
 
3161
3199
  const completeCallBack = () => {
3162
- this._element.classList.remove(CLASS_NAME_TOGGLING);
3163
-
3164
3200
  EventHandler.trigger(this._element, EVENT_SHOWN$2, {
3165
3201
  relatedTarget
3166
3202
  });
3167
-
3168
- this._enforceFocusOnElement(this._element);
3169
3203
  };
3170
3204
 
3171
- setTimeout(completeCallBack, getTransitionDurationFromElement(this._element));
3205
+ const transitionDuration = getTransitionDurationFromElement(this._element);
3206
+ EventHandler.one(this._element, 'transitionend', completeCallBack);
3207
+ emulateTransitionEnd(this._element, transitionDuration);
3172
3208
  }
3173
3209
 
3174
3210
  hide() {
@@ -3182,8 +3218,6 @@
3182
3218
  return;
3183
3219
  }
3184
3220
 
3185
- this._element.classList.add(CLASS_NAME_TOGGLING);
3186
-
3187
3221
  EventHandler.off(document, EVENT_FOCUSIN);
3188
3222
 
3189
3223
  this._element.blur();
@@ -3192,6 +3226,8 @@
3192
3226
 
3193
3227
  this._element.classList.remove(CLASS_NAME_SHOW$4);
3194
3228
 
3229
+ this._backdrop.hide();
3230
+
3195
3231
  const completeCallback = () => {
3196
3232
  this._element.setAttribute('aria-hidden', true);
3197
3233
 
@@ -3201,20 +3237,25 @@
3201
3237
 
3202
3238
  this._element.style.visibility = 'hidden';
3203
3239
 
3204
- if (this._config.backdrop) {
3205
- document.body.classList.remove(CLASS_NAME_BACKDROP_BODY);
3206
- }
3207
-
3208
3240
  if (!this._config.scroll) {
3209
3241
  reset();
3210
3242
  }
3211
3243
 
3212
3244
  EventHandler.trigger(this._element, EVENT_HIDDEN$2);
3213
-
3214
- this._element.classList.remove(CLASS_NAME_TOGGLING);
3215
3245
  };
3216
3246
 
3217
- setTimeout(completeCallback, getTransitionDurationFromElement(this._element));
3247
+ const transitionDuration = getTransitionDurationFromElement(this._element);
3248
+ EventHandler.one(this._element, 'transitionend', completeCallback);
3249
+ emulateTransitionEnd(this._element, transitionDuration);
3250
+ }
3251
+
3252
+ dispose() {
3253
+ this._backdrop.dispose();
3254
+
3255
+ super.dispose();
3256
+ EventHandler.off(document, EVENT_FOCUSIN);
3257
+ this._config = null;
3258
+ this._backdrop = null;
3218
3259
  } // Private
3219
3260
 
3220
3261
 
@@ -3227,6 +3268,15 @@
3227
3268
  return config;
3228
3269
  }
3229
3270
 
3271
+ _initializeBackDrop() {
3272
+ return new Backdrop({
3273
+ isVisible: this._config.backdrop,
3274
+ isAnimated: true,
3275
+ rootElement: this._element.parentNode,
3276
+ clickCallback: () => this.hide()
3277
+ });
3278
+ }
3279
+
3230
3280
  _enforceFocusOnElement(element) {
3231
3281
  EventHandler.off(document, EVENT_FOCUSIN); // guard against infinite focus loop
3232
3282
 
@@ -3240,18 +3290,11 @@
3240
3290
 
3241
3291
  _addEventListeners() {
3242
3292
  EventHandler.on(this._element, EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, () => this.hide());
3243
- EventHandler.on(document, 'keydown', event => {
3293
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
3244
3294
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
3245
3295
  this.hide();
3246
3296
  }
3247
3297
  });
3248
- EventHandler.on(document, EVENT_CLICK_DATA_API$1, event => {
3249
- const target = SelectorEngine.findOne(getSelectorFromElement(event.target));
3250
-
3251
- if (!this._element.contains(event.target) && target !== this._element) {
3252
- this.hide();
3253
- }
3254
- });
3255
3298
  } // Static
3256
3299
 
3257
3300
 
@@ -3297,10 +3340,10 @@
3297
3340
  }
3298
3341
  }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
3299
3342
 
3300
- const allReadyOpen = SelectorEngine.findOne(ACTIVE_SELECTOR);
3343
+ const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
3301
3344
 
3302
3345
  if (allReadyOpen && allReadyOpen !== target) {
3303
- return;
3346
+ Offcanvas.getInstance(allReadyOpen).hide();
3304
3347
  }
3305
3348
 
3306
3349
  const data = Data.get(target, DATA_KEY$5) || new Offcanvas(target);
@@ -3319,7 +3362,7 @@
3319
3362
 
3320
3363
  /**
3321
3364
  * --------------------------------------------------------------------------
3322
- * Bootstrap (v5.0.0-beta3): util/sanitizer.js
3365
+ * Bootstrap (v5.0.0): util/sanitizer.js
3323
3366
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3324
3367
  * --------------------------------------------------------------------------
3325
3368
  */
@@ -3432,7 +3475,7 @@
3432
3475
 
3433
3476
  /**
3434
3477
  * --------------------------------------------------------------------------
3435
- * Bootstrap (v5.0.0-beta3): tooltip.js
3478
+ * Bootstrap (v5.0.0): tooltip.js
3436
3479
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3437
3480
  * --------------------------------------------------------------------------
3438
3481
  */
@@ -3607,7 +3650,6 @@
3607
3650
 
3608
3651
  dispose() {
3609
3652
  clearTimeout(this._timeout);
3610
- EventHandler.off(this._element, this.constructor.EVENT_KEY);
3611
3653
  EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
3612
3654
 
3613
3655
  if (this.tip && this.tip.parentNode) {
@@ -3692,7 +3734,7 @@
3692
3734
 
3693
3735
  if ('ontouchstart' in document.documentElement) {
3694
3736
  [].concat(...document.body.children).forEach(element => {
3695
- EventHandler.on(element, 'mouseover', noop());
3737
+ EventHandler.on(element, 'mouseover', noop);
3696
3738
  });
3697
3739
  }
3698
3740
 
@@ -3891,7 +3933,6 @@
3891
3933
  modifiers: [{
3892
3934
  name: 'flip',
3893
3935
  options: {
3894
- altBoundary: true,
3895
3936
  fallbackPlacements: this.config.fallbackPlacements
3896
3937
  }
3897
3938
  }, {
@@ -4174,7 +4215,7 @@
4174
4215
 
4175
4216
  /**
4176
4217
  * --------------------------------------------------------------------------
4177
- * Bootstrap (v5.0.0-beta3): popover.js
4218
+ * Bootstrap (v5.0.0): popover.js
4178
4219
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4179
4220
  * --------------------------------------------------------------------------
4180
4221
  */
@@ -4324,7 +4365,7 @@
4324
4365
 
4325
4366
  /**
4326
4367
  * --------------------------------------------------------------------------
4327
- * Bootstrap (v5.0.0-beta3): scrollspy.js
4368
+ * Bootstrap (v5.0.0): scrollspy.js
4328
4369
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4329
4370
  * --------------------------------------------------------------------------
4330
4371
  */
@@ -4437,6 +4478,7 @@
4437
4478
 
4438
4479
  _getConfig(config) {
4439
4480
  config = { ...Default$1,
4481
+ ...Manipulator.getDataAttributes(this._element),
4440
4482
  ...(typeof config === 'object' && config ? config : {})
4441
4483
  };
4442
4484
 
@@ -4545,21 +4587,17 @@
4545
4587
 
4546
4588
  static jQueryInterface(config) {
4547
4589
  return this.each(function () {
4548
- let data = Data.get(this, DATA_KEY$2);
4549
-
4550
- const _config = typeof config === 'object' && config;
4590
+ const data = ScrollSpy.getInstance(this) || new ScrollSpy(this, typeof config === 'object' ? config : {});
4551
4591
 
4552
- if (!data) {
4553
- data = new ScrollSpy(this, _config);
4592
+ if (typeof config !== 'string') {
4593
+ return;
4554
4594
  }
4555
4595
 
4556
- if (typeof config === 'string') {
4557
- if (typeof data[config] === 'undefined') {
4558
- throw new TypeError(`No method named "${config}"`);
4559
- }
4560
-
4561
- data[config]();
4596
+ if (typeof data[config] === 'undefined') {
4597
+ throw new TypeError(`No method named "${config}"`);
4562
4598
  }
4599
+
4600
+ data[config]();
4563
4601
  });
4564
4602
  }
4565
4603
 
@@ -4572,7 +4610,7 @@
4572
4610
 
4573
4611
 
4574
4612
  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
4575
- SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy, Manipulator.getDataAttributes(spy)));
4613
+ SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));
4576
4614
  });
4577
4615
  /**
4578
4616
  * ------------------------------------------------------------------------
@@ -4585,7 +4623,7 @@
4585
4623
 
4586
4624
  /**
4587
4625
  * --------------------------------------------------------------------------
4588
- * Bootstrap (v5.0.0-beta3): tab.js
4626
+ * Bootstrap (v5.0.0): tab.js
4589
4627
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4590
4628
  * --------------------------------------------------------------------------
4591
4629
  */
@@ -4629,7 +4667,7 @@
4629
4667
 
4630
4668
 
4631
4669
  show() {
4632
- if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE) || isDisabled(this._element)) {
4670
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
4633
4671
  return;
4634
4672
  }
4635
4673
 
@@ -4717,11 +4755,17 @@
4717
4755
  element.classList.add(CLASS_NAME_SHOW$1);
4718
4756
  }
4719
4757
 
4720
- if (element.parentNode && element.parentNode.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
4758
+ let parent = element.parentNode;
4759
+
4760
+ if (parent && parent.nodeName === 'LI') {
4761
+ parent = parent.parentNode;
4762
+ }
4763
+
4764
+ if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
4721
4765
  const dropdownElement = element.closest(SELECTOR_DROPDOWN);
4722
4766
 
4723
4767
  if (dropdownElement) {
4724
- SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
4768
+ SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));
4725
4769
  }
4726
4770
 
4727
4771
  element.setAttribute('aria-expanded', true);
@@ -4756,7 +4800,14 @@
4756
4800
 
4757
4801
 
4758
4802
  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
4759
- event.preventDefault();
4803
+ if (['A', 'AREA'].includes(this.tagName)) {
4804
+ event.preventDefault();
4805
+ }
4806
+
4807
+ if (isDisabled(this)) {
4808
+ return;
4809
+ }
4810
+
4760
4811
  const data = Data.get(this, DATA_KEY$1) || new Tab(this);
4761
4812
  data.show();
4762
4813
  });
@@ -4771,7 +4822,7 @@
4771
4822
 
4772
4823
  /**
4773
4824
  * --------------------------------------------------------------------------
4774
- * Bootstrap (v5.0.0-beta3): toast.js
4825
+ * Bootstrap (v5.0.0): toast.js
4775
4826
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4776
4827
  * --------------------------------------------------------------------------
4777
4828
  */
@@ -4910,7 +4961,6 @@
4910
4961
  this._element.classList.remove(CLASS_NAME_SHOW);
4911
4962
  }
4912
4963
 
4913
- EventHandler.off(this._element, EVENT_CLICK_DISMISS);
4914
4964
  super.dispose();
4915
4965
  this._config = null;
4916
4966
  } // Private
@@ -4968,7 +5018,7 @@
4968
5018
 
4969
5019
  /**
4970
5020
  * --------------------------------------------------------------------------
4971
- * Bootstrap (v5.0.0-beta3): index.umd.js
5021
+ * Bootstrap (v5.0.0): index.umd.js
4972
5022
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4973
5023
  * --------------------------------------------------------------------------
4974
5024
  */