bootstrap 5.0.2 → 5.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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/assets/javascripts/bootstrap-sprockets.js +7 -7
  4. data/assets/javascripts/bootstrap.js +590 -580
  5. data/assets/javascripts/bootstrap.min.js +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +73 -43
  7. data/assets/javascripts/bootstrap/base-component.js +15 -10
  8. data/assets/javascripts/bootstrap/button.js +13 -6
  9. data/assets/javascripts/bootstrap/carousel.js +26 -8
  10. data/assets/javascripts/bootstrap/collapse.js +96 -114
  11. data/assets/javascripts/bootstrap/dom/data.js +2 -2
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +9 -2
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +4 -4
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +47 -5
  15. data/assets/javascripts/bootstrap/dropdown.js +66 -74
  16. data/assets/javascripts/bootstrap/modal.js +198 -52
  17. data/assets/javascripts/bootstrap/offcanvas.js +177 -31
  18. data/assets/javascripts/bootstrap/popover.js +19 -52
  19. data/assets/javascripts/bootstrap/scrollspy.js +28 -47
  20. data/assets/javascripts/bootstrap/tab.js +27 -8
  21. data/assets/javascripts/bootstrap/toast.js +108 -13
  22. data/assets/javascripts/bootstrap/tooltip.js +57 -47
  23. data/assets/stylesheets/_bootstrap-grid.scss +1 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +1 -1
  25. data/assets/stylesheets/_bootstrap.scss +2 -1
  26. data/assets/stylesheets/bootstrap/_card.scss +2 -1
  27. data/assets/stylesheets/bootstrap/_functions.scss +45 -12
  28. data/assets/stylesheets/bootstrap/_grid.scss +11 -0
  29. data/assets/stylesheets/bootstrap/_helpers.scss +2 -0
  30. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  31. data/assets/stylesheets/bootstrap/_modal.scss +1 -11
  32. data/assets/stylesheets/bootstrap/_navbar.scss +30 -1
  33. data/assets/stylesheets/bootstrap/_offcanvas.scss +4 -0
  34. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  35. data/assets/stylesheets/bootstrap/_reboot.scss +12 -8
  36. data/assets/stylesheets/bootstrap/_root.scss +39 -2
  37. data/assets/stylesheets/bootstrap/_toasts.scss +2 -2
  38. data/assets/stylesheets/bootstrap/_transitions.scss +6 -0
  39. data/assets/stylesheets/bootstrap/_utilities.scss +44 -8
  40. data/assets/stylesheets/bootstrap/_variables.scss +167 -6
  41. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  42. data/assets/stylesheets/bootstrap/forms/_form-control.scss +1 -1
  43. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  44. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  45. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  46. data/assets/stylesheets/bootstrap/mixins/_grid.scss +25 -7
  47. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +27 -6
  48. data/bootstrap.gemspec +3 -3
  49. data/lib/bootstrap/version.rb +2 -2
  50. data/tasks/updater/js.rb +6 -2
  51. metadata +11 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0314dcfea7c5fef8beb89c89aae1079993ed58c6509eb6325a7b00bd25bac45e
4
- data.tar.gz: 1cf536b8bb87f45060505977be1c795d1159b72bce299caeb8652a2f9c122e21
3
+ metadata.gz: eac9843149cd951a77a337af9060986d2d4bbf280433e8029acc9beb4803e127
4
+ data.tar.gz: 94246dd7243f819c6355cddc6cb4a1a70cfa8f7091081b85eed0308e170a64a8
5
5
  SHA512:
6
- metadata.gz: 91e3199ea081cf8a4e515f637a20f155ae77ab602e821220e35218cd52af51563adc616646c099aeda3ee88ee1365d12bb12865963f6fae5b7481af449d3351d
7
- data.tar.gz: 56fbbc51f5db1cad7c06e785f7b8868010c7db2bdaa6d9278a012b28b15cf7cbbe7c5fa3339f49df40e751032e956f4a00d57558caff3f626d9f1ab4236122a4
6
+ metadata.gz: 2038973a9443b949dd806f9e4cf6aa11db3945b21ff73475054041784d21f0b925ac507ac1e6857fc6c3eb3337668522d55c3525ed4183e8502a3dadfa6e540f
7
+ data.tar.gz: 6ea2cde5c13fb286f58d14e20703356e6f614987de86d8f44487cb8441e4123ed877c59d417d5c9cd2889ad10299f38b5985b3cd5537402cbf3a048088dd44a7
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.2'
23
+ gem 'bootstrap', '~> 5.1.0'
24
24
  ```
25
25
 
26
26
  Ensure that `sprockets-rails` is at least v2.3.2.
@@ -2,18 +2,18 @@
2
2
  //= require ./bootstrap/dom/data
3
3
  //= require ./bootstrap/dom/event-handler
4
4
  //= require ./bootstrap/base-component
5
+ //= require ./bootstrap/alert
6
+ //= require ./bootstrap/button
5
7
  //= require ./bootstrap/dom/manipulator
6
8
  //= require ./bootstrap/dom/selector-engine
7
9
  //= require ./bootstrap/carousel
8
10
  //= require ./bootstrap/collapse
9
- //= require ./bootstrap/button
10
- //= require ./bootstrap/tab
11
- //= require ./bootstrap/toast
11
+ //= require ./bootstrap/dropdown
12
+ //= require ./bootstrap/modal
13
+ //= require ./bootstrap/offcanvas
12
14
  //= require ./bootstrap/tooltip
13
15
  //= require ./bootstrap/popover
14
- //= require ./bootstrap/alert
15
- //= require ./bootstrap/offcanvas
16
16
  //= require ./bootstrap/scrollspy
17
- //= require ./bootstrap/modal
18
- //= require ./bootstrap/dropdown
17
+ //= require ./bootstrap/tab
18
+ //= require ./bootstrap/toast
19
19
  //= require ./bootstrap-global-this-undefine
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap v5.0.2 (https://getbootstrap.com/)
2
+ * Bootstrap v5.1.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,82 +33,10 @@
33
33
 
34
34
  /**
35
35
  * --------------------------------------------------------------------------
36
- * Bootstrap (v5.0.2): dom/selector-engine.js
36
+ * Bootstrap (v5.1.0): util/index.js
37
37
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
38
38
  * --------------------------------------------------------------------------
39
39
  */
40
-
41
- /**
42
- * ------------------------------------------------------------------------
43
- * Constants
44
- * ------------------------------------------------------------------------
45
- */
46
- const NODE_TEXT = 3;
47
- const SelectorEngine = {
48
- find(selector, element = document.documentElement) {
49
- return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
50
- },
51
-
52
- findOne(selector, element = document.documentElement) {
53
- return Element.prototype.querySelector.call(element, selector);
54
- },
55
-
56
- children(element, selector) {
57
- return [].concat(...element.children).filter(child => child.matches(selector));
58
- },
59
-
60
- parents(element, selector) {
61
- const parents = [];
62
- let ancestor = element.parentNode;
63
-
64
- while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
65
- if (ancestor.matches(selector)) {
66
- parents.push(ancestor);
67
- }
68
-
69
- ancestor = ancestor.parentNode;
70
- }
71
-
72
- return parents;
73
- },
74
-
75
- prev(element, selector) {
76
- let previous = element.previousElementSibling;
77
-
78
- while (previous) {
79
- if (previous.matches(selector)) {
80
- return [previous];
81
- }
82
-
83
- previous = previous.previousElementSibling;
84
- }
85
-
86
- return [];
87
- },
88
-
89
- next(element, selector) {
90
- let next = element.nextElementSibling;
91
-
92
- while (next) {
93
- if (next.matches(selector)) {
94
- return [next];
95
- }
96
-
97
- next = next.nextElementSibling;
98
- }
99
-
100
- return [];
101
- }
102
-
103
- };
104
-
105
- /**
106
- * --------------------------------------------------------------------------
107
- * Bootstrap (v5.0.2): util/index.js
108
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
109
- * --------------------------------------------------------------------------
110
- */
111
-
112
40
  const MAX_UID = 1000000;
113
41
  const MILLISECONDS_MULTIPLIER = 1000;
114
42
  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
@@ -220,7 +148,7 @@
220
148
  }
221
149
 
222
150
  if (typeof obj === 'string' && obj.length > 0) {
223
- return SelectorEngine.findOne(obj);
151
+ return document.querySelector(obj);
224
152
  }
225
153
 
226
154
  return null;
@@ -286,8 +214,20 @@
286
214
  };
287
215
 
288
216
  const noop = () => {};
217
+ /**
218
+ * Trick to restart an element's animation
219
+ *
220
+ * @param {HTMLElement} element
221
+ * @return void
222
+ *
223
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
224
+ */
289
225
 
290
- const reflow = element => element.offsetHeight;
226
+
227
+ const reflow = element => {
228
+ // eslint-disable-next-line no-unused-expressions
229
+ element.offsetHeight;
230
+ };
291
231
 
292
232
  const getjQuery = () => {
293
233
  const {
@@ -404,7 +344,7 @@
404
344
 
405
345
  /**
406
346
  * --------------------------------------------------------------------------
407
- * Bootstrap (v5.0.2): dom/event-handler.js
347
+ * Bootstrap (v5.1.0): dom/event-handler.js
408
348
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
409
349
  * --------------------------------------------------------------------------
410
350
  */
@@ -693,7 +633,7 @@
693
633
 
694
634
  /**
695
635
  * --------------------------------------------------------------------------
696
- * Bootstrap (v5.0.2): dom/data.js
636
+ * Bootstrap (v5.1.0): dom/data.js
697
637
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
698
638
  * --------------------------------------------------------------------------
699
639
  */
@@ -747,7 +687,7 @@
747
687
 
748
688
  /**
749
689
  * --------------------------------------------------------------------------
750
- * Bootstrap (v5.0.2): base-component.js
690
+ * Bootstrap (v5.1.0): base-component.js
751
691
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
752
692
  * --------------------------------------------------------------------------
753
693
  */
@@ -757,7 +697,7 @@
757
697
  * ------------------------------------------------------------------------
758
698
  */
759
699
 
760
- const VERSION = '5.0.2';
700
+ const VERSION = '5.1.0';
761
701
 
762
702
  class BaseComponent {
763
703
  constructor(element) {
@@ -786,7 +726,7 @@
786
726
 
787
727
 
788
728
  static getInstance(element) {
789
- return Data.get(element, this.DATA_KEY);
729
+ return Data.get(getElement(element), this.DATA_KEY);
790
730
  }
791
731
 
792
732
  static getOrCreateInstance(element, config = {}) {
@@ -813,7 +753,33 @@
813
753
 
814
754
  /**
815
755
  * --------------------------------------------------------------------------
816
- * Bootstrap (v5.0.2): alert.js
756
+ * Bootstrap (v5.1.0): util/component-functions.js
757
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
758
+ * --------------------------------------------------------------------------
759
+ */
760
+
761
+ const enableDismissTrigger = (component, method = 'hide') => {
762
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
763
+ const name = component.NAME;
764
+ EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
765
+ if (['A', 'AREA'].includes(this.tagName)) {
766
+ event.preventDefault();
767
+ }
768
+
769
+ if (isDisabled(this)) {
770
+ return;
771
+ }
772
+
773
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
774
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
775
+
776
+ instance[method]();
777
+ });
778
+ };
779
+
780
+ /**
781
+ * --------------------------------------------------------------------------
782
+ * Bootstrap (v5.1.0): alert.js
817
783
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
818
784
  * --------------------------------------------------------------------------
819
785
  */
@@ -823,17 +789,13 @@
823
789
  * ------------------------------------------------------------------------
824
790
  */
825
791
 
826
- const NAME$c = 'alert';
827
- const DATA_KEY$b = 'bs.alert';
828
- const EVENT_KEY$b = `.${DATA_KEY$b}`;
829
- const DATA_API_KEY$8 = '.data-api';
830
- const SELECTOR_DISMISS = '[data-bs-dismiss="alert"]';
831
- const EVENT_CLOSE = `close${EVENT_KEY$b}`;
832
- const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
833
- const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$b}${DATA_API_KEY$8}`;
834
- const CLASS_NAME_ALERT = 'alert';
835
- const CLASS_NAME_FADE$6 = 'fade';
836
- const CLASS_NAME_SHOW$9 = 'show';
792
+ const NAME$d = 'alert';
793
+ const DATA_KEY$c = 'bs.alert';
794
+ const EVENT_KEY$c = `.${DATA_KEY$c}`;
795
+ const EVENT_CLOSE = `close${EVENT_KEY$c}`;
796
+ const EVENT_CLOSED = `closed${EVENT_KEY$c}`;
797
+ const CLASS_NAME_FADE$5 = 'fade';
798
+ const CLASS_NAME_SHOW$8 = 'show';
837
799
  /**
838
800
  * ------------------------------------------------------------------------
839
801
  * Class Definition
@@ -843,41 +805,30 @@
843
805
  class Alert extends BaseComponent {
844
806
  // Getters
845
807
  static get NAME() {
846
- return NAME$c;
808
+ return NAME$d;
847
809
  } // Public
848
810
 
849
811
 
850
- close(element) {
851
- const rootElement = element ? this._getRootElement(element) : this._element;
852
-
853
- const customEvent = this._triggerCloseEvent(rootElement);
812
+ close() {
813
+ const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
854
814
 
855
- if (customEvent === null || customEvent.defaultPrevented) {
815
+ if (closeEvent.defaultPrevented) {
856
816
  return;
857
817
  }
858
818
 
859
- this._removeElement(rootElement);
860
- } // Private
861
-
819
+ this._element.classList.remove(CLASS_NAME_SHOW$8);
862
820
 
863
- _getRootElement(element) {
864
- return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`);
865
- }
821
+ const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
866
822
 
867
- _triggerCloseEvent(element) {
868
- return EventHandler.trigger(element, EVENT_CLOSE);
869
- }
823
+ this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
824
+ } // Private
870
825
 
871
- _removeElement(element) {
872
- element.classList.remove(CLASS_NAME_SHOW$9);
873
- const isAnimated = element.classList.contains(CLASS_NAME_FADE$6);
874
826
 
875
- this._queueCallback(() => this._destroyElement(element), element, isAnimated);
876
- }
827
+ _destroyElement() {
828
+ this._element.remove();
877
829
 
878
- _destroyElement(element) {
879
- element.remove();
880
- EventHandler.trigger(element, EVENT_CLOSED);
830
+ EventHandler.trigger(this._element, EVENT_CLOSED);
831
+ this.dispose();
881
832
  } // Static
882
833
 
883
834
 
@@ -885,20 +836,16 @@
885
836
  return this.each(function () {
886
837
  const data = Alert.getOrCreateInstance(this);
887
838
 
888
- if (config === 'close') {
889
- data[config](this);
839
+ if (typeof config !== 'string') {
840
+ return;
890
841
  }
891
- });
892
- }
893
842
 
894
- static handleDismiss(alertInstance) {
895
- return function (event) {
896
- if (event) {
897
- event.preventDefault();
843
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
844
+ throw new TypeError(`No method named "${config}"`);
898
845
  }
899
846
 
900
- alertInstance.close(this);
901
- };
847
+ data[config](this);
848
+ });
902
849
  }
903
850
 
904
851
  }
@@ -909,7 +856,7 @@
909
856
  */
910
857
 
911
858
 
912
- EventHandler.on(document, EVENT_CLICK_DATA_API$7, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()));
859
+ enableDismissTrigger(Alert, 'close');
913
860
  /**
914
861
  * ------------------------------------------------------------------------
915
862
  * jQuery
@@ -921,7 +868,7 @@
921
868
 
922
869
  /**
923
870
  * --------------------------------------------------------------------------
924
- * Bootstrap (v5.0.2): button.js
871
+ * Bootstrap (v5.1.0): button.js
925
872
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
926
873
  * --------------------------------------------------------------------------
927
874
  */
@@ -931,13 +878,13 @@
931
878
  * ------------------------------------------------------------------------
932
879
  */
933
880
 
934
- const NAME$b = 'button';
935
- const DATA_KEY$a = 'bs.button';
936
- const EVENT_KEY$a = `.${DATA_KEY$a}`;
881
+ const NAME$c = 'button';
882
+ const DATA_KEY$b = 'bs.button';
883
+ const EVENT_KEY$b = `.${DATA_KEY$b}`;
937
884
  const DATA_API_KEY$7 = '.data-api';
938
885
  const CLASS_NAME_ACTIVE$3 = 'active';
939
886
  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
940
- const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$7}`;
887
+ const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;
941
888
  /**
942
889
  * ------------------------------------------------------------------------
943
890
  * Class Definition
@@ -947,7 +894,7 @@
947
894
  class Button extends BaseComponent {
948
895
  // Getters
949
896
  static get NAME() {
950
- return NAME$b;
897
+ return NAME$c;
951
898
  } // Public
952
899
 
953
900
 
@@ -992,7 +939,7 @@
992
939
 
993
940
  /**
994
941
  * --------------------------------------------------------------------------
995
- * Bootstrap (v5.0.2): dom/manipulator.js
942
+ * Bootstrap (v5.1.0): dom/manipulator.js
996
943
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
997
944
  * --------------------------------------------------------------------------
998
945
  */
@@ -1050,8 +997,8 @@
1050
997
  offset(element) {
1051
998
  const rect = element.getBoundingClientRect();
1052
999
  return {
1053
- top: rect.top + document.body.scrollTop,
1054
- left: rect.left + document.body.scrollLeft
1000
+ top: rect.top + window.pageYOffset,
1001
+ left: rect.left + window.pageXOffset
1055
1002
  };
1056
1003
  },
1057
1004
 
@@ -1066,7 +1013,77 @@
1066
1013
 
1067
1014
  /**
1068
1015
  * --------------------------------------------------------------------------
1069
- * Bootstrap (v5.0.2): carousel.js
1016
+ * Bootstrap (v5.1.0): dom/selector-engine.js
1017
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1018
+ * --------------------------------------------------------------------------
1019
+ */
1020
+ const NODE_TEXT = 3;
1021
+ const SelectorEngine = {
1022
+ find(selector, element = document.documentElement) {
1023
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
1024
+ },
1025
+
1026
+ findOne(selector, element = document.documentElement) {
1027
+ return Element.prototype.querySelector.call(element, selector);
1028
+ },
1029
+
1030
+ children(element, selector) {
1031
+ return [].concat(...element.children).filter(child => child.matches(selector));
1032
+ },
1033
+
1034
+ parents(element, selector) {
1035
+ const parents = [];
1036
+ let ancestor = element.parentNode;
1037
+
1038
+ while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
1039
+ if (ancestor.matches(selector)) {
1040
+ parents.push(ancestor);
1041
+ }
1042
+
1043
+ ancestor = ancestor.parentNode;
1044
+ }
1045
+
1046
+ return parents;
1047
+ },
1048
+
1049
+ prev(element, selector) {
1050
+ let previous = element.previousElementSibling;
1051
+
1052
+ while (previous) {
1053
+ if (previous.matches(selector)) {
1054
+ return [previous];
1055
+ }
1056
+
1057
+ previous = previous.previousElementSibling;
1058
+ }
1059
+
1060
+ return [];
1061
+ },
1062
+
1063
+ next(element, selector) {
1064
+ let next = element.nextElementSibling;
1065
+
1066
+ while (next) {
1067
+ if (next.matches(selector)) {
1068
+ return [next];
1069
+ }
1070
+
1071
+ next = next.nextElementSibling;
1072
+ }
1073
+
1074
+ return [];
1075
+ },
1076
+
1077
+ focusableChildren(element) {
1078
+ const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
1079
+ return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
1080
+ }
1081
+
1082
+ };
1083
+
1084
+ /**
1085
+ * --------------------------------------------------------------------------
1086
+ * Bootstrap (v5.1.0): carousel.js
1070
1087
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1071
1088
  * --------------------------------------------------------------------------
1072
1089
  */
@@ -1076,16 +1093,16 @@
1076
1093
  * ------------------------------------------------------------------------
1077
1094
  */
1078
1095
 
1079
- const NAME$a = 'carousel';
1080
- const DATA_KEY$9 = 'bs.carousel';
1081
- const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1096
+ const NAME$b = 'carousel';
1097
+ const DATA_KEY$a = 'bs.carousel';
1098
+ const EVENT_KEY$a = `.${DATA_KEY$a}`;
1082
1099
  const DATA_API_KEY$6 = '.data-api';
1083
1100
  const ARROW_LEFT_KEY = 'ArrowLeft';
1084
1101
  const ARROW_RIGHT_KEY = 'ArrowRight';
1085
1102
  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1086
1103
 
1087
1104
  const SWIPE_THRESHOLD = 40;
1088
- const Default$9 = {
1105
+ const Default$a = {
1089
1106
  interval: 5000,
1090
1107
  keyboard: true,
1091
1108
  slide: false,
@@ -1093,7 +1110,7 @@
1093
1110
  wrap: true,
1094
1111
  touch: true
1095
1112
  };
1096
- const DefaultType$9 = {
1113
+ const DefaultType$a = {
1097
1114
  interval: '(number|boolean)',
1098
1115
  keyboard: 'boolean',
1099
1116
  slide: '(boolean|string)',
@@ -1109,19 +1126,19 @@
1109
1126
  [ARROW_LEFT_KEY]: DIRECTION_RIGHT,
1110
1127
  [ARROW_RIGHT_KEY]: DIRECTION_LEFT
1111
1128
  };
1112
- const EVENT_SLIDE = `slide${EVENT_KEY$9}`;
1113
- const EVENT_SLID = `slid${EVENT_KEY$9}`;
1114
- const EVENT_KEYDOWN = `keydown${EVENT_KEY$9}`;
1115
- const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$9}`;
1116
- const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$9}`;
1117
- const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
1118
- const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
1119
- const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
1120
- const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
1121
- const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
1122
- const EVENT_DRAG_START = `dragstart${EVENT_KEY$9}`;
1123
- const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$9}${DATA_API_KEY$6}`;
1124
- const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$9}${DATA_API_KEY$6}`;
1129
+ const EVENT_SLIDE = `slide${EVENT_KEY$a}`;
1130
+ const EVENT_SLID = `slid${EVENT_KEY$a}`;
1131
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;
1132
+ const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;
1133
+ const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;
1134
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;
1135
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;
1136
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;
1137
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;
1138
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;
1139
+ const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
1140
+ const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;
1141
+ const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
1125
1142
  const CLASS_NAME_CAROUSEL = 'carousel';
1126
1143
  const CLASS_NAME_ACTIVE$2 = 'active';
1127
1144
  const CLASS_NAME_SLIDE = 'slide';
@@ -1168,11 +1185,11 @@
1168
1185
 
1169
1186
 
1170
1187
  static get Default() {
1171
- return Default$9;
1188
+ return Default$a;
1172
1189
  }
1173
1190
 
1174
1191
  static get NAME() {
1175
- return NAME$a;
1192
+ return NAME$b;
1176
1193
  } // Public
1177
1194
 
1178
1195
 
@@ -1250,11 +1267,11 @@
1250
1267
 
1251
1268
 
1252
1269
  _getConfig(config) {
1253
- config = { ...Default$9,
1270
+ config = { ...Default$a,
1254
1271
  ...Manipulator.getDataAttributes(this._element),
1255
1272
  ...(typeof config === 'object' ? config : {})
1256
1273
  };
1257
- typeCheckConfig(NAME$a, config, DefaultType$9);
1274
+ typeCheckConfig(NAME$b, config, DefaultType$a);
1258
1275
  return config;
1259
1276
  }
1260
1277
 
@@ -1611,7 +1628,7 @@
1611
1628
 
1612
1629
  /**
1613
1630
  * --------------------------------------------------------------------------
1614
- * Bootstrap (v5.0.2): collapse.js
1631
+ * Bootstrap (v5.1.0): collapse.js
1615
1632
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1616
1633
  * --------------------------------------------------------------------------
1617
1634
  */
@@ -1621,27 +1638,28 @@
1621
1638
  * ------------------------------------------------------------------------
1622
1639
  */
1623
1640
 
1624
- const NAME$9 = 'collapse';
1625
- const DATA_KEY$8 = 'bs.collapse';
1626
- const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1641
+ const NAME$a = 'collapse';
1642
+ const DATA_KEY$9 = 'bs.collapse';
1643
+ const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1627
1644
  const DATA_API_KEY$5 = '.data-api';
1628
- const Default$8 = {
1645
+ const Default$9 = {
1629
1646
  toggle: true,
1630
- parent: ''
1647
+ parent: null
1631
1648
  };
1632
- const DefaultType$8 = {
1649
+ const DefaultType$9 = {
1633
1650
  toggle: 'boolean',
1634
- parent: '(string|element)'
1651
+ parent: '(null|element)'
1635
1652
  };
1636
- const EVENT_SHOW$5 = `show${EVENT_KEY$8}`;
1637
- const EVENT_SHOWN$5 = `shown${EVENT_KEY$8}`;
1638
- const EVENT_HIDE$5 = `hide${EVENT_KEY$8}`;
1639
- const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$8}`;
1640
- const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
1641
- const CLASS_NAME_SHOW$8 = 'show';
1653
+ const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;
1654
+ const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;
1655
+ const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;
1656
+ const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;
1657
+ const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;
1658
+ const CLASS_NAME_SHOW$7 = 'show';
1642
1659
  const CLASS_NAME_COLLAPSE = 'collapse';
1643
1660
  const CLASS_NAME_COLLAPSING = 'collapsing';
1644
1661
  const CLASS_NAME_COLLAPSED = 'collapsed';
1662
+ const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1645
1663
  const WIDTH = 'width';
1646
1664
  const HEIGHT = 'height';
1647
1665
  const SELECTOR_ACTIVES = '.show, .collapsing';
@@ -1657,7 +1675,7 @@
1657
1675
  super(element);
1658
1676
  this._isTransitioning = false;
1659
1677
  this._config = this._getConfig(config);
1660
- this._triggerArray = SelectorEngine.find(`${SELECTOR_DATA_TOGGLE$4}[href="#${this._element.id}"],` + `${SELECTOR_DATA_TOGGLE$4}[data-bs-target="#${this._element.id}"]`);
1678
+ this._triggerArray = [];
1661
1679
  const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1662
1680
 
1663
1681
  for (let i = 0, len = toggleList.length; i < len; i++) {
@@ -1672,10 +1690,10 @@
1672
1690
  }
1673
1691
  }
1674
1692
 
1675
- this._parent = this._config.parent ? this._getParent() : null;
1693
+ this._initializeChildren();
1676
1694
 
1677
1695
  if (!this._config.parent) {
1678
- this._addAriaAndCollapsedClass(this._element, this._triggerArray);
1696
+ this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1679
1697
  }
1680
1698
 
1681
1699
  if (this._config.toggle) {
@@ -1685,16 +1703,16 @@
1685
1703
 
1686
1704
 
1687
1705
  static get Default() {
1688
- return Default$8;
1706
+ return Default$9;
1689
1707
  }
1690
1708
 
1691
1709
  static get NAME() {
1692
- return NAME$9;
1710
+ return NAME$a;
1693
1711
  } // Public
1694
1712
 
1695
1713
 
1696
1714
  toggle() {
1697
- if (this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1715
+ if (this._isShown()) {
1698
1716
  this.hide();
1699
1717
  } else {
1700
1718
  this.show();
@@ -1702,30 +1720,21 @@
1702
1720
  }
1703
1721
 
1704
1722
  show() {
1705
- if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1723
+ if (this._isTransitioning || this._isShown()) {
1706
1724
  return;
1707
1725
  }
1708
1726
 
1709
- let actives;
1727
+ let actives = [];
1710
1728
  let activesData;
1711
1729
 
1712
- if (this._parent) {
1713
- actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent).filter(elem => {
1714
- if (typeof this._config.parent === 'string') {
1715
- return elem.getAttribute('data-bs-parent') === this._config.parent;
1716
- }
1717
-
1718
- return elem.classList.contains(CLASS_NAME_COLLAPSE);
1719
- });
1720
-
1721
- if (actives.length === 0) {
1722
- actives = null;
1723
- }
1730
+ if (this._config.parent) {
1731
+ const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
1732
+ actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
1724
1733
  }
1725
1734
 
1726
1735
  const container = SelectorEngine.findOne(this._selector);
1727
1736
 
1728
- if (actives) {
1737
+ if (actives.length) {
1729
1738
  const tempActiveData = actives.find(elem => container !== elem);
1730
1739
  activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
1731
1740
 
@@ -1740,17 +1749,17 @@
1740
1749
  return;
1741
1750
  }
1742
1751
 
1743
- if (actives) {
1744
- actives.forEach(elemActive => {
1745
- if (container !== elemActive) {
1746
- Collapse.collapseInterface(elemActive, 'hide');
1747
- }
1752
+ actives.forEach(elemActive => {
1753
+ if (container !== elemActive) {
1754
+ Collapse.getOrCreateInstance(elemActive, {
1755
+ toggle: false
1756
+ }).hide();
1757
+ }
1748
1758
 
1749
- if (!activesData) {
1750
- Data.set(elemActive, DATA_KEY$8, null);
1751
- }
1752
- });
1753
- }
1759
+ if (!activesData) {
1760
+ Data.set(elemActive, DATA_KEY$9, null);
1761
+ }
1762
+ });
1754
1763
 
1755
1764
  const dimension = this._getDimension();
1756
1765
 
@@ -1760,22 +1769,18 @@
1760
1769
 
1761
1770
  this._element.style[dimension] = 0;
1762
1771
 
1763
- if (this._triggerArray.length) {
1764
- this._triggerArray.forEach(element => {
1765
- element.classList.remove(CLASS_NAME_COLLAPSED);
1766
- element.setAttribute('aria-expanded', true);
1767
- });
1768
- }
1772
+ this._addAriaAndCollapsedClass(this._triggerArray, true);
1769
1773
 
1770
- this.setTransitioning(true);
1774
+ this._isTransitioning = true;
1771
1775
 
1772
1776
  const complete = () => {
1777
+ this._isTransitioning = false;
1778
+
1773
1779
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
1774
1780
 
1775
- this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8);
1781
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1776
1782
 
1777
1783
  this._element.style[dimension] = '';
1778
- this.setTransitioning(false);
1779
1784
  EventHandler.trigger(this._element, EVENT_SHOWN$5);
1780
1785
  };
1781
1786
 
@@ -1788,7 +1793,7 @@
1788
1793
  }
1789
1794
 
1790
1795
  hide() {
1791
- if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1796
+ if (this._isTransitioning || !this._isShown()) {
1792
1797
  return;
1793
1798
  }
1794
1799
 
@@ -1805,26 +1810,23 @@
1805
1810
 
1806
1811
  this._element.classList.add(CLASS_NAME_COLLAPSING);
1807
1812
 
1808
- this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8);
1813
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1809
1814
 
1810
1815
  const triggerArrayLength = this._triggerArray.length;
1811
1816
 
1812
- if (triggerArrayLength > 0) {
1813
- for (let i = 0; i < triggerArrayLength; i++) {
1814
- const trigger = this._triggerArray[i];
1815
- const elem = getElementFromSelector(trigger);
1817
+ for (let i = 0; i < triggerArrayLength; i++) {
1818
+ const trigger = this._triggerArray[i];
1819
+ const elem = getElementFromSelector(trigger);
1816
1820
 
1817
- if (elem && !elem.classList.contains(CLASS_NAME_SHOW$8)) {
1818
- trigger.classList.add(CLASS_NAME_COLLAPSED);
1819
- trigger.setAttribute('aria-expanded', false);
1820
- }
1821
+ if (elem && !this._isShown(elem)) {
1822
+ this._addAriaAndCollapsedClass([trigger], false);
1821
1823
  }
1822
1824
  }
1823
1825
 
1824
- this.setTransitioning(true);
1826
+ this._isTransitioning = true;
1825
1827
 
1826
1828
  const complete = () => {
1827
- this.setTransitioning(false);
1829
+ this._isTransitioning = false;
1828
1830
 
1829
1831
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
1830
1832
 
@@ -1838,45 +1840,47 @@
1838
1840
  this._queueCallback(complete, this._element, true);
1839
1841
  }
1840
1842
 
1841
- setTransitioning(isTransitioning) {
1842
- this._isTransitioning = isTransitioning;
1843
+ _isShown(element = this._element) {
1844
+ return element.classList.contains(CLASS_NAME_SHOW$7);
1843
1845
  } // Private
1844
1846
 
1845
1847
 
1846
1848
  _getConfig(config) {
1847
- config = { ...Default$8,
1849
+ config = { ...Default$9,
1850
+ ...Manipulator.getDataAttributes(this._element),
1848
1851
  ...config
1849
1852
  };
1850
1853
  config.toggle = Boolean(config.toggle); // Coerce string values
1851
1854
 
1852
- typeCheckConfig(NAME$9, config, DefaultType$8);
1855
+ config.parent = getElement(config.parent);
1856
+ typeCheckConfig(NAME$a, config, DefaultType$9);
1853
1857
  return config;
1854
1858
  }
1855
1859
 
1856
1860
  _getDimension() {
1857
- return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT;
1861
+ return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1858
1862
  }
1859
1863
 
1860
- _getParent() {
1861
- let {
1862
- parent
1863
- } = this._config;
1864
- parent = getElement(parent);
1865
- const selector = `${SELECTOR_DATA_TOGGLE$4}[data-bs-parent="${parent}"]`;
1866
- SelectorEngine.find(selector, parent).forEach(element => {
1864
+ _initializeChildren() {
1865
+ if (!this._config.parent) {
1866
+ return;
1867
+ }
1868
+
1869
+ const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);
1870
+ SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
1867
1871
  const selected = getElementFromSelector(element);
1868
1872
 
1869
- this._addAriaAndCollapsedClass(selected, [element]);
1873
+ if (selected) {
1874
+ this._addAriaAndCollapsedClass([element], this._isShown(selected));
1875
+ }
1870
1876
  });
1871
- return parent;
1872
1877
  }
1873
1878
 
1874
- _addAriaAndCollapsedClass(element, triggerArray) {
1875
- if (!element || !triggerArray.length) {
1879
+ _addAriaAndCollapsedClass(triggerArray, isOpen) {
1880
+ if (!triggerArray.length) {
1876
1881
  return;
1877
1882
  }
1878
1883
 
1879
- const isOpen = element.classList.contains(CLASS_NAME_SHOW$8);
1880
1884
  triggerArray.forEach(elem => {
1881
1885
  if (isOpen) {
1882
1886
  elem.classList.remove(CLASS_NAME_COLLAPSED);
@@ -1889,33 +1893,23 @@
1889
1893
  } // Static
1890
1894
 
1891
1895
 
1892
- static collapseInterface(element, config) {
1893
- let data = Collapse.getInstance(element);
1894
- const _config = { ...Default$8,
1895
- ...Manipulator.getDataAttributes(element),
1896
- ...(typeof config === 'object' && config ? config : {})
1897
- };
1898
-
1899
- if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
1900
- _config.toggle = false;
1901
- }
1902
-
1903
- if (!data) {
1904
- data = new Collapse(element, _config);
1905
- }
1896
+ static jQueryInterface(config) {
1897
+ return this.each(function () {
1898
+ const _config = {};
1906
1899
 
1907
- if (typeof config === 'string') {
1908
- if (typeof data[config] === 'undefined') {
1909
- throw new TypeError(`No method named "${config}"`);
1900
+ if (typeof config === 'string' && /show|hide/.test(config)) {
1901
+ _config.toggle = false;
1910
1902
  }
1911
1903
 
1912
- data[config]();
1913
- }
1914
- }
1904
+ const data = Collapse.getOrCreateInstance(this, _config);
1915
1905
 
1916
- static jQueryInterface(config) {
1917
- return this.each(function () {
1918
- Collapse.collapseInterface(this, config);
1906
+ if (typeof config === 'string') {
1907
+ if (typeof data[config] === 'undefined') {
1908
+ throw new TypeError(`No method named "${config}"`);
1909
+ }
1910
+
1911
+ data[config]();
1912
+ }
1919
1913
  });
1920
1914
  }
1921
1915
 
@@ -1933,26 +1927,12 @@
1933
1927
  event.preventDefault();
1934
1928
  }
1935
1929
 
1936
- const triggerData = Manipulator.getDataAttributes(this);
1937
1930
  const selector = getSelectorFromElement(this);
1938
1931
  const selectorElements = SelectorEngine.find(selector);
1939
1932
  selectorElements.forEach(element => {
1940
- const data = Collapse.getInstance(element);
1941
- let config;
1942
-
1943
- if (data) {
1944
- // update parent attribute
1945
- if (data._parent === null && typeof triggerData.parent === 'string') {
1946
- data._config.parent = triggerData.parent;
1947
- data._parent = data._getParent();
1948
- }
1949
-
1950
- config = 'toggle';
1951
- } else {
1952
- config = triggerData;
1953
- }
1954
-
1955
- Collapse.collapseInterface(element, config);
1933
+ Collapse.getOrCreateInstance(element, {
1934
+ toggle: false
1935
+ }).toggle();
1956
1936
  });
1957
1937
  });
1958
1938
  /**
@@ -1966,7 +1946,7 @@
1966
1946
 
1967
1947
  /**
1968
1948
  * --------------------------------------------------------------------------
1969
- * Bootstrap (v5.0.2): dropdown.js
1949
+ * Bootstrap (v5.1.0): dropdown.js
1970
1950
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1971
1951
  * --------------------------------------------------------------------------
1972
1952
  */
@@ -1976,27 +1956,26 @@
1976
1956
  * ------------------------------------------------------------------------
1977
1957
  */
1978
1958
 
1979
- const NAME$8 = 'dropdown';
1980
- const DATA_KEY$7 = 'bs.dropdown';
1981
- const EVENT_KEY$7 = `.${DATA_KEY$7}`;
1959
+ const NAME$9 = 'dropdown';
1960
+ const DATA_KEY$8 = 'bs.dropdown';
1961
+ const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1982
1962
  const DATA_API_KEY$4 = '.data-api';
1983
1963
  const ESCAPE_KEY$2 = 'Escape';
1984
1964
  const SPACE_KEY = 'Space';
1985
- const TAB_KEY = 'Tab';
1965
+ const TAB_KEY$1 = 'Tab';
1986
1966
  const ARROW_UP_KEY = 'ArrowUp';
1987
1967
  const ARROW_DOWN_KEY = 'ArrowDown';
1988
1968
  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
1989
1969
 
1990
1970
  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);
1991
- const EVENT_HIDE$4 = `hide${EVENT_KEY$7}`;
1992
- const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$7}`;
1993
- const EVENT_SHOW$4 = `show${EVENT_KEY$7}`;
1994
- const EVENT_SHOWN$4 = `shown${EVENT_KEY$7}`;
1995
- const EVENT_CLICK = `click${EVENT_KEY$7}`;
1996
- const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
1997
- const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$7}${DATA_API_KEY$4}`;
1998
- const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$7}${DATA_API_KEY$4}`;
1999
- const CLASS_NAME_SHOW$7 = 'show';
1971
+ const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;
1972
+ const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;
1973
+ const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;
1974
+ const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;
1975
+ const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;
1976
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;
1977
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;
1978
+ const CLASS_NAME_SHOW$6 = 'show';
2000
1979
  const CLASS_NAME_DROPUP = 'dropup';
2001
1980
  const CLASS_NAME_DROPEND = 'dropend';
2002
1981
  const CLASS_NAME_DROPSTART = 'dropstart';
@@ -2011,7 +1990,7 @@
2011
1990
  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
2012
1991
  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
2013
1992
  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
2014
- const Default$7 = {
1993
+ const Default$8 = {
2015
1994
  offset: [0, 2],
2016
1995
  boundary: 'clippingParents',
2017
1996
  reference: 'toggle',
@@ -2019,7 +1998,7 @@
2019
1998
  popperConfig: null,
2020
1999
  autoClose: true
2021
2000
  };
2022
- const DefaultType$7 = {
2001
+ const DefaultType$8 = {
2023
2002
  offset: '(array|string|function)',
2024
2003
  boundary: '(string|element)',
2025
2004
  reference: '(string|element|object)',
@@ -2040,45 +2019,31 @@
2040
2019
  this._config = this._getConfig(config);
2041
2020
  this._menu = this._getMenuElement();
2042
2021
  this._inNavbar = this._detectNavbar();
2043
-
2044
- this._addEventListeners();
2045
2022
  } // Getters
2046
2023
 
2047
2024
 
2048
2025
  static get Default() {
2049
- return Default$7;
2026
+ return Default$8;
2050
2027
  }
2051
2028
 
2052
2029
  static get DefaultType() {
2053
- return DefaultType$7;
2030
+ return DefaultType$8;
2054
2031
  }
2055
2032
 
2056
2033
  static get NAME() {
2057
- return NAME$8;
2034
+ return NAME$9;
2058
2035
  } // Public
2059
2036
 
2060
2037
 
2061
2038
  toggle() {
2062
- if (isDisabled(this._element)) {
2063
- return;
2064
- }
2065
-
2066
- const isActive = this._element.classList.contains(CLASS_NAME_SHOW$7);
2067
-
2068
- if (isActive) {
2069
- this.hide();
2070
- return;
2071
- }
2072
-
2073
- this.show();
2039
+ return this._isShown() ? this.hide() : this.show();
2074
2040
  }
2075
2041
 
2076
2042
  show() {
2077
- if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW$7)) {
2043
+ if (isDisabled(this._element) || this._isShown(this._menu)) {
2078
2044
  return;
2079
2045
  }
2080
2046
 
2081
- const parent = Dropdown.getParentFromElement(this._element);
2082
2047
  const relatedTarget = {
2083
2048
  relatedTarget: this._element
2084
2049
  };
@@ -2086,34 +2051,14 @@
2086
2051
 
2087
2052
  if (showEvent.defaultPrevented) {
2088
2053
  return;
2089
- } // Totally disable Popper for Dropdowns in Navbar
2054
+ }
2090
2055
 
2056
+ const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar
2091
2057
 
2092
2058
  if (this._inNavbar) {
2093
2059
  Manipulator.setDataAttribute(this._menu, 'popper', 'none');
2094
2060
  } else {
2095
- if (typeof Popper__namespace === 'undefined') {
2096
- throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
2097
- }
2098
-
2099
- let referenceElement = this._element;
2100
-
2101
- if (this._config.reference === 'parent') {
2102
- referenceElement = parent;
2103
- } else if (isElement(this._config.reference)) {
2104
- referenceElement = getElement(this._config.reference);
2105
- } else if (typeof this._config.reference === 'object') {
2106
- referenceElement = this._config.reference;
2107
- }
2108
-
2109
- const popperConfig = this._getPopperConfig();
2110
-
2111
- const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
2112
- this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
2113
-
2114
- if (isDisplayStatic) {
2115
- Manipulator.setDataAttribute(this._menu, 'popper', 'static');
2116
- }
2061
+ this._createPopper(parent);
2117
2062
  } // If this is a touch-enabled device we add extra
2118
2063
  // empty mouseover listeners to the body's immediate children;
2119
2064
  // only needed because of broken event delegation on iOS
@@ -2128,15 +2073,15 @@
2128
2073
 
2129
2074
  this._element.setAttribute('aria-expanded', true);
2130
2075
 
2131
- this._menu.classList.toggle(CLASS_NAME_SHOW$7);
2076
+ this._menu.classList.add(CLASS_NAME_SHOW$6);
2132
2077
 
2133
- this._element.classList.toggle(CLASS_NAME_SHOW$7);
2078
+ this._element.classList.add(CLASS_NAME_SHOW$6);
2134
2079
 
2135
2080
  EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
2136
2081
  }
2137
2082
 
2138
2083
  hide() {
2139
- if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW$7)) {
2084
+ if (isDisabled(this._element) || !this._isShown(this._menu)) {
2140
2085
  return;
2141
2086
  }
2142
2087
 
@@ -2164,13 +2109,6 @@
2164
2109
  } // Private
2165
2110
 
2166
2111
 
2167
- _addEventListeners() {
2168
- EventHandler.on(this._element, EVENT_CLICK, event => {
2169
- event.preventDefault();
2170
- this.toggle();
2171
- });
2172
- }
2173
-
2174
2112
  _completeHide(relatedTarget) {
2175
2113
  const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
2176
2114
 
@@ -2188,9 +2126,9 @@
2188
2126
  this._popper.destroy();
2189
2127
  }
2190
2128
 
2191
- this._menu.classList.remove(CLASS_NAME_SHOW$7);
2129
+ this._menu.classList.remove(CLASS_NAME_SHOW$6);
2192
2130
 
2193
- this._element.classList.remove(CLASS_NAME_SHOW$7);
2131
+ this._element.classList.remove(CLASS_NAME_SHOW$6);
2194
2132
 
2195
2133
  this._element.setAttribute('aria-expanded', 'false');
2196
2134
 
@@ -2203,16 +2141,45 @@
2203
2141
  ...Manipulator.getDataAttributes(this._element),
2204
2142
  ...config
2205
2143
  };
2206
- typeCheckConfig(NAME$8, config, this.constructor.DefaultType);
2144
+ typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
2207
2145
 
2208
2146
  if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
2209
2147
  // Popper virtual elements require a getBoundingClientRect method
2210
- throw new TypeError(`${NAME$8.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2148
+ throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2211
2149
  }
2212
2150
 
2213
2151
  return config;
2214
2152
  }
2215
2153
 
2154
+ _createPopper(parent) {
2155
+ if (typeof Popper__namespace === 'undefined') {
2156
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
2157
+ }
2158
+
2159
+ let referenceElement = this._element;
2160
+
2161
+ if (this._config.reference === 'parent') {
2162
+ referenceElement = parent;
2163
+ } else if (isElement(this._config.reference)) {
2164
+ referenceElement = getElement(this._config.reference);
2165
+ } else if (typeof this._config.reference === 'object') {
2166
+ referenceElement = this._config.reference;
2167
+ }
2168
+
2169
+ const popperConfig = this._getPopperConfig();
2170
+
2171
+ const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
2172
+ this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
2173
+
2174
+ if (isDisplayStatic) {
2175
+ Manipulator.setDataAttribute(this._menu, 'popper', 'static');
2176
+ }
2177
+ }
2178
+
2179
+ _isShown(element = this._element) {
2180
+ return element.classList.contains(CLASS_NAME_SHOW$6);
2181
+ }
2182
+
2216
2183
  _getMenuElement() {
2217
2184
  return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
2218
2185
  }
@@ -2302,26 +2269,24 @@
2302
2269
  } // Static
2303
2270
 
2304
2271
 
2305
- static dropdownInterface(element, config) {
2306
- const data = Dropdown.getOrCreateInstance(element, config);
2272
+ static jQueryInterface(config) {
2273
+ return this.each(function () {
2274
+ const data = Dropdown.getOrCreateInstance(this, config);
2275
+
2276
+ if (typeof config !== 'string') {
2277
+ return;
2278
+ }
2307
2279
 
2308
- if (typeof config === 'string') {
2309
2280
  if (typeof data[config] === 'undefined') {
2310
2281
  throw new TypeError(`No method named "${config}"`);
2311
2282
  }
2312
2283
 
2313
2284
  data[config]();
2314
- }
2315
- }
2316
-
2317
- static jQueryInterface(config) {
2318
- return this.each(function () {
2319
- Dropdown.dropdownInterface(this, config);
2320
2285
  });
2321
2286
  }
2322
2287
 
2323
2288
  static clearMenus(event) {
2324
- if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
2289
+ if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {
2325
2290
  return;
2326
2291
  }
2327
2292
 
@@ -2334,7 +2299,7 @@
2334
2299
  continue;
2335
2300
  }
2336
2301
 
2337
- if (!context._element.classList.contains(CLASS_NAME_SHOW$7)) {
2302
+ if (!context._isShown()) {
2338
2303
  continue;
2339
2304
  }
2340
2305
 
@@ -2351,7 +2316,7 @@
2351
2316
  } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
2352
2317
 
2353
2318
 
2354
- if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
2319
+ if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
2355
2320
  continue;
2356
2321
  }
2357
2322
 
@@ -2380,7 +2345,7 @@
2380
2345
  return;
2381
2346
  }
2382
2347
 
2383
- const isActive = this.classList.contains(CLASS_NAME_SHOW$7);
2348
+ const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
2384
2349
 
2385
2350
  if (!isActive && event.key === ESCAPE_KEY$2) {
2386
2351
  return;
@@ -2393,20 +2358,20 @@
2393
2358
  return;
2394
2359
  }
2395
2360
 
2396
- const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2361
+ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2362
+ const instance = Dropdown.getOrCreateInstance(getToggleButton);
2397
2363
 
2398
2364
  if (event.key === ESCAPE_KEY$2) {
2399
- getToggleButton().focus();
2400
- Dropdown.clearMenus();
2365
+ instance.hide();
2401
2366
  return;
2402
2367
  }
2403
2368
 
2404
2369
  if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
2405
2370
  if (!isActive) {
2406
- getToggleButton().click();
2371
+ instance.show();
2407
2372
  }
2408
2373
 
2409
- Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
2374
+ instance._selectMenuItem(event);
2410
2375
 
2411
2376
  return;
2412
2377
  }
@@ -2430,7 +2395,7 @@
2430
2395
  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
2431
2396
  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
2432
2397
  event.preventDefault();
2433
- Dropdown.dropdownInterface(this);
2398
+ Dropdown.getOrCreateInstance(this).toggle();
2434
2399
  });
2435
2400
  /**
2436
2401
  * ------------------------------------------------------------------------
@@ -2443,7 +2408,7 @@
2443
2408
 
2444
2409
  /**
2445
2410
  * --------------------------------------------------------------------------
2446
- * Bootstrap (v5.0.2): util/scrollBar.js
2411
+ * Bootstrap (v5.1.0): util/scrollBar.js
2447
2412
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2448
2413
  * --------------------------------------------------------------------------
2449
2414
  */
@@ -2547,11 +2512,12 @@
2547
2512
 
2548
2513
  /**
2549
2514
  * --------------------------------------------------------------------------
2550
- * Bootstrap (v5.0.2): util/backdrop.js
2515
+ * Bootstrap (v5.1.0): util/backdrop.js
2551
2516
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2552
2517
  * --------------------------------------------------------------------------
2553
2518
  */
2554
- const Default$6 = {
2519
+ const Default$7 = {
2520
+ className: 'modal-backdrop',
2555
2521
  isVisible: true,
2556
2522
  // if false, we use the backdrop helper without adding any element to the dom
2557
2523
  isAnimated: false,
@@ -2559,17 +2525,17 @@
2559
2525
  // give the choice to place backdrop under different elements
2560
2526
  clickCallback: null
2561
2527
  };
2562
- const DefaultType$6 = {
2528
+ const DefaultType$7 = {
2529
+ className: 'string',
2563
2530
  isVisible: 'boolean',
2564
2531
  isAnimated: 'boolean',
2565
2532
  rootElement: '(element|string)',
2566
2533
  clickCallback: '(function|null)'
2567
2534
  };
2568
- const NAME$7 = 'backdrop';
2569
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
2570
- const CLASS_NAME_FADE$5 = 'fade';
2571
- const CLASS_NAME_SHOW$6 = 'show';
2572
- const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$7}`;
2535
+ const NAME$8 = 'backdrop';
2536
+ const CLASS_NAME_FADE$4 = 'fade';
2537
+ const CLASS_NAME_SHOW$5 = 'show';
2538
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;
2573
2539
 
2574
2540
  class Backdrop {
2575
2541
  constructor(config) {
@@ -2590,7 +2556,7 @@
2590
2556
  reflow(this._getElement());
2591
2557
  }
2592
2558
 
2593
- this._getElement().classList.add(CLASS_NAME_SHOW$6);
2559
+ this._getElement().classList.add(CLASS_NAME_SHOW$5);
2594
2560
 
2595
2561
  this._emulateAnimation(() => {
2596
2562
  execute(callback);
@@ -2603,7 +2569,7 @@
2603
2569
  return;
2604
2570
  }
2605
2571
 
2606
- this._getElement().classList.remove(CLASS_NAME_SHOW$6);
2572
+ this._getElement().classList.remove(CLASS_NAME_SHOW$5);
2607
2573
 
2608
2574
  this._emulateAnimation(() => {
2609
2575
  this.dispose();
@@ -2615,10 +2581,10 @@
2615
2581
  _getElement() {
2616
2582
  if (!this._element) {
2617
2583
  const backdrop = document.createElement('div');
2618
- backdrop.className = CLASS_NAME_BACKDROP;
2584
+ backdrop.className = this._config.className;
2619
2585
 
2620
2586
  if (this._config.isAnimated) {
2621
- backdrop.classList.add(CLASS_NAME_FADE$5);
2587
+ backdrop.classList.add(CLASS_NAME_FADE$4);
2622
2588
  }
2623
2589
 
2624
2590
  this._element = backdrop;
@@ -2628,12 +2594,12 @@
2628
2594
  }
2629
2595
 
2630
2596
  _getConfig(config) {
2631
- config = { ...Default$6,
2597
+ config = { ...Default$7,
2632
2598
  ...(typeof config === 'object' ? config : {})
2633
2599
  }; // use getElement() with the default "body" to get a fresh Element on each instantiation
2634
2600
 
2635
2601
  config.rootElement = getElement(config.rootElement);
2636
- typeCheckConfig(NAME$7, config, DefaultType$6);
2602
+ typeCheckConfig(NAME$8, config, DefaultType$7);
2637
2603
  return config;
2638
2604
  }
2639
2605
 
@@ -2642,7 +2608,7 @@
2642
2608
  return;
2643
2609
  }
2644
2610
 
2645
- this._config.rootElement.appendChild(this._getElement());
2611
+ this._config.rootElement.append(this._getElement());
2646
2612
 
2647
2613
  EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
2648
2614
  execute(this._config.clickCallback);
@@ -2670,7 +2636,110 @@
2670
2636
 
2671
2637
  /**
2672
2638
  * --------------------------------------------------------------------------
2673
- * Bootstrap (v5.0.2): modal.js
2639
+ * Bootstrap (v5.1.0): util/focustrap.js
2640
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2641
+ * --------------------------------------------------------------------------
2642
+ */
2643
+ const Default$6 = {
2644
+ trapElement: null,
2645
+ // The element to trap focus inside of
2646
+ autofocus: true
2647
+ };
2648
+ const DefaultType$6 = {
2649
+ trapElement: 'element',
2650
+ autofocus: 'boolean'
2651
+ };
2652
+ const NAME$7 = 'focustrap';
2653
+ const DATA_KEY$7 = 'bs.focustrap';
2654
+ const EVENT_KEY$7 = `.${DATA_KEY$7}`;
2655
+ const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;
2656
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
2657
+ const TAB_KEY = 'Tab';
2658
+ const TAB_NAV_FORWARD = 'forward';
2659
+ const TAB_NAV_BACKWARD = 'backward';
2660
+
2661
+ class FocusTrap {
2662
+ constructor(config) {
2663
+ this._config = this._getConfig(config);
2664
+ this._isActive = false;
2665
+ this._lastTabNavDirection = null;
2666
+ }
2667
+
2668
+ activate() {
2669
+ const {
2670
+ trapElement,
2671
+ autofocus
2672
+ } = this._config;
2673
+
2674
+ if (this._isActive) {
2675
+ return;
2676
+ }
2677
+
2678
+ if (autofocus) {
2679
+ trapElement.focus();
2680
+ }
2681
+
2682
+ EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop
2683
+
2684
+ EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));
2685
+ EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
2686
+ this._isActive = true;
2687
+ }
2688
+
2689
+ deactivate() {
2690
+ if (!this._isActive) {
2691
+ return;
2692
+ }
2693
+
2694
+ this._isActive = false;
2695
+ EventHandler.off(document, EVENT_KEY$7);
2696
+ } // Private
2697
+
2698
+
2699
+ _handleFocusin(event) {
2700
+ const {
2701
+ target
2702
+ } = event;
2703
+ const {
2704
+ trapElement
2705
+ } = this._config;
2706
+
2707
+ if (target === document || target === trapElement || trapElement.contains(target)) {
2708
+ return;
2709
+ }
2710
+
2711
+ const elements = SelectorEngine.focusableChildren(trapElement);
2712
+
2713
+ if (elements.length === 0) {
2714
+ trapElement.focus();
2715
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
2716
+ elements[elements.length - 1].focus();
2717
+ } else {
2718
+ elements[0].focus();
2719
+ }
2720
+ }
2721
+
2722
+ _handleKeydown(event) {
2723
+ if (event.key !== TAB_KEY) {
2724
+ return;
2725
+ }
2726
+
2727
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
2728
+ }
2729
+
2730
+ _getConfig(config) {
2731
+ config = { ...Default$6,
2732
+ ...(typeof config === 'object' ? config : {})
2733
+ };
2734
+ typeCheckConfig(NAME$7, config, DefaultType$6);
2735
+ return config;
2736
+ }
2737
+
2738
+ }
2739
+
2740
+ /**
2741
+ * --------------------------------------------------------------------------
2742
+ * Bootstrap (v5.1.0): modal.js
2674
2743
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2675
2744
  * --------------------------------------------------------------------------
2676
2745
  */
@@ -2700,21 +2769,19 @@
2700
2769
  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;
2701
2770
  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;
2702
2771
  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;
2703
- const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$6}`;
2704
2772
  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;
2705
- const EVENT_CLICK_DISMISS$2 = `click.dismiss${EVENT_KEY$6}`;
2773
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
2706
2774
  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
2707
2775
  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
2708
2776
  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
2709
2777
  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
2710
2778
  const CLASS_NAME_OPEN = 'modal-open';
2711
- const CLASS_NAME_FADE$4 = 'fade';
2712
- const CLASS_NAME_SHOW$5 = 'show';
2779
+ const CLASS_NAME_FADE$3 = 'fade';
2780
+ const CLASS_NAME_SHOW$4 = 'show';
2713
2781
  const CLASS_NAME_STATIC = 'modal-static';
2714
2782
  const SELECTOR_DIALOG = '.modal-dialog';
2715
2783
  const SELECTOR_MODAL_BODY = '.modal-body';
2716
2784
  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
2717
- const SELECTOR_DATA_DISMISS$2 = '[data-bs-dismiss="modal"]';
2718
2785
  /**
2719
2786
  * ------------------------------------------------------------------------
2720
2787
  * Class Definition
@@ -2727,6 +2794,7 @@
2727
2794
  this._config = this._getConfig(config);
2728
2795
  this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
2729
2796
  this._backdrop = this._initializeBackDrop();
2797
+ this._focustrap = this._initializeFocusTrap();
2730
2798
  this._isShown = false;
2731
2799
  this._ignoreBackdropClick = false;
2732
2800
  this._isTransitioning = false;
@@ -2776,7 +2844,6 @@
2776
2844
 
2777
2845
  this._setResizeEvent();
2778
2846
 
2779
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, SELECTOR_DATA_DISMISS$2, event => this.hide(event));
2780
2847
  EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
2781
2848
  EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
2782
2849
  if (event.target === this._element) {
@@ -2788,11 +2855,7 @@
2788
2855
  this._showBackdrop(() => this._showElement(relatedTarget));
2789
2856
  }
2790
2857
 
2791
- hide(event) {
2792
- if (event && ['A', 'AREA'].includes(event.target.tagName)) {
2793
- event.preventDefault();
2794
- }
2795
-
2858
+ hide() {
2796
2859
  if (!this._isShown || this._isTransitioning) {
2797
2860
  return;
2798
2861
  }
@@ -2815,11 +2878,11 @@
2815
2878
 
2816
2879
  this._setResizeEvent();
2817
2880
 
2818
- EventHandler.off(document, EVENT_FOCUSIN$2);
2881
+ this._focustrap.deactivate();
2819
2882
 
2820
- this._element.classList.remove(CLASS_NAME_SHOW$5);
2883
+ this._element.classList.remove(CLASS_NAME_SHOW$4);
2821
2884
 
2822
- EventHandler.off(this._element, EVENT_CLICK_DISMISS$2);
2885
+ EventHandler.off(this._element, EVENT_CLICK_DISMISS);
2823
2886
  EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
2824
2887
 
2825
2888
  this._queueCallback(() => this._hideModal(), this._element, isAnimated);
@@ -2830,14 +2893,9 @@
2830
2893
 
2831
2894
  this._backdrop.dispose();
2832
2895
 
2833
- super.dispose();
2834
- /**
2835
- * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
2836
- * Do not move `document` in `htmlElements` array
2837
- * It will remove `EVENT_CLICK_DATA_API` event that should remain
2838
- */
2896
+ this._focustrap.deactivate();
2839
2897
 
2840
- EventHandler.off(document, EVENT_FOCUSIN$2);
2898
+ super.dispose();
2841
2899
  }
2842
2900
 
2843
2901
  handleUpdate() {
@@ -2853,6 +2911,12 @@
2853
2911
  });
2854
2912
  }
2855
2913
 
2914
+ _initializeFocusTrap() {
2915
+ return new FocusTrap({
2916
+ trapElement: this._element
2917
+ });
2918
+ }
2919
+
2856
2920
  _getConfig(config) {
2857
2921
  config = { ...Default$5,
2858
2922
  ...Manipulator.getDataAttributes(this._element),
@@ -2869,7 +2933,7 @@
2869
2933
 
2870
2934
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
2871
2935
  // Don't move modal's DOM position
2872
- document.body.appendChild(this._element);
2936
+ document.body.append(this._element);
2873
2937
  }
2874
2938
 
2875
2939
  this._element.style.display = 'block';
@@ -2890,15 +2954,11 @@
2890
2954
  reflow(this._element);
2891
2955
  }
2892
2956
 
2893
- this._element.classList.add(CLASS_NAME_SHOW$5);
2894
-
2895
- if (this._config.focus) {
2896
- this._enforceFocus();
2897
- }
2957
+ this._element.classList.add(CLASS_NAME_SHOW$4);
2898
2958
 
2899
2959
  const transitionComplete = () => {
2900
2960
  if (this._config.focus) {
2901
- this._element.focus();
2961
+ this._focustrap.activate();
2902
2962
  }
2903
2963
 
2904
2964
  this._isTransitioning = false;
@@ -2910,16 +2970,6 @@
2910
2970
  this._queueCallback(transitionComplete, this._dialog, isAnimated);
2911
2971
  }
2912
2972
 
2913
- _enforceFocus() {
2914
- EventHandler.off(document, EVENT_FOCUSIN$2); // guard against infinite focus loop
2915
-
2916
- EventHandler.on(document, EVENT_FOCUSIN$2, event => {
2917
- if (document !== event.target && this._element !== event.target && !this._element.contains(event.target)) {
2918
- this._element.focus();
2919
- }
2920
- });
2921
- }
2922
-
2923
2973
  _setEscapeEvent() {
2924
2974
  if (this._isShown) {
2925
2975
  EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
@@ -2966,7 +3016,7 @@
2966
3016
  }
2967
3017
 
2968
3018
  _showBackdrop(callback) {
2969
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, event => {
3019
+ EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {
2970
3020
  if (this._ignoreBackdropClick) {
2971
3021
  this._ignoreBackdropClick = false;
2972
3022
  return;
@@ -2987,7 +3037,7 @@
2987
3037
  }
2988
3038
 
2989
3039
  _isAnimated() {
2990
- return this._element.classList.contains(CLASS_NAME_FADE$4);
3040
+ return this._element.classList.contains(CLASS_NAME_FADE$3);
2991
3041
  }
2992
3042
 
2993
3043
  _triggerBackdropTransition() {
@@ -3098,6 +3148,7 @@
3098
3148
  const data = Modal.getOrCreateInstance(target);
3099
3149
  data.toggle(this);
3100
3150
  });
3151
+ enableDismissTrigger(Modal);
3101
3152
  /**
3102
3153
  * ------------------------------------------------------------------------
3103
3154
  * jQuery
@@ -3109,7 +3160,7 @@
3109
3160
 
3110
3161
  /**
3111
3162
  * --------------------------------------------------------------------------
3112
- * Bootstrap (v5.0.2): offcanvas.js
3163
+ * Bootstrap (v5.1.0): offcanvas.js
3113
3164
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
3114
3165
  * --------------------------------------------------------------------------
3115
3166
  */
@@ -3135,17 +3186,15 @@
3135
3186
  keyboard: 'boolean',
3136
3187
  scroll: 'boolean'
3137
3188
  };
3138
- const CLASS_NAME_SHOW$4 = 'show';
3189
+ const CLASS_NAME_SHOW$3 = 'show';
3190
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
3139
3191
  const OPEN_SELECTOR = '.offcanvas.show';
3140
3192
  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
3141
3193
  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
3142
3194
  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
3143
3195
  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;
3144
- const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$5}`;
3145
3196
  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
3146
- const EVENT_CLICK_DISMISS$1 = `click.dismiss${EVENT_KEY$5}`;
3147
3197
  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
3148
- const SELECTOR_DATA_DISMISS$1 = '[data-bs-dismiss="offcanvas"]';
3149
3198
  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
3150
3199
  /**
3151
3200
  * ------------------------------------------------------------------------
@@ -3159,6 +3208,7 @@
3159
3208
  this._config = this._getConfig(config);
3160
3209
  this._isShown = false;
3161
3210
  this._backdrop = this._initializeBackDrop();
3211
+ this._focustrap = this._initializeFocusTrap();
3162
3212
 
3163
3213
  this._addEventListeners();
3164
3214
  } // Getters
@@ -3197,8 +3247,6 @@
3197
3247
 
3198
3248
  if (!this._config.scroll) {
3199
3249
  new ScrollBarHelper().hide();
3200
-
3201
- this._enforceFocusOnElement(this._element);
3202
3250
  }
3203
3251
 
3204
3252
  this._element.removeAttribute('aria-hidden');
@@ -3207,9 +3255,13 @@
3207
3255
 
3208
3256
  this._element.setAttribute('role', 'dialog');
3209
3257
 
3210
- this._element.classList.add(CLASS_NAME_SHOW$4);
3258
+ this._element.classList.add(CLASS_NAME_SHOW$3);
3211
3259
 
3212
3260
  const completeCallBack = () => {
3261
+ if (!this._config.scroll) {
3262
+ this._focustrap.activate();
3263
+ }
3264
+
3213
3265
  EventHandler.trigger(this._element, EVENT_SHOWN$2, {
3214
3266
  relatedTarget
3215
3267
  });
@@ -3229,13 +3281,13 @@
3229
3281
  return;
3230
3282
  }
3231
3283
 
3232
- EventHandler.off(document, EVENT_FOCUSIN$1);
3284
+ this._focustrap.deactivate();
3233
3285
 
3234
3286
  this._element.blur();
3235
3287
 
3236
3288
  this._isShown = false;
3237
3289
 
3238
- this._element.classList.remove(CLASS_NAME_SHOW$4);
3290
+ this._element.classList.remove(CLASS_NAME_SHOW$3);
3239
3291
 
3240
3292
  this._backdrop.hide();
3241
3293
 
@@ -3261,8 +3313,9 @@
3261
3313
  dispose() {
3262
3314
  this._backdrop.dispose();
3263
3315
 
3316
+ this._focustrap.deactivate();
3317
+
3264
3318
  super.dispose();
3265
- EventHandler.off(document, EVENT_FOCUSIN$1);
3266
3319
  } // Private
3267
3320
 
3268
3321
 
@@ -3277,6 +3330,7 @@
3277
3330
 
3278
3331
  _initializeBackDrop() {
3279
3332
  return new Backdrop({
3333
+ className: CLASS_NAME_BACKDROP,
3280
3334
  isVisible: this._config.backdrop,
3281
3335
  isAnimated: true,
3282
3336
  rootElement: this._element.parentNode,
@@ -3284,19 +3338,13 @@
3284
3338
  });
3285
3339
  }
3286
3340
 
3287
- _enforceFocusOnElement(element) {
3288
- EventHandler.off(document, EVENT_FOCUSIN$1); // guard against infinite focus loop
3289
-
3290
- EventHandler.on(document, EVENT_FOCUSIN$1, event => {
3291
- if (document !== event.target && element !== event.target && !element.contains(event.target)) {
3292
- element.focus();
3293
- }
3341
+ _initializeFocusTrap() {
3342
+ return new FocusTrap({
3343
+ trapElement: this._element
3294
3344
  });
3295
- element.focus();
3296
3345
  }
3297
3346
 
3298
3347
  _addEventListeners() {
3299
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, () => this.hide());
3300
3348
  EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
3301
3349
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
3302
3350
  this.hide();
@@ -3357,6 +3405,7 @@
3357
3405
  data.toggle(this);
3358
3406
  });
3359
3407
  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
3408
+ enableDismissTrigger(Offcanvas);
3360
3409
  /**
3361
3410
  * ------------------------------------------------------------------------
3362
3411
  * jQuery
@@ -3367,7 +3416,7 @@
3367
3416
 
3368
3417
  /**
3369
3418
  * --------------------------------------------------------------------------
3370
- * Bootstrap (v5.0.2): util/sanitizer.js
3419
+ * Bootstrap (v5.1.0): util/sanitizer.js
3371
3420
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3372
3421
  * --------------------------------------------------------------------------
3373
3422
  */
@@ -3480,7 +3529,7 @@
3480
3529
 
3481
3530
  /**
3482
3531
  * --------------------------------------------------------------------------
3483
- * Bootstrap (v5.0.2): tooltip.js
3532
+ * Bootstrap (v5.1.0): tooltip.js
3484
3533
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3485
3534
  * --------------------------------------------------------------------------
3486
3535
  */
@@ -3494,7 +3543,6 @@
3494
3543
  const DATA_KEY$4 = 'bs.tooltip';
3495
3544
  const EVENT_KEY$4 = `.${DATA_KEY$4}`;
3496
3545
  const CLASS_PREFIX$1 = 'bs-tooltip';
3497
- const BSCLS_PREFIX_REGEX$1 = new RegExp(`(^|\\s)${CLASS_PREFIX$1}\\S+`, 'g');
3498
3546
  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
3499
3547
  const DefaultType$3 = {
3500
3548
  animation: 'boolean',
@@ -3553,12 +3601,14 @@
3553
3601
  MOUSEENTER: `mouseenter${EVENT_KEY$4}`,
3554
3602
  MOUSELEAVE: `mouseleave${EVENT_KEY$4}`
3555
3603
  };
3556
- const CLASS_NAME_FADE$3 = 'fade';
3604
+ const CLASS_NAME_FADE$2 = 'fade';
3557
3605
  const CLASS_NAME_MODAL = 'modal';
3558
- const CLASS_NAME_SHOW$3 = 'show';
3606
+ const CLASS_NAME_SHOW$2 = 'show';
3559
3607
  const HOVER_STATE_SHOW = 'show';
3560
3608
  const HOVER_STATE_OUT = 'out';
3561
3609
  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
3610
+ const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
3611
+ const EVENT_MODAL_HIDE = 'hide.bs.modal';
3562
3612
  const TRIGGER_HOVER = 'hover';
3563
3613
  const TRIGGER_FOCUS = 'focus';
3564
3614
  const TRIGGER_CLICK = 'click';
@@ -3635,7 +3685,7 @@
3635
3685
  context._leave(null, context);
3636
3686
  }
3637
3687
  } else {
3638
- if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$3)) {
3688
+ if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {
3639
3689
  this._leave(null, this);
3640
3690
 
3641
3691
  return;
@@ -3647,7 +3697,7 @@
3647
3697
 
3648
3698
  dispose() {
3649
3699
  clearTimeout(this._timeout);
3650
- EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
3700
+ EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3651
3701
 
3652
3702
  if (this.tip) {
3653
3703
  this.tip.remove();
@@ -3683,10 +3733,8 @@
3683
3733
 
3684
3734
  this._element.setAttribute('aria-describedby', tipId);
3685
3735
 
3686
- this.setContent();
3687
-
3688
3736
  if (this._config.animation) {
3689
- tip.classList.add(CLASS_NAME_FADE$3);
3737
+ tip.classList.add(CLASS_NAME_FADE$2);
3690
3738
  }
3691
3739
 
3692
3740
  const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
@@ -3701,7 +3749,7 @@
3701
3749
  Data.set(tip, this.constructor.DATA_KEY, this);
3702
3750
 
3703
3751
  if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
3704
- container.appendChild(tip);
3752
+ container.append(tip);
3705
3753
  EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
3706
3754
  }
3707
3755
 
@@ -3711,8 +3759,9 @@
3711
3759
  this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
3712
3760
  }
3713
3761
 
3714
- tip.classList.add(CLASS_NAME_SHOW$3);
3715
- const customClass = typeof this._config.customClass === 'function' ? this._config.customClass() : this._config.customClass;
3762
+ tip.classList.add(CLASS_NAME_SHOW$2);
3763
+
3764
+ const customClass = this._resolvePossibleFunction(this._config.customClass);
3716
3765
 
3717
3766
  if (customClass) {
3718
3767
  tip.classList.add(...customClass.split(' '));
@@ -3738,7 +3787,7 @@
3738
3787
  }
3739
3788
  };
3740
3789
 
3741
- const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$3);
3790
+ const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3742
3791
 
3743
3792
  this._queueCallback(complete, this.tip, isAnimated);
3744
3793
  }
@@ -3778,7 +3827,7 @@
3778
3827
  return;
3779
3828
  }
3780
3829
 
3781
- tip.classList.remove(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra
3830
+ tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
3782
3831
  // empty mouseover listeners we added for iOS support
3783
3832
 
3784
3833
  if ('ontouchstart' in document.documentElement) {
@@ -3788,7 +3837,7 @@
3788
3837
  this._activeTrigger[TRIGGER_CLICK] = false;
3789
3838
  this._activeTrigger[TRIGGER_FOCUS] = false;
3790
3839
  this._activeTrigger[TRIGGER_HOVER] = false;
3791
- const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$3);
3840
+ const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3792
3841
 
3793
3842
  this._queueCallback(complete, this.tip, isAnimated);
3794
3843
 
@@ -3813,14 +3862,27 @@
3813
3862
 
3814
3863
  const element = document.createElement('div');
3815
3864
  element.innerHTML = this._config.template;
3816
- this.tip = element.children[0];
3865
+ const tip = element.children[0];
3866
+ this.setContent(tip);
3867
+ tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
3868
+ this.tip = tip;
3817
3869
  return this.tip;
3818
3870
  }
3819
3871
 
3820
- setContent() {
3821
- const tip = this.getTipElement();
3822
- this.setElementContent(SelectorEngine.findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle());
3823
- tip.classList.remove(CLASS_NAME_FADE$3, CLASS_NAME_SHOW$3);
3872
+ setContent(tip) {
3873
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
3874
+ }
3875
+
3876
+ _sanitizeAndSetContent(template, content, selector) {
3877
+ const templateElement = SelectorEngine.findOne(selector, template);
3878
+
3879
+ if (!content && templateElement) {
3880
+ templateElement.remove();
3881
+ return;
3882
+ } // we use append for html objects to maintain js events
3883
+
3884
+
3885
+ this.setElementContent(templateElement, content);
3824
3886
  }
3825
3887
 
3826
3888
  setElementContent(element, content) {
@@ -3834,7 +3896,7 @@
3834
3896
  if (this._config.html) {
3835
3897
  if (content.parentNode !== element) {
3836
3898
  element.innerHTML = '';
3837
- element.appendChild(content);
3899
+ element.append(content);
3838
3900
  }
3839
3901
  } else {
3840
3902
  element.textContent = content.textContent;
@@ -3855,13 +3917,9 @@
3855
3917
  }
3856
3918
 
3857
3919
  getTitle() {
3858
- let title = this._element.getAttribute('data-bs-original-title');
3859
-
3860
- if (!title) {
3861
- title = typeof this._config.title === 'function' ? this._config.title.call(this._element) : this._config.title;
3862
- }
3920
+ const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
3863
3921
 
3864
- return title;
3922
+ return this._resolvePossibleFunction(title);
3865
3923
  }
3866
3924
 
3867
3925
  updateAttachment(attachment) {
@@ -3878,15 +3936,7 @@
3878
3936
 
3879
3937
 
3880
3938
  _initializeOnDelegatedTarget(event, context) {
3881
- const dataKey = this.constructor.DATA_KEY;
3882
- context = context || Data.get(event.delegateTarget, dataKey);
3883
-
3884
- if (!context) {
3885
- context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
3886
- Data.set(event.delegateTarget, dataKey, context);
3887
- }
3888
-
3889
- return context;
3939
+ return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
3890
3940
  }
3891
3941
 
3892
3942
  _getOffset() {
@@ -3905,6 +3955,10 @@
3905
3955
  return offset;
3906
3956
  }
3907
3957
 
3958
+ _resolvePossibleFunction(content) {
3959
+ return typeof content === 'function' ? content.call(this._element) : content;
3960
+ }
3961
+
3908
3962
  _getPopperConfig(attachment) {
3909
3963
  const defaultBsPopperConfig = {
3910
3964
  placement: attachment,
@@ -3946,7 +4000,7 @@
3946
4000
  }
3947
4001
 
3948
4002
  _addAttachmentClass(attachment) {
3949
- this.getTipElement().classList.add(`${CLASS_PREFIX$1}-${this.updateAttachment(attachment)}`);
4003
+ this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
3950
4004
  }
3951
4005
 
3952
4006
  _getAttachment(placement) {
@@ -3973,7 +4027,7 @@
3973
4027
  }
3974
4028
  };
3975
4029
 
3976
- EventHandler.on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
4030
+ EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3977
4031
 
3978
4032
  if (this._config.selector) {
3979
4033
  this._config = { ...this._config,
@@ -4008,7 +4062,7 @@
4008
4062
  context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
4009
4063
  }
4010
4064
 
4011
- if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) {
4065
+ if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {
4012
4066
  context._hoverState = HOVER_STATE_SHOW;
4013
4067
  return;
4014
4068
  }
@@ -4104,26 +4158,32 @@
4104
4158
  _getDelegateConfig() {
4105
4159
  const config = {};
4106
4160
 
4107
- if (this._config) {
4108
- for (const key in this._config) {
4109
- if (this.constructor.Default[key] !== this._config[key]) {
4110
- config[key] = this._config[key];
4111
- }
4161
+ for (const key in this._config) {
4162
+ if (this.constructor.Default[key] !== this._config[key]) {
4163
+ config[key] = this._config[key];
4112
4164
  }
4113
- }
4165
+ } // In the future can be replaced with:
4166
+ // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
4167
+ // `Object.fromEntries(keysWithDifferentValues)`
4168
+
4114
4169
 
4115
4170
  return config;
4116
4171
  }
4117
4172
 
4118
4173
  _cleanTipClass() {
4119
4174
  const tip = this.getTipElement();
4120
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX$1);
4175
+ const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g');
4176
+ const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);
4121
4177
 
4122
4178
  if (tabClass !== null && tabClass.length > 0) {
4123
4179
  tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
4124
4180
  }
4125
4181
  }
4126
4182
 
4183
+ _getBasicClassPrefix() {
4184
+ return CLASS_PREFIX$1;
4185
+ }
4186
+
4127
4187
  _handlePopperPlacementChange(popperData) {
4128
4188
  const {
4129
4189
  state
@@ -4168,7 +4228,7 @@
4168
4228
 
4169
4229
  /**
4170
4230
  * --------------------------------------------------------------------------
4171
- * Bootstrap (v5.0.2): popover.js
4231
+ * Bootstrap (v5.1.0): popover.js
4172
4232
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4173
4233
  * --------------------------------------------------------------------------
4174
4234
  */
@@ -4182,7 +4242,6 @@
4182
4242
  const DATA_KEY$3 = 'bs.popover';
4183
4243
  const EVENT_KEY$3 = `.${DATA_KEY$3}`;
4184
4244
  const CLASS_PREFIX = 'bs-popover';
4185
- const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
4186
4245
  const Default$2 = { ...Tooltip.Default,
4187
4246
  placement: 'right',
4188
4247
  offset: [0, 8],
@@ -4205,8 +4264,6 @@
4205
4264
  MOUSEENTER: `mouseenter${EVENT_KEY$3}`,
4206
4265
  MOUSELEAVE: `mouseleave${EVENT_KEY$3}`
4207
4266
  };
4208
- const CLASS_NAME_FADE$2 = 'fade';
4209
- const CLASS_NAME_SHOW$2 = 'show';
4210
4267
  const SELECTOR_TITLE = '.popover-header';
4211
4268
  const SELECTOR_CONTENT = '.popover-body';
4212
4269
  /**
@@ -4238,55 +4295,19 @@
4238
4295
  return this.getTitle() || this._getContent();
4239
4296
  }
4240
4297
 
4241
- getTipElement() {
4242
- if (this.tip) {
4243
- return this.tip;
4244
- }
4245
-
4246
- this.tip = super.getTipElement();
4247
-
4248
- if (!this.getTitle()) {
4249
- SelectorEngine.findOne(SELECTOR_TITLE, this.tip).remove();
4250
- }
4251
-
4252
- if (!this._getContent()) {
4253
- SelectorEngine.findOne(SELECTOR_CONTENT, this.tip).remove();
4254
- }
4255
-
4256
- return this.tip;
4257
- }
4258
-
4259
- setContent() {
4260
- const tip = this.getTipElement(); // we use append for html objects to maintain js events
4261
-
4262
- this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle());
4263
-
4264
- let content = this._getContent();
4298
+ setContent(tip) {
4299
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
4265
4300
 
4266
- if (typeof content === 'function') {
4267
- content = content.call(this._element);
4268
- }
4269
-
4270
- this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content);
4271
- tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
4301
+ this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
4272
4302
  } // Private
4273
4303
 
4274
4304
 
4275
- _addAttachmentClass(attachment) {
4276
- this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
4277
- }
4278
-
4279
4305
  _getContent() {
4280
- return this._element.getAttribute('data-bs-content') || this._config.content;
4306
+ return this._resolvePossibleFunction(this._config.content);
4281
4307
  }
4282
4308
 
4283
- _cleanTipClass() {
4284
- const tip = this.getTipElement();
4285
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
4286
-
4287
- if (tabClass !== null && tabClass.length > 0) {
4288
- tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
4289
- }
4309
+ _getBasicClassPrefix() {
4310
+ return CLASS_PREFIX;
4290
4311
  } // Static
4291
4312
 
4292
4313
 
@@ -4317,7 +4338,7 @@
4317
4338
 
4318
4339
  /**
4319
4340
  * --------------------------------------------------------------------------
4320
- * Bootstrap (v5.0.2): scrollspy.js
4341
+ * Bootstrap (v5.1.0): scrollspy.js
4321
4342
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4322
4343
  * --------------------------------------------------------------------------
4323
4344
  */
@@ -4351,6 +4372,7 @@
4351
4372
  const SELECTOR_NAV_LINKS = '.nav-link';
4352
4373
  const SELECTOR_NAV_ITEMS = '.nav-item';
4353
4374
  const SELECTOR_LIST_ITEMS = '.list-group-item';
4375
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
4354
4376
  const SELECTOR_DROPDOWN$1 = '.dropdown';
4355
4377
  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
4356
4378
  const METHOD_OFFSET = 'offset';
@@ -4366,7 +4388,6 @@
4366
4388
  super(element);
4367
4389
  this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
4368
4390
  this._config = this._getConfig(config);
4369
- this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
4370
4391
  this._offsets = [];
4371
4392
  this._targets = [];
4372
4393
  this._activeTarget = null;
@@ -4394,7 +4415,7 @@
4394
4415
  this._offsets = [];
4395
4416
  this._targets = [];
4396
4417
  this._scrollHeight = this._getScrollHeight();
4397
- const targets = SelectorEngine.find(this._selector);
4418
+ const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);
4398
4419
  targets.map(element => {
4399
4420
  const targetSelector = getSelectorFromElement(element);
4400
4421
  const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;
@@ -4426,20 +4447,7 @@
4426
4447
  ...Manipulator.getDataAttributes(this._element),
4427
4448
  ...(typeof config === 'object' && config ? config : {})
4428
4449
  };
4429
-
4430
- if (typeof config.target !== 'string' && isElement(config.target)) {
4431
- let {
4432
- id
4433
- } = config.target;
4434
-
4435
- if (!id) {
4436
- id = getUID(NAME$2);
4437
- config.target.id = id;
4438
- }
4439
-
4440
- config.target = `#${id}`;
4441
- }
4442
-
4450
+ config.target = getElement(config.target) || document.documentElement;
4443
4451
  typeCheckConfig(NAME$2, config, DefaultType$1);
4444
4452
  return config;
4445
4453
  }
@@ -4499,16 +4507,13 @@
4499
4507
 
4500
4508
  this._clear();
4501
4509
 
4502
- const queries = this._selector.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
4503
-
4504
- const link = SelectorEngine.findOne(queries.join(','));
4510
+ const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
4511
+ const link = SelectorEngine.findOne(queries.join(','), this._config.target);
4512
+ link.classList.add(CLASS_NAME_ACTIVE$1);
4505
4513
 
4506
4514
  if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
4507
4515
  SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);
4508
- link.classList.add(CLASS_NAME_ACTIVE$1);
4509
4516
  } else {
4510
- // Set triggered link as active
4511
- link.classList.add(CLASS_NAME_ACTIVE$1);
4512
4517
  SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {
4513
4518
  // Set triggered links parents as active
4514
4519
  // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
@@ -4526,7 +4531,7 @@
4526
4531
  }
4527
4532
 
4528
4533
  _clear() {
4529
- SelectorEngine.find(this._selector).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));
4534
+ SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));
4530
4535
  } // Static
4531
4536
 
4532
4537
 
@@ -4568,7 +4573,7 @@
4568
4573
 
4569
4574
  /**
4570
4575
  * --------------------------------------------------------------------------
4571
- * Bootstrap (v5.0.2): tab.js
4576
+ * Bootstrap (v5.1.0): tab.js
4572
4577
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4573
4578
  * --------------------------------------------------------------------------
4574
4579
  */
@@ -4766,7 +4771,7 @@
4766
4771
 
4767
4772
  /**
4768
4773
  * --------------------------------------------------------------------------
4769
- * Bootstrap (v5.0.2): toast.js
4774
+ * Bootstrap (v5.1.0): toast.js
4770
4775
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4771
4776
  * --------------------------------------------------------------------------
4772
4777
  */
@@ -4779,7 +4784,6 @@
4779
4784
  const NAME = 'toast';
4780
4785
  const DATA_KEY = 'bs.toast';
4781
4786
  const EVENT_KEY = `.${DATA_KEY}`;
4782
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
4783
4787
  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
4784
4788
  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
4785
4789
  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
@@ -4789,7 +4793,8 @@
4789
4793
  const EVENT_SHOW = `show${EVENT_KEY}`;
4790
4794
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
4791
4795
  const CLASS_NAME_FADE = 'fade';
4792
- const CLASS_NAME_HIDE = 'hide';
4796
+ const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
4797
+
4793
4798
  const CLASS_NAME_SHOW = 'show';
4794
4799
  const CLASS_NAME_SHOWING = 'showing';
4795
4800
  const DefaultType = {
@@ -4802,7 +4807,6 @@
4802
4807
  autohide: true,
4803
4808
  delay: 5000
4804
4809
  };
4805
- const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="toast"]';
4806
4810
  /**
4807
4811
  * ------------------------------------------------------------------------
4808
4812
  * Class Definition
@@ -4850,17 +4854,18 @@
4850
4854
  const complete = () => {
4851
4855
  this._element.classList.remove(CLASS_NAME_SHOWING);
4852
4856
 
4853
- this._element.classList.add(CLASS_NAME_SHOW);
4854
-
4855
4857
  EventHandler.trigger(this._element, EVENT_SHOWN);
4856
4858
 
4857
4859
  this._maybeScheduleHide();
4858
4860
  };
4859
4861
 
4860
- this._element.classList.remove(CLASS_NAME_HIDE);
4862
+ this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
4863
+
4861
4864
 
4862
4865
  reflow(this._element);
4863
4866
 
4867
+ this._element.classList.add(CLASS_NAME_SHOW);
4868
+
4864
4869
  this._element.classList.add(CLASS_NAME_SHOWING);
4865
4870
 
4866
4871
  this._queueCallback(complete, this._element, this._config.animation);
@@ -4878,12 +4883,17 @@
4878
4883
  }
4879
4884
 
4880
4885
  const complete = () => {
4881
- this._element.classList.add(CLASS_NAME_HIDE);
4886
+ this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
4887
+
4888
+
4889
+ this._element.classList.remove(CLASS_NAME_SHOWING);
4890
+
4891
+ this._element.classList.remove(CLASS_NAME_SHOW);
4882
4892
 
4883
4893
  EventHandler.trigger(this._element, EVENT_HIDDEN);
4884
4894
  };
4885
4895
 
4886
- this._element.classList.remove(CLASS_NAME_SHOW);
4896
+ this._element.classList.add(CLASS_NAME_SHOWING);
4887
4897
 
4888
4898
  this._queueCallback(complete, this._element, this._config.animation);
4889
4899
  }
@@ -4951,7 +4961,6 @@
4951
4961
  }
4952
4962
 
4953
4963
  _setListeners() {
4954
- EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
4955
4964
  EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
4956
4965
  EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
4957
4966
  EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
@@ -4979,6 +4988,8 @@
4979
4988
  }
4980
4989
 
4981
4990
  }
4991
+
4992
+ enableDismissTrigger(Toast);
4982
4993
  /**
4983
4994
  * ------------------------------------------------------------------------
4984
4995
  * jQuery
@@ -4986,12 +4997,11 @@
4986
4997
  * add .Toast to jQuery only if jQuery is present
4987
4998
  */
4988
4999
 
4989
-
4990
5000
  defineJQueryPlugin(Toast);
4991
5001
 
4992
5002
  /**
4993
5003
  * --------------------------------------------------------------------------
4994
- * Bootstrap (v5.0.2): index.umd.js
5004
+ * Bootstrap (v5.1.0): index.umd.js
4995
5005
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4996
5006
  * --------------------------------------------------------------------------
4997
5007
  */