administrate-bootstrap-theme 0.2.2 → 1.0.6

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -32
  3. data/app/assets/javascripts/administrate-bootstrap-theme/{bootstrap/bootstrap.bundle.js → bootstrap.bundle.js} +1058 -973
  4. data/app/assets/stylesheets/administrate-bootstrap-theme/_base.scss +4 -21
  5. data/app/assets/stylesheets/administrate-bootstrap-theme/_variables.scss +4 -0
  6. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_card.scss +7 -6
  7. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_carousel.scss +2 -2
  8. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_dropdown.scss +4 -4
  9. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_functions.scss +100 -3
  10. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_grid.scss +11 -0
  11. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_helpers.scss +2 -0
  12. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_images.scss +1 -1
  13. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_mixins.scss +1 -0
  14. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_modal.scss +5 -15
  15. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_navbar.scss +30 -1
  16. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_offcanvas.scss +8 -2
  17. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_placeholders.scss +51 -0
  18. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_popover.scss +10 -10
  19. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_reboot.scss +12 -8
  20. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_root.scss +40 -2
  21. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_tables.scss +9 -5
  22. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_toasts.scss +3 -3
  23. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_tooltip.scss +4 -4
  24. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_transitions.scss +6 -0
  25. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_utilities.scss +44 -8
  26. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/_variables.scss +206 -29
  27. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/bootstrap-grid.scss +3 -1
  28. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/bootstrap-reboot.scss +2 -4
  29. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/bootstrap-utilities.scss +1 -1
  30. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/bootstrap.scss +2 -1
  31. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/forms/_floating-labels.scss +3 -1
  32. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/forms/_form-check.scss +1 -1
  33. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/forms/_form-control.scss +1 -1
  34. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/forms/_form-range.scss +1 -1
  35. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/forms/_form-select.scss +5 -0
  36. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/helpers/_stacks.scss +15 -0
  37. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/helpers/_vr.scss +8 -0
  38. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/mixins/_backdrop.scss +14 -0
  39. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/mixins/_buttons.scss +1 -1
  40. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/mixins/_grid.scss +35 -9
  41. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/mixins/_utilities.scss +27 -6
  42. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/mixins/_visually-hidden.scss +1 -1
  43. data/app/assets/stylesheets/administrate-bootstrap-theme/bootstrap/vendor/_rfs.scss +55 -13
  44. data/app/assets/stylesheets/administrate-bootstrap-theme/colors/_autumn.scss +8 -0
  45. data/app/assets/stylesheets/administrate-bootstrap-theme/colors/_default.scss +8 -0
  46. data/app/assets/stylesheets/administrate-bootstrap-theme/colors/_forest.scss +9 -0
  47. data/app/assets/stylesheets/administrate-bootstrap-theme/colors/_industrial.scss +8 -0
  48. data/app/assets/stylesheets/administrate-bootstrap-theme/colors/_water.scss +8 -0
  49. data/app/assets/stylesheets/administrate-bootstrap-theme/components/_content_body.scss +28 -10
  50. data/app/assets/stylesheets/administrate-bootstrap-theme/components/_content_header.scss +4 -6
  51. data/app/assets/stylesheets/administrate-bootstrap-theme/components/_form.scss +6 -6
  52. data/app/assets/stylesheets/administrate-bootstrap-theme/components/_navigation.scss +26 -3
  53. data/app/assets/stylesheets/administrate-bootstrap-theme/components/_pagination.scss +1 -1
  54. data/app/assets/stylesheets/administrate-bootstrap-theme/fonts/_lato.scss +5 -0
  55. data/app/assets/stylesheets/administrate-bootstrap-theme/fonts/_montserrat.scss +5 -0
  56. data/app/assets/stylesheets/administrate-bootstrap-theme/fonts/_open_sans.scss +5 -0
  57. data/app/assets/stylesheets/administrate-bootstrap-theme/fonts/_roboto.scss +5 -0
  58. data/app/assets/stylesheets/administrate-bootstrap-theme/fonts/_source_sans_pro.scss +5 -0
  59. data/app/assets/stylesheets/administrate-bootstrap-theme/theme.scss +10 -61
  60. data/lib/administrate-bootstrap-theme/version.rb +3 -1
  61. data/lib/generators/administrate_bootstrap_theme/install/USAGE +10 -0
  62. data/lib/generators/administrate_bootstrap_theme/install/install_generator.rb +33 -0
  63. data/package.json +2 -3
  64. metadata +22 -8
  65. data/app/assets/javascripts/administrate-bootstrap-theme/flatpickr/flatpickr.js +0 -2673
  66. data/app/assets/javascripts/administrate-bootstrap-theme/theme.js +0 -22
  67. data/app/assets/stylesheets/administrate-bootstrap-theme/flatpickr/flatpickr.scss +0 -791
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap v5.0.1 (https://getbootstrap.com/)
2
+ * Bootstrap v5.1.3 (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
  */
@@ -7,86 +7,14 @@
7
7
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
8
  typeof define === 'function' && define.amd ? define(factory) :
9
9
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory());
10
- }(this, (function () { 'use strict';
10
+ })(this, (function () { 'use strict';
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.0.1): dom/selector-engine.js
14
+ * Bootstrap (v5.1.3): util/index.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
18
-
19
- /**
20
- * ------------------------------------------------------------------------
21
- * Constants
22
- * ------------------------------------------------------------------------
23
- */
24
- const NODE_TEXT = 3;
25
- const SelectorEngine = {
26
- find(selector, element = document.documentElement) {
27
- return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
28
- },
29
-
30
- findOne(selector, element = document.documentElement) {
31
- return Element.prototype.querySelector.call(element, selector);
32
- },
33
-
34
- children(element, selector) {
35
- return [].concat(...element.children).filter(child => child.matches(selector));
36
- },
37
-
38
- parents(element, selector) {
39
- const parents = [];
40
- let ancestor = element.parentNode;
41
-
42
- while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
43
- if (ancestor.matches(selector)) {
44
- parents.push(ancestor);
45
- }
46
-
47
- ancestor = ancestor.parentNode;
48
- }
49
-
50
- return parents;
51
- },
52
-
53
- prev(element, selector) {
54
- let previous = element.previousElementSibling;
55
-
56
- while (previous) {
57
- if (previous.matches(selector)) {
58
- return [previous];
59
- }
60
-
61
- previous = previous.previousElementSibling;
62
- }
63
-
64
- return [];
65
- },
66
-
67
- next(element, selector) {
68
- let next = element.nextElementSibling;
69
-
70
- while (next) {
71
- if (next.matches(selector)) {
72
- return [next];
73
- }
74
-
75
- next = next.nextElementSibling;
76
- }
77
-
78
- return [];
79
- }
80
-
81
- };
82
-
83
- /**
84
- * --------------------------------------------------------------------------
85
- * Bootstrap (v5.0.1): util/index.js
86
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
87
- * --------------------------------------------------------------------------
88
- */
89
-
90
18
  const MAX_UID = 1000000;
91
19
  const MILLISECONDS_MULTIPLIER = 1000;
92
20
  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
@@ -198,30 +126,12 @@
198
126
  }
199
127
 
200
128
  if (typeof obj === 'string' && obj.length > 0) {
201
- return SelectorEngine.findOne(obj);
129
+ return document.querySelector(obj);
202
130
  }
203
131
 
204
132
  return null;
205
133
  };
206
134
 
207
- const emulateTransitionEnd = (element, duration) => {
208
- let called = false;
209
- const durationPadding = 5;
210
- const emulatedDuration = duration + durationPadding;
211
-
212
- function listener() {
213
- called = true;
214
- element.removeEventListener(TRANSITION_END, listener);
215
- }
216
-
217
- element.addEventListener(TRANSITION_END, listener);
218
- setTimeout(() => {
219
- if (!called) {
220
- triggerTransitionEnd(element);
221
- }
222
- }, emulatedDuration);
223
- };
224
-
225
135
  const typeCheckConfig = (componentName, config, configTypes) => {
226
136
  Object.keys(configTypes).forEach(property => {
227
137
  const expectedTypes = configTypes[property];
@@ -235,17 +145,11 @@
235
145
  };
236
146
 
237
147
  const isVisible = element => {
238
- if (!element) {
148
+ if (!isElement$1(element) || element.getClientRects().length === 0) {
239
149
  return false;
240
150
  }
241
151
 
242
- if (element.style && element.parentNode && element.parentNode.style) {
243
- const elementStyle = getComputedStyle(element);
244
- const parentNodeStyle = getComputedStyle(element.parentNode);
245
- return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
246
- }
247
-
248
- return false;
152
+ return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
249
153
  };
250
154
 
251
155
  const isDisabled = element => {
@@ -288,8 +192,20 @@
288
192
  };
289
193
 
290
194
  const noop = () => {};
195
+ /**
196
+ * Trick to restart an element's animation
197
+ *
198
+ * @param {HTMLElement} element
199
+ * @return void
200
+ *
201
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
202
+ */
291
203
 
292
- const reflow = element => element.offsetHeight;
204
+
205
+ const reflow = element => {
206
+ // eslint-disable-next-line no-unused-expressions
207
+ element.offsetHeight;
208
+ };
293
209
 
294
210
  const getjQuery = () => {
295
211
  const {
@@ -303,9 +219,18 @@
303
219
  return null;
304
220
  };
305
221
 
222
+ const DOMContentLoadedCallbacks = [];
223
+
306
224
  const onDOMContentLoaded = callback => {
307
225
  if (document.readyState === 'loading') {
308
- document.addEventListener('DOMContentLoaded', callback);
226
+ // add listener on the first call when the document is in loading state
227
+ if (!DOMContentLoadedCallbacks.length) {
228
+ document.addEventListener('DOMContentLoaded', () => {
229
+ DOMContentLoadedCallbacks.forEach(callback => callback());
230
+ });
231
+ }
232
+
233
+ DOMContentLoadedCallbacks.push(callback);
309
234
  } else {
310
235
  callback();
311
236
  }
@@ -338,63 +263,66 @@
338
263
  }
339
264
  };
340
265
 
341
- /**
342
- * --------------------------------------------------------------------------
343
- * Bootstrap (v5.0.1): dom/data.js
344
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
345
- * --------------------------------------------------------------------------
346
- */
347
-
348
- /**
349
- * ------------------------------------------------------------------------
350
- * Constants
351
- * ------------------------------------------------------------------------
352
- */
353
- const elementMap = new Map();
354
- var Data = {
355
- set(element, key, instance) {
356
- if (!elementMap.has(element)) {
357
- elementMap.set(element, new Map());
358
- }
266
+ const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
267
+ if (!waitForTransition) {
268
+ execute(callback);
269
+ return;
270
+ }
359
271
 
360
- const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
361
- // can be removed later when multiple key/instances are fine to be used
272
+ const durationPadding = 5;
273
+ const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
274
+ let called = false;
362
275
 
363
- if (!instanceMap.has(key) && instanceMap.size !== 0) {
364
- // eslint-disable-next-line no-console
365
- console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
276
+ const handler = ({
277
+ target
278
+ }) => {
279
+ if (target !== transitionElement) {
366
280
  return;
367
281
  }
368
282
 
369
- instanceMap.set(key, instance);
370
- },
283
+ called = true;
284
+ transitionElement.removeEventListener(TRANSITION_END, handler);
285
+ execute(callback);
286
+ };
371
287
 
372
- get(element, key) {
373
- if (elementMap.has(element)) {
374
- return elementMap.get(element).get(key) || null;
288
+ transitionElement.addEventListener(TRANSITION_END, handler);
289
+ setTimeout(() => {
290
+ if (!called) {
291
+ triggerTransitionEnd(transitionElement);
375
292
  }
293
+ }, emulatedDuration);
294
+ };
295
+ /**
296
+ * Return the previous/next element of a list.
297
+ *
298
+ * @param {array} list The list of elements
299
+ * @param activeElement The active element
300
+ * @param shouldGetNext Choose to get next or previous element
301
+ * @param isCycleAllowed
302
+ * @return {Element|elem} The proper element
303
+ */
376
304
 
377
- return null;
378
- },
379
305
 
380
- remove(element, key) {
381
- if (!elementMap.has(element)) {
382
- return;
383
- }
306
+ const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
307
+ let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
384
308
 
385
- const instanceMap = elementMap.get(element);
386
- instanceMap.delete(key); // free up element references if there are no instances left for an element
309
+ if (index === -1) {
310
+ return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
311
+ }
387
312
 
388
- if (instanceMap.size === 0) {
389
- elementMap.delete(element);
390
- }
313
+ const listLength = list.length;
314
+ index += shouldGetNext ? 1 : -1;
315
+
316
+ if (isCycleAllowed) {
317
+ index = (index + listLength) % listLength;
391
318
  }
392
319
 
320
+ return list[Math.max(0, Math.min(index, listLength - 1))];
393
321
  };
394
322
 
395
323
  /**
396
324
  * --------------------------------------------------------------------------
397
- * Bootstrap (v5.0.1): dom/event-handler.js
325
+ * Bootstrap (v5.1.3): dom/event-handler.js
398
326
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
399
327
  * --------------------------------------------------------------------------
400
328
  */
@@ -457,7 +385,6 @@
457
385
  event.delegateTarget = target;
458
386
 
459
387
  if (handler.oneOff) {
460
- // eslint-disable-next-line unicorn/consistent-destructuring
461
388
  EventHandler.off(element, event.type, selector, fn);
462
389
  }
463
390
 
@@ -683,17 +610,71 @@
683
610
 
684
611
  /**
685
612
  * --------------------------------------------------------------------------
686
- * Bootstrap (v5.0.1): base-component.js
613
+ * Bootstrap (v5.1.3): dom/data.js
687
614
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
688
615
  * --------------------------------------------------------------------------
689
616
  */
617
+
690
618
  /**
691
619
  * ------------------------------------------------------------------------
692
620
  * Constants
693
621
  * ------------------------------------------------------------------------
694
622
  */
623
+ const elementMap = new Map();
624
+ const Data = {
625
+ set(element, key, instance) {
626
+ if (!elementMap.has(element)) {
627
+ elementMap.set(element, new Map());
628
+ }
629
+
630
+ const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
631
+ // can be removed later when multiple key/instances are fine to be used
632
+
633
+ if (!instanceMap.has(key) && instanceMap.size !== 0) {
634
+ // eslint-disable-next-line no-console
635
+ console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
636
+ return;
637
+ }
695
638
 
696
- const VERSION = '5.0.1';
639
+ instanceMap.set(key, instance);
640
+ },
641
+
642
+ get(element, key) {
643
+ if (elementMap.has(element)) {
644
+ return elementMap.get(element).get(key) || null;
645
+ }
646
+
647
+ return null;
648
+ },
649
+
650
+ remove(element, key) {
651
+ if (!elementMap.has(element)) {
652
+ return;
653
+ }
654
+
655
+ const instanceMap = elementMap.get(element);
656
+ instanceMap.delete(key); // free up element references if there are no instances left for an element
657
+
658
+ if (instanceMap.size === 0) {
659
+ elementMap.delete(element);
660
+ }
661
+ }
662
+
663
+ };
664
+
665
+ /**
666
+ * --------------------------------------------------------------------------
667
+ * Bootstrap (v5.1.3): base-component.js
668
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
669
+ * --------------------------------------------------------------------------
670
+ */
671
+ /**
672
+ * ------------------------------------------------------------------------
673
+ * Constants
674
+ * ------------------------------------------------------------------------
675
+ */
676
+
677
+ const VERSION = '5.1.3';
697
678
 
698
679
  class BaseComponent {
699
680
  constructor(element) {
@@ -716,20 +697,17 @@
716
697
  }
717
698
 
718
699
  _queueCallback(callback, element, isAnimated = true) {
719
- if (!isAnimated) {
720
- execute(callback);
721
- return;
722
- }
723
-
724
- const transitionDuration = getTransitionDurationFromElement(element);
725
- EventHandler.one(element, 'transitionend', () => execute(callback));
726
- emulateTransitionEnd(element, transitionDuration);
700
+ executeAfterTransition(callback, element, isAnimated);
727
701
  }
728
702
  /** Static */
729
703
 
730
704
 
731
705
  static getInstance(element) {
732
- return Data.get(element, this.DATA_KEY);
706
+ return Data.get(getElement(element), this.DATA_KEY);
707
+ }
708
+
709
+ static getOrCreateInstance(element, config = {}) {
710
+ return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
733
711
  }
734
712
 
735
713
  static get VERSION() {
@@ -752,7 +730,33 @@
752
730
 
753
731
  /**
754
732
  * --------------------------------------------------------------------------
755
- * Bootstrap (v5.0.1): alert.js
733
+ * Bootstrap (v5.1.3): util/component-functions.js
734
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
735
+ * --------------------------------------------------------------------------
736
+ */
737
+
738
+ const enableDismissTrigger = (component, method = 'hide') => {
739
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
740
+ const name = component.NAME;
741
+ EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
742
+ if (['A', 'AREA'].includes(this.tagName)) {
743
+ event.preventDefault();
744
+ }
745
+
746
+ if (isDisabled(this)) {
747
+ return;
748
+ }
749
+
750
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
751
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
752
+
753
+ instance[method]();
754
+ });
755
+ };
756
+
757
+ /**
758
+ * --------------------------------------------------------------------------
759
+ * Bootstrap (v5.1.3): alert.js
756
760
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
757
761
  * --------------------------------------------------------------------------
758
762
  */
@@ -762,17 +766,13 @@
762
766
  * ------------------------------------------------------------------------
763
767
  */
764
768
 
765
- const NAME$c = 'alert';
766
- const DATA_KEY$b = 'bs.alert';
767
- const EVENT_KEY$b = `.${DATA_KEY$b}`;
768
- const DATA_API_KEY$8 = '.data-api';
769
- const SELECTOR_DISMISS = '[data-bs-dismiss="alert"]';
770
- const EVENT_CLOSE = `close${EVENT_KEY$b}`;
771
- const EVENT_CLOSED = `closed${EVENT_KEY$b}`;
772
- const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$b}${DATA_API_KEY$8}`;
773
- const CLASS_NAME_ALERT = 'alert';
774
- const CLASS_NAME_FADE$6 = 'fade';
775
- const CLASS_NAME_SHOW$9 = 'show';
769
+ const NAME$d = 'alert';
770
+ const DATA_KEY$c = 'bs.alert';
771
+ const EVENT_KEY$c = `.${DATA_KEY$c}`;
772
+ const EVENT_CLOSE = `close${EVENT_KEY$c}`;
773
+ const EVENT_CLOSED = `closed${EVENT_KEY$c}`;
774
+ const CLASS_NAME_FADE$5 = 'fade';
775
+ const CLASS_NAME_SHOW$8 = 'show';
776
776
  /**
777
777
  * ------------------------------------------------------------------------
778
778
  * Class Definition
@@ -782,69 +782,47 @@
782
782
  class Alert extends BaseComponent {
783
783
  // Getters
784
784
  static get NAME() {
785
- return NAME$c;
785
+ return NAME$d;
786
786
  } // Public
787
787
 
788
788
 
789
- close(element) {
790
- const rootElement = element ? this._getRootElement(element) : this._element;
791
-
792
- const customEvent = this._triggerCloseEvent(rootElement);
789
+ close() {
790
+ const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
793
791
 
794
- if (customEvent === null || customEvent.defaultPrevented) {
792
+ if (closeEvent.defaultPrevented) {
795
793
  return;
796
794
  }
797
795
 
798
- this._removeElement(rootElement);
799
- } // Private
800
-
796
+ this._element.classList.remove(CLASS_NAME_SHOW$8);
801
797
 
802
- _getRootElement(element) {
803
- return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`);
804
- }
805
-
806
- _triggerCloseEvent(element) {
807
- return EventHandler.trigger(element, EVENT_CLOSE);
808
- }
798
+ const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
809
799
 
810
- _removeElement(element) {
811
- element.classList.remove(CLASS_NAME_SHOW$9);
812
- const isAnimated = element.classList.contains(CLASS_NAME_FADE$6);
800
+ this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
801
+ } // Private
813
802
 
814
- this._queueCallback(() => this._destroyElement(element), element, isAnimated);
815
- }
816
803
 
817
- _destroyElement(element) {
818
- if (element.parentNode) {
819
- element.parentNode.removeChild(element);
820
- }
804
+ _destroyElement() {
805
+ this._element.remove();
821
806
 
822
- EventHandler.trigger(element, EVENT_CLOSED);
807
+ EventHandler.trigger(this._element, EVENT_CLOSED);
808
+ this.dispose();
823
809
  } // Static
824
810
 
825
811
 
826
812
  static jQueryInterface(config) {
827
813
  return this.each(function () {
828
- let data = Data.get(this, DATA_KEY$b);
829
-
830
- if (!data) {
831
- data = new Alert(this);
832
- }
814
+ const data = Alert.getOrCreateInstance(this);
833
815
 
834
- if (config === 'close') {
835
- data[config](this);
816
+ if (typeof config !== 'string') {
817
+ return;
836
818
  }
837
- });
838
- }
839
819
 
840
- static handleDismiss(alertInstance) {
841
- return function (event) {
842
- if (event) {
843
- event.preventDefault();
820
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
821
+ throw new TypeError(`No method named "${config}"`);
844
822
  }
845
823
 
846
- alertInstance.close(this);
847
- };
824
+ data[config](this);
825
+ });
848
826
  }
849
827
 
850
828
  }
@@ -855,7 +833,7 @@
855
833
  */
856
834
 
857
835
 
858
- EventHandler.on(document, EVENT_CLICK_DATA_API$7, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()));
836
+ enableDismissTrigger(Alert, 'close');
859
837
  /**
860
838
  * ------------------------------------------------------------------------
861
839
  * jQuery
@@ -867,7 +845,7 @@
867
845
 
868
846
  /**
869
847
  * --------------------------------------------------------------------------
870
- * Bootstrap (v5.0.1): button.js
848
+ * Bootstrap (v5.1.3): button.js
871
849
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
872
850
  * --------------------------------------------------------------------------
873
851
  */
@@ -877,13 +855,13 @@
877
855
  * ------------------------------------------------------------------------
878
856
  */
879
857
 
880
- const NAME$b = 'button';
881
- const DATA_KEY$a = 'bs.button';
882
- const EVENT_KEY$a = `.${DATA_KEY$a}`;
858
+ const NAME$c = 'button';
859
+ const DATA_KEY$b = 'bs.button';
860
+ const EVENT_KEY$b = `.${DATA_KEY$b}`;
883
861
  const DATA_API_KEY$7 = '.data-api';
884
862
  const CLASS_NAME_ACTIVE$3 = 'active';
885
863
  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
886
- const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$7}`;
864
+ const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;
887
865
  /**
888
866
  * ------------------------------------------------------------------------
889
867
  * Class Definition
@@ -893,7 +871,7 @@
893
871
  class Button extends BaseComponent {
894
872
  // Getters
895
873
  static get NAME() {
896
- return NAME$b;
874
+ return NAME$c;
897
875
  } // Public
898
876
 
899
877
 
@@ -905,11 +883,7 @@
905
883
 
906
884
  static jQueryInterface(config) {
907
885
  return this.each(function () {
908
- let data = Data.get(this, DATA_KEY$a);
909
-
910
- if (!data) {
911
- data = new Button(this);
912
- }
886
+ const data = Button.getOrCreateInstance(this);
913
887
 
914
888
  if (config === 'toggle') {
915
889
  data[config]();
@@ -928,12 +902,7 @@
928
902
  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
929
903
  event.preventDefault();
930
904
  const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
931
- let data = Data.get(button, DATA_KEY$a);
932
-
933
- if (!data) {
934
- data = new Button(button);
935
- }
936
-
905
+ const data = Button.getOrCreateInstance(button);
937
906
  data.toggle();
938
907
  });
939
908
  /**
@@ -947,7 +916,7 @@
947
916
 
948
917
  /**
949
918
  * --------------------------------------------------------------------------
950
- * Bootstrap (v5.0.1): dom/manipulator.js
919
+ * Bootstrap (v5.1.3): dom/manipulator.js
951
920
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
952
921
  * --------------------------------------------------------------------------
953
922
  */
@@ -968,60 +937,130 @@
968
937
  return null;
969
938
  }
970
939
 
971
- return val;
972
- }
940
+ return val;
941
+ }
942
+
943
+ function normalizeDataKey(key) {
944
+ return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
945
+ }
946
+
947
+ const Manipulator = {
948
+ setDataAttribute(element, key, value) {
949
+ element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
950
+ },
951
+
952
+ removeDataAttribute(element, key) {
953
+ element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
954
+ },
955
+
956
+ getDataAttributes(element) {
957
+ if (!element) {
958
+ return {};
959
+ }
960
+
961
+ const attributes = {};
962
+ Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
963
+ let pureKey = key.replace(/^bs/, '');
964
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
965
+ attributes[pureKey] = normalizeData(element.dataset[key]);
966
+ });
967
+ return attributes;
968
+ },
969
+
970
+ getDataAttribute(element, key) {
971
+ return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
972
+ },
973
+
974
+ offset(element) {
975
+ const rect = element.getBoundingClientRect();
976
+ return {
977
+ top: rect.top + window.pageYOffset,
978
+ left: rect.left + window.pageXOffset
979
+ };
980
+ },
981
+
982
+ position(element) {
983
+ return {
984
+ top: element.offsetTop,
985
+ left: element.offsetLeft
986
+ };
987
+ }
988
+
989
+ };
990
+
991
+ /**
992
+ * --------------------------------------------------------------------------
993
+ * Bootstrap (v5.1.3): dom/selector-engine.js
994
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
995
+ * --------------------------------------------------------------------------
996
+ */
997
+ const NODE_TEXT = 3;
998
+ const SelectorEngine = {
999
+ find(selector, element = document.documentElement) {
1000
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
1001
+ },
1002
+
1003
+ findOne(selector, element = document.documentElement) {
1004
+ return Element.prototype.querySelector.call(element, selector);
1005
+ },
1006
+
1007
+ children(element, selector) {
1008
+ return [].concat(...element.children).filter(child => child.matches(selector));
1009
+ },
1010
+
1011
+ parents(element, selector) {
1012
+ const parents = [];
1013
+ let ancestor = element.parentNode;
1014
+
1015
+ while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
1016
+ if (ancestor.matches(selector)) {
1017
+ parents.push(ancestor);
1018
+ }
973
1019
 
974
- function normalizeDataKey(key) {
975
- return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
976
- }
1020
+ ancestor = ancestor.parentNode;
1021
+ }
977
1022
 
978
- const Manipulator = {
979
- setDataAttribute(element, key, value) {
980
- element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
1023
+ return parents;
981
1024
  },
982
1025
 
983
- removeDataAttribute(element, key) {
984
- element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
985
- },
1026
+ prev(element, selector) {
1027
+ let previous = element.previousElementSibling;
986
1028
 
987
- getDataAttributes(element) {
988
- if (!element) {
989
- return {};
1029
+ while (previous) {
1030
+ if (previous.matches(selector)) {
1031
+ return [previous];
1032
+ }
1033
+
1034
+ previous = previous.previousElementSibling;
990
1035
  }
991
1036
 
992
- const attributes = {};
993
- Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {
994
- let pureKey = key.replace(/^bs/, '');
995
- pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
996
- attributes[pureKey] = normalizeData(element.dataset[key]);
997
- });
998
- return attributes;
1037
+ return [];
999
1038
  },
1000
1039
 
1001
- getDataAttribute(element, key) {
1002
- return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
1003
- },
1040
+ next(element, selector) {
1041
+ let next = element.nextElementSibling;
1004
1042
 
1005
- offset(element) {
1006
- const rect = element.getBoundingClientRect();
1007
- return {
1008
- top: rect.top + document.body.scrollTop,
1009
- left: rect.left + document.body.scrollLeft
1010
- };
1043
+ while (next) {
1044
+ if (next.matches(selector)) {
1045
+ return [next];
1046
+ }
1047
+
1048
+ next = next.nextElementSibling;
1049
+ }
1050
+
1051
+ return [];
1011
1052
  },
1012
1053
 
1013
- position(element) {
1014
- return {
1015
- top: element.offsetTop,
1016
- left: element.offsetLeft
1017
- };
1054
+ focusableChildren(element) {
1055
+ const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
1056
+ return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
1018
1057
  }
1019
1058
 
1020
1059
  };
1021
1060
 
1022
1061
  /**
1023
1062
  * --------------------------------------------------------------------------
1024
- * Bootstrap (v5.0.1): carousel.js
1063
+ * Bootstrap (v5.1.3): carousel.js
1025
1064
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1026
1065
  * --------------------------------------------------------------------------
1027
1066
  */
@@ -1031,16 +1070,16 @@
1031
1070
  * ------------------------------------------------------------------------
1032
1071
  */
1033
1072
 
1034
- const NAME$a = 'carousel';
1035
- const DATA_KEY$9 = 'bs.carousel';
1036
- const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1073
+ const NAME$b = 'carousel';
1074
+ const DATA_KEY$a = 'bs.carousel';
1075
+ const EVENT_KEY$a = `.${DATA_KEY$a}`;
1037
1076
  const DATA_API_KEY$6 = '.data-api';
1038
1077
  const ARROW_LEFT_KEY = 'ArrowLeft';
1039
1078
  const ARROW_RIGHT_KEY = 'ArrowRight';
1040
1079
  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1041
1080
 
1042
1081
  const SWIPE_THRESHOLD = 40;
1043
- const Default$9 = {
1082
+ const Default$a = {
1044
1083
  interval: 5000,
1045
1084
  keyboard: true,
1046
1085
  slide: false,
@@ -1048,7 +1087,7 @@
1048
1087
  wrap: true,
1049
1088
  touch: true
1050
1089
  };
1051
- const DefaultType$9 = {
1090
+ const DefaultType$a = {
1052
1091
  interval: '(number|boolean)',
1053
1092
  keyboard: 'boolean',
1054
1093
  slide: '(boolean|string)',
@@ -1060,19 +1099,23 @@
1060
1099
  const ORDER_PREV = 'prev';
1061
1100
  const DIRECTION_LEFT = 'left';
1062
1101
  const DIRECTION_RIGHT = 'right';
1063
- const EVENT_SLIDE = `slide${EVENT_KEY$9}`;
1064
- const EVENT_SLID = `slid${EVENT_KEY$9}`;
1065
- const EVENT_KEYDOWN = `keydown${EVENT_KEY$9}`;
1066
- const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$9}`;
1067
- const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$9}`;
1068
- const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
1069
- const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
1070
- const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
1071
- const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
1072
- const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
1073
- const EVENT_DRAG_START = `dragstart${EVENT_KEY$9}`;
1074
- const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$9}${DATA_API_KEY$6}`;
1075
- const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$9}${DATA_API_KEY$6}`;
1102
+ const KEY_TO_DIRECTION = {
1103
+ [ARROW_LEFT_KEY]: DIRECTION_RIGHT,
1104
+ [ARROW_RIGHT_KEY]: DIRECTION_LEFT
1105
+ };
1106
+ const EVENT_SLIDE = `slide${EVENT_KEY$a}`;
1107
+ const EVENT_SLID = `slid${EVENT_KEY$a}`;
1108
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;
1109
+ const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;
1110
+ const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;
1111
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;
1112
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;
1113
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;
1114
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;
1115
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;
1116
+ const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
1117
+ const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;
1118
+ const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
1076
1119
  const CLASS_NAME_CAROUSEL = 'carousel';
1077
1120
  const CLASS_NAME_ACTIVE$2 = 'active';
1078
1121
  const CLASS_NAME_SLIDE = 'slide';
@@ -1119,18 +1162,16 @@
1119
1162
 
1120
1163
 
1121
1164
  static get Default() {
1122
- return Default$9;
1165
+ return Default$a;
1123
1166
  }
1124
1167
 
1125
1168
  static get NAME() {
1126
- return NAME$a;
1169
+ return NAME$b;
1127
1170
  } // Public
1128
1171
 
1129
1172
 
1130
1173
  next() {
1131
- if (!this._isSliding) {
1132
- this._slide(ORDER_NEXT);
1133
- }
1174
+ this._slide(ORDER_NEXT);
1134
1175
  }
1135
1176
 
1136
1177
  nextWhenVisible() {
@@ -1142,9 +1183,7 @@
1142
1183
  }
1143
1184
 
1144
1185
  prev() {
1145
- if (!this._isSliding) {
1146
- this._slide(ORDER_PREV);
1147
- }
1186
+ this._slide(ORDER_PREV);
1148
1187
  }
1149
1188
 
1150
1189
  pause(event) {
@@ -1205,10 +1244,11 @@
1205
1244
 
1206
1245
 
1207
1246
  _getConfig(config) {
1208
- config = { ...Default$9,
1209
- ...config
1247
+ config = { ...Default$a,
1248
+ ...Manipulator.getDataAttributes(this._element),
1249
+ ...(typeof config === 'object' ? config : {})
1210
1250
  };
1211
- typeCheckConfig(NAME$a, config, DefaultType$9);
1251
+ typeCheckConfig(NAME$b, config, DefaultType$a);
1212
1252
  return config;
1213
1253
  }
1214
1254
 
@@ -1245,8 +1285,12 @@
1245
1285
  }
1246
1286
 
1247
1287
  _addTouchEventListeners() {
1288
+ const hasPointerPenTouch = event => {
1289
+ return this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
1290
+ };
1291
+
1248
1292
  const start = event => {
1249
- if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
1293
+ if (hasPointerPenTouch(event)) {
1250
1294
  this.touchStartX = event.clientX;
1251
1295
  } else if (!this._pointerEvent) {
1252
1296
  this.touchStartX = event.touches[0].clientX;
@@ -1259,7 +1303,7 @@
1259
1303
  };
1260
1304
 
1261
1305
  const end = event => {
1262
- if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {
1306
+ if (hasPointerPenTouch(event)) {
1263
1307
  this.touchDeltaX = event.clientX - this.touchStartX;
1264
1308
  }
1265
1309
 
@@ -1284,7 +1328,7 @@
1284
1328
  };
1285
1329
 
1286
1330
  SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {
1287
- EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault());
1331
+ EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault());
1288
1332
  });
1289
1333
 
1290
1334
  if (this._pointerEvent) {
@@ -1304,14 +1348,12 @@
1304
1348
  return;
1305
1349
  }
1306
1350
 
1307
- if (event.key === ARROW_LEFT_KEY) {
1308
- event.preventDefault();
1351
+ const direction = KEY_TO_DIRECTION[event.key];
1309
1352
 
1310
- this._slide(DIRECTION_RIGHT);
1311
- } else if (event.key === ARROW_RIGHT_KEY) {
1353
+ if (direction) {
1312
1354
  event.preventDefault();
1313
1355
 
1314
- this._slide(DIRECTION_LEFT);
1356
+ this._slide(direction);
1315
1357
  }
1316
1358
  }
1317
1359
 
@@ -1322,20 +1364,7 @@
1322
1364
 
1323
1365
  _getItemByOrder(order, activeElement) {
1324
1366
  const isNext = order === ORDER_NEXT;
1325
- const isPrev = order === ORDER_PREV;
1326
-
1327
- const activeIndex = this._getItemIndex(activeElement);
1328
-
1329
- const lastItemIndex = this._items.length - 1;
1330
- const isGoingToWrap = isPrev && activeIndex === 0 || isNext && activeIndex === lastItemIndex;
1331
-
1332
- if (isGoingToWrap && !this._config.wrap) {
1333
- return activeElement;
1334
- }
1335
-
1336
- const delta = isPrev ? -1 : 1;
1337
- const itemIndex = (activeIndex + delta) % this._items.length;
1338
- return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
1367
+ return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);
1339
1368
  }
1340
1369
 
1341
1370
  _triggerSlideEvent(relatedTarget, eventDirectionName) {
@@ -1408,6 +1437,10 @@
1408
1437
  return;
1409
1438
  }
1410
1439
 
1440
+ if (this._isSliding) {
1441
+ return;
1442
+ }
1443
+
1411
1444
  const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
1412
1445
 
1413
1446
  if (slideEvent.defaultPrevented) {
@@ -1491,10 +1524,10 @@
1491
1524
 
1492
1525
 
1493
1526
  static carouselInterface(element, config) {
1494
- let data = Data.get(element, DATA_KEY$9);
1495
- let _config = { ...Default$9,
1496
- ...Manipulator.getDataAttributes(element)
1497
- };
1527
+ const data = Carousel.getOrCreateInstance(element, config);
1528
+ let {
1529
+ _config
1530
+ } = data;
1498
1531
 
1499
1532
  if (typeof config === 'object') {
1500
1533
  _config = { ..._config,
@@ -1504,10 +1537,6 @@
1504
1537
 
1505
1538
  const action = typeof config === 'string' ? config : _config.slide;
1506
1539
 
1507
- if (!data) {
1508
- data = new Carousel(element, _config);
1509
- }
1510
-
1511
1540
  if (typeof config === 'number') {
1512
1541
  data.to(config);
1513
1542
  } else if (typeof action === 'string') {
@@ -1547,7 +1576,7 @@
1547
1576
  Carousel.carouselInterface(target, config);
1548
1577
 
1549
1578
  if (slideIndex) {
1550
- Data.get(target, DATA_KEY$9).to(slideIndex);
1579
+ Carousel.getInstance(target).to(slideIndex);
1551
1580
  }
1552
1581
 
1553
1582
  event.preventDefault();
@@ -1566,7 +1595,7 @@
1566
1595
  const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
1567
1596
 
1568
1597
  for (let i = 0, len = carousels.length; i < len; i++) {
1569
- Carousel.carouselInterface(carousels[i], Data.get(carousels[i], DATA_KEY$9));
1598
+ Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));
1570
1599
  }
1571
1600
  });
1572
1601
  /**
@@ -1580,7 +1609,7 @@
1580
1609
 
1581
1610
  /**
1582
1611
  * --------------------------------------------------------------------------
1583
- * Bootstrap (v5.0.1): collapse.js
1612
+ * Bootstrap (v5.1.3): collapse.js
1584
1613
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1585
1614
  * --------------------------------------------------------------------------
1586
1615
  */
@@ -1590,30 +1619,32 @@
1590
1619
  * ------------------------------------------------------------------------
1591
1620
  */
1592
1621
 
1593
- const NAME$9 = 'collapse';
1594
- const DATA_KEY$8 = 'bs.collapse';
1595
- const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1622
+ const NAME$a = 'collapse';
1623
+ const DATA_KEY$9 = 'bs.collapse';
1624
+ const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1596
1625
  const DATA_API_KEY$5 = '.data-api';
1597
- const Default$8 = {
1626
+ const Default$9 = {
1598
1627
  toggle: true,
1599
- parent: ''
1628
+ parent: null
1600
1629
  };
1601
- const DefaultType$8 = {
1630
+ const DefaultType$9 = {
1602
1631
  toggle: 'boolean',
1603
- parent: '(string|element)'
1632
+ parent: '(null|element)'
1604
1633
  };
1605
- const EVENT_SHOW$5 = `show${EVENT_KEY$8}`;
1606
- const EVENT_SHOWN$5 = `shown${EVENT_KEY$8}`;
1607
- const EVENT_HIDE$5 = `hide${EVENT_KEY$8}`;
1608
- const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$8}`;
1609
- const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
1610
- const CLASS_NAME_SHOW$8 = 'show';
1634
+ const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;
1635
+ const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;
1636
+ const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;
1637
+ const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;
1638
+ const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;
1639
+ const CLASS_NAME_SHOW$7 = 'show';
1611
1640
  const CLASS_NAME_COLLAPSE = 'collapse';
1612
1641
  const CLASS_NAME_COLLAPSING = 'collapsing';
1613
1642
  const CLASS_NAME_COLLAPSED = 'collapsed';
1643
+ const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
1644
+ const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1614
1645
  const WIDTH = 'width';
1615
1646
  const HEIGHT = 'height';
1616
- const SELECTOR_ACTIVES = '.show, .collapsing';
1647
+ const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
1617
1648
  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
1618
1649
  /**
1619
1650
  * ------------------------------------------------------------------------
@@ -1626,7 +1657,7 @@
1626
1657
  super(element);
1627
1658
  this._isTransitioning = false;
1628
1659
  this._config = this._getConfig(config);
1629
- this._triggerArray = SelectorEngine.find(`${SELECTOR_DATA_TOGGLE$4}[href="#${this._element.id}"],` + `${SELECTOR_DATA_TOGGLE$4}[data-bs-target="#${this._element.id}"]`);
1660
+ this._triggerArray = [];
1630
1661
  const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1631
1662
 
1632
1663
  for (let i = 0, len = toggleList.length; i < len; i++) {
@@ -1641,10 +1672,10 @@
1641
1672
  }
1642
1673
  }
1643
1674
 
1644
- this._parent = this._config.parent ? this._getParent() : null;
1675
+ this._initializeChildren();
1645
1676
 
1646
1677
  if (!this._config.parent) {
1647
- this._addAriaAndCollapsedClass(this._element, this._triggerArray);
1678
+ this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1648
1679
  }
1649
1680
 
1650
1681
  if (this._config.toggle) {
@@ -1654,16 +1685,16 @@
1654
1685
 
1655
1686
 
1656
1687
  static get Default() {
1657
- return Default$8;
1688
+ return Default$9;
1658
1689
  }
1659
1690
 
1660
1691
  static get NAME() {
1661
- return NAME$9;
1692
+ return NAME$a;
1662
1693
  } // Public
1663
1694
 
1664
1695
 
1665
1696
  toggle() {
1666
- if (this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1697
+ if (this._isShown()) {
1667
1698
  this.hide();
1668
1699
  } else {
1669
1700
  this.show();
@@ -1671,32 +1702,23 @@
1671
1702
  }
1672
1703
 
1673
1704
  show() {
1674
- if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1705
+ if (this._isTransitioning || this._isShown()) {
1675
1706
  return;
1676
1707
  }
1677
1708
 
1678
- let actives;
1709
+ let actives = [];
1679
1710
  let activesData;
1680
1711
 
1681
- if (this._parent) {
1682
- actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent).filter(elem => {
1683
- if (typeof this._config.parent === 'string') {
1684
- return elem.getAttribute('data-bs-parent') === this._config.parent;
1685
- }
1686
-
1687
- return elem.classList.contains(CLASS_NAME_COLLAPSE);
1688
- });
1689
-
1690
- if (actives.length === 0) {
1691
- actives = null;
1692
- }
1712
+ if (this._config.parent) {
1713
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
1714
+ actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth
1693
1715
  }
1694
1716
 
1695
1717
  const container = SelectorEngine.findOne(this._selector);
1696
1718
 
1697
- if (actives) {
1719
+ if (actives.length) {
1698
1720
  const tempActiveData = actives.find(elem => container !== elem);
1699
- activesData = tempActiveData ? Data.get(tempActiveData, DATA_KEY$8) : null;
1721
+ activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;
1700
1722
 
1701
1723
  if (activesData && activesData._isTransitioning) {
1702
1724
  return;
@@ -1709,17 +1731,17 @@
1709
1731
  return;
1710
1732
  }
1711
1733
 
1712
- if (actives) {
1713
- actives.forEach(elemActive => {
1714
- if (container !== elemActive) {
1715
- Collapse.collapseInterface(elemActive, 'hide');
1716
- }
1734
+ actives.forEach(elemActive => {
1735
+ if (container !== elemActive) {
1736
+ Collapse.getOrCreateInstance(elemActive, {
1737
+ toggle: false
1738
+ }).hide();
1739
+ }
1717
1740
 
1718
- if (!activesData) {
1719
- Data.set(elemActive, DATA_KEY$8, null);
1720
- }
1721
- });
1722
- }
1741
+ if (!activesData) {
1742
+ Data.set(elemActive, DATA_KEY$9, null);
1743
+ }
1744
+ });
1723
1745
 
1724
1746
  const dimension = this._getDimension();
1725
1747
 
@@ -1729,22 +1751,18 @@
1729
1751
 
1730
1752
  this._element.style[dimension] = 0;
1731
1753
 
1732
- if (this._triggerArray.length) {
1733
- this._triggerArray.forEach(element => {
1734
- element.classList.remove(CLASS_NAME_COLLAPSED);
1735
- element.setAttribute('aria-expanded', true);
1736
- });
1737
- }
1754
+ this._addAriaAndCollapsedClass(this._triggerArray, true);
1738
1755
 
1739
- this.setTransitioning(true);
1756
+ this._isTransitioning = true;
1740
1757
 
1741
1758
  const complete = () => {
1759
+ this._isTransitioning = false;
1760
+
1742
1761
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
1743
1762
 
1744
- this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8);
1763
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1745
1764
 
1746
1765
  this._element.style[dimension] = '';
1747
- this.setTransitioning(false);
1748
1766
  EventHandler.trigger(this._element, EVENT_SHOWN$5);
1749
1767
  };
1750
1768
 
@@ -1757,7 +1775,7 @@
1757
1775
  }
1758
1776
 
1759
1777
  hide() {
1760
- if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW$8)) {
1778
+ if (this._isTransitioning || !this._isShown()) {
1761
1779
  return;
1762
1780
  }
1763
1781
 
@@ -1774,26 +1792,23 @@
1774
1792
 
1775
1793
  this._element.classList.add(CLASS_NAME_COLLAPSING);
1776
1794
 
1777
- this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8);
1795
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1778
1796
 
1779
1797
  const triggerArrayLength = this._triggerArray.length;
1780
1798
 
1781
- if (triggerArrayLength > 0) {
1782
- for (let i = 0; i < triggerArrayLength; i++) {
1783
- const trigger = this._triggerArray[i];
1784
- const elem = getElementFromSelector(trigger);
1799
+ for (let i = 0; i < triggerArrayLength; i++) {
1800
+ const trigger = this._triggerArray[i];
1801
+ const elem = getElementFromSelector(trigger);
1785
1802
 
1786
- if (elem && !elem.classList.contains(CLASS_NAME_SHOW$8)) {
1787
- trigger.classList.add(CLASS_NAME_COLLAPSED);
1788
- trigger.setAttribute('aria-expanded', false);
1789
- }
1803
+ if (elem && !this._isShown(elem)) {
1804
+ this._addAriaAndCollapsedClass([trigger], false);
1790
1805
  }
1791
1806
  }
1792
1807
 
1793
- this.setTransitioning(true);
1808
+ this._isTransitioning = true;
1794
1809
 
1795
1810
  const complete = () => {
1796
- this.setTransitioning(false);
1811
+ this._isTransitioning = false;
1797
1812
 
1798
1813
  this._element.classList.remove(CLASS_NAME_COLLAPSING);
1799
1814
 
@@ -1807,45 +1822,47 @@
1807
1822
  this._queueCallback(complete, this._element, true);
1808
1823
  }
1809
1824
 
1810
- setTransitioning(isTransitioning) {
1811
- this._isTransitioning = isTransitioning;
1825
+ _isShown(element = this._element) {
1826
+ return element.classList.contains(CLASS_NAME_SHOW$7);
1812
1827
  } // Private
1813
1828
 
1814
1829
 
1815
1830
  _getConfig(config) {
1816
- config = { ...Default$8,
1831
+ config = { ...Default$9,
1832
+ ...Manipulator.getDataAttributes(this._element),
1817
1833
  ...config
1818
1834
  };
1819
1835
  config.toggle = Boolean(config.toggle); // Coerce string values
1820
1836
 
1821
- typeCheckConfig(NAME$9, config, DefaultType$8);
1837
+ config.parent = getElement(config.parent);
1838
+ typeCheckConfig(NAME$a, config, DefaultType$9);
1822
1839
  return config;
1823
1840
  }
1824
1841
 
1825
1842
  _getDimension() {
1826
- return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT;
1843
+ return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1827
1844
  }
1828
1845
 
1829
- _getParent() {
1830
- let {
1831
- parent
1832
- } = this._config;
1833
- parent = getElement(parent);
1834
- const selector = `${SELECTOR_DATA_TOGGLE$4}[data-bs-parent="${parent}"]`;
1835
- SelectorEngine.find(selector, parent).forEach(element => {
1846
+ _initializeChildren() {
1847
+ if (!this._config.parent) {
1848
+ return;
1849
+ }
1850
+
1851
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
1852
+ SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {
1836
1853
  const selected = getElementFromSelector(element);
1837
1854
 
1838
- this._addAriaAndCollapsedClass(selected, [element]);
1855
+ if (selected) {
1856
+ this._addAriaAndCollapsedClass([element], this._isShown(selected));
1857
+ }
1839
1858
  });
1840
- return parent;
1841
1859
  }
1842
1860
 
1843
- _addAriaAndCollapsedClass(element, triggerArray) {
1844
- if (!element || !triggerArray.length) {
1861
+ _addAriaAndCollapsedClass(triggerArray, isOpen) {
1862
+ if (!triggerArray.length) {
1845
1863
  return;
1846
1864
  }
1847
1865
 
1848
- const isOpen = element.classList.contains(CLASS_NAME_SHOW$8);
1849
1866
  triggerArray.forEach(elem => {
1850
1867
  if (isOpen) {
1851
1868
  elem.classList.remove(CLASS_NAME_COLLAPSED);
@@ -1858,33 +1875,23 @@
1858
1875
  } // Static
1859
1876
 
1860
1877
 
1861
- static collapseInterface(element, config) {
1862
- let data = Data.get(element, DATA_KEY$8);
1863
- const _config = { ...Default$8,
1864
- ...Manipulator.getDataAttributes(element),
1865
- ...(typeof config === 'object' && config ? config : {})
1866
- };
1867
-
1868
- if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) {
1869
- _config.toggle = false;
1870
- }
1871
-
1872
- if (!data) {
1873
- data = new Collapse(element, _config);
1874
- }
1878
+ static jQueryInterface(config) {
1879
+ return this.each(function () {
1880
+ const _config = {};
1875
1881
 
1876
- if (typeof config === 'string') {
1877
- if (typeof data[config] === 'undefined') {
1878
- throw new TypeError(`No method named "${config}"`);
1882
+ if (typeof config === 'string' && /show|hide/.test(config)) {
1883
+ _config.toggle = false;
1879
1884
  }
1880
1885
 
1881
- data[config]();
1882
- }
1883
- }
1886
+ const data = Collapse.getOrCreateInstance(this, _config);
1884
1887
 
1885
- static jQueryInterface(config) {
1886
- return this.each(function () {
1887
- Collapse.collapseInterface(this, config);
1888
+ if (typeof config === 'string') {
1889
+ if (typeof data[config] === 'undefined') {
1890
+ throw new TypeError(`No method named "${config}"`);
1891
+ }
1892
+
1893
+ data[config]();
1894
+ }
1888
1895
  });
1889
1896
  }
1890
1897
 
@@ -1902,26 +1909,12 @@
1902
1909
  event.preventDefault();
1903
1910
  }
1904
1911
 
1905
- const triggerData = Manipulator.getDataAttributes(this);
1906
1912
  const selector = getSelectorFromElement(this);
1907
1913
  const selectorElements = SelectorEngine.find(selector);
1908
1914
  selectorElements.forEach(element => {
1909
- const data = Data.get(element, DATA_KEY$8);
1910
- let config;
1911
-
1912
- if (data) {
1913
- // update parent attribute
1914
- if (data._parent === null && typeof triggerData.parent === 'string') {
1915
- data._config.parent = triggerData.parent;
1916
- data._parent = data._getParent();
1917
- }
1918
-
1919
- config = 'toggle';
1920
- } else {
1921
- config = triggerData;
1922
- }
1923
-
1924
- Collapse.collapseInterface(element, config);
1915
+ Collapse.getOrCreateInstance(element, {
1916
+ toggle: false
1917
+ }).toggle();
1925
1918
  });
1926
1919
  });
1927
1920
  /**
@@ -2076,7 +2069,7 @@
2076
2069
  } // eslint-disable-next-line import/no-unused-modules
2077
2070
 
2078
2071
 
2079
- var applyStyles$1 = {
2072
+ const applyStyles$1 = {
2080
2073
  name: 'applyStyles',
2081
2074
  enabled: true,
2082
2075
  phase: 'write',
@@ -2089,17 +2082,39 @@
2089
2082
  return placement.split('-')[0];
2090
2083
  }
2091
2084
 
2092
- function getBoundingClientRect(element) {
2085
+ // import { isHTMLElement } from './instanceOf';
2086
+ function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars
2087
+ includeScale) {
2088
+
2093
2089
  var rect = element.getBoundingClientRect();
2090
+ var scaleX = 1;
2091
+ var scaleY = 1; // FIXME:
2092
+ // `offsetWidth` returns an integer while `getBoundingClientRect`
2093
+ // returns a float. This results in `scaleX` or `scaleY` being
2094
+ // non-1 when it should be for elements that aren't a full pixel in
2095
+ // width or height.
2096
+ // if (isHTMLElement(element) && includeScale) {
2097
+ // const offsetHeight = element.offsetHeight;
2098
+ // const offsetWidth = element.offsetWidth;
2099
+ // // Do not attempt to divide by 0, otherwise we get `Infinity` as scale
2100
+ // // Fallback to 1 in case both values are `0`
2101
+ // if (offsetWidth > 0) {
2102
+ // scaleX = rect.width / offsetWidth || 1;
2103
+ // }
2104
+ // if (offsetHeight > 0) {
2105
+ // scaleY = rect.height / offsetHeight || 1;
2106
+ // }
2107
+ // }
2108
+
2094
2109
  return {
2095
- width: rect.width,
2096
- height: rect.height,
2097
- top: rect.top,
2098
- right: rect.right,
2099
- bottom: rect.bottom,
2100
- left: rect.left,
2101
- x: rect.left,
2102
- y: rect.top
2110
+ width: rect.width / scaleX,
2111
+ height: rect.height / scaleY,
2112
+ top: rect.top / scaleY,
2113
+ right: rect.right / scaleX,
2114
+ bottom: rect.bottom / scaleY,
2115
+ left: rect.left / scaleX,
2116
+ x: rect.left / scaleX,
2117
+ y: rect.top / scaleY
2103
2118
  };
2104
2119
  }
2105
2120
 
@@ -2344,7 +2359,7 @@
2344
2359
  } // eslint-disable-next-line import/no-unused-modules
2345
2360
 
2346
2361
 
2347
- var arrow$1 = {
2362
+ const arrow$1 = {
2348
2363
  name: 'arrow',
2349
2364
  enabled: true,
2350
2365
  phase: 'main',
@@ -2354,6 +2369,10 @@
2354
2369
  requiresIfExists: ['preventOverflow']
2355
2370
  };
2356
2371
 
2372
+ function getVariation(placement) {
2373
+ return placement.split('-')[1];
2374
+ }
2375
+
2357
2376
  var unsetSides = {
2358
2377
  top: 'auto',
2359
2378
  right: 'auto',
@@ -2380,6 +2399,7 @@
2380
2399
  var popper = _ref2.popper,
2381
2400
  popperRect = _ref2.popperRect,
2382
2401
  placement = _ref2.placement,
2402
+ variation = _ref2.variation,
2383
2403
  offsets = _ref2.offsets,
2384
2404
  position = _ref2.position,
2385
2405
  gpuAcceleration = _ref2.gpuAcceleration,
@@ -2406,7 +2426,7 @@
2406
2426
  if (offsetParent === getWindow(popper)) {
2407
2427
  offsetParent = getDocumentElement(popper);
2408
2428
 
2409
- if (getComputedStyle$1(offsetParent).position !== 'static') {
2429
+ if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') {
2410
2430
  heightProp = 'scrollHeight';
2411
2431
  widthProp = 'scrollWidth';
2412
2432
  }
@@ -2415,14 +2435,14 @@
2415
2435
 
2416
2436
  offsetParent = offsetParent;
2417
2437
 
2418
- if (placement === top) {
2438
+ if (placement === top || (placement === left || placement === right) && variation === end) {
2419
2439
  sideY = bottom; // $FlowFixMe[prop-missing]
2420
2440
 
2421
2441
  y -= offsetParent[heightProp] - popperRect.height;
2422
2442
  y *= gpuAcceleration ? 1 : -1;
2423
2443
  }
2424
2444
 
2425
- if (placement === left) {
2445
+ if (placement === left || (placement === top || placement === bottom) && variation === end) {
2426
2446
  sideX = right; // $FlowFixMe[prop-missing]
2427
2447
 
2428
2448
  x -= offsetParent[widthProp] - popperRect.width;
@@ -2437,7 +2457,7 @@
2437
2457
  if (gpuAcceleration) {
2438
2458
  var _Object$assign;
2439
2459
 
2440
- return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
2460
+ return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
2441
2461
  }
2442
2462
 
2443
2463
  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2));
@@ -2455,6 +2475,7 @@
2455
2475
 
2456
2476
  var commonStyles = {
2457
2477
  placement: getBasePlacement(state.placement),
2478
+ variation: getVariation(state.placement),
2458
2479
  popper: state.elements.popper,
2459
2480
  popperRect: state.rects.popper,
2460
2481
  gpuAcceleration: gpuAcceleration
@@ -2484,7 +2505,7 @@
2484
2505
  } // eslint-disable-next-line import/no-unused-modules
2485
2506
 
2486
2507
 
2487
- var computeStyles$1 = {
2508
+ const computeStyles$1 = {
2488
2509
  name: 'computeStyles',
2489
2510
  enabled: true,
2490
2511
  phase: 'beforeWrite',
@@ -2531,7 +2552,7 @@
2531
2552
  } // eslint-disable-next-line import/no-unused-modules
2532
2553
 
2533
2554
 
2534
- var eventListeners = {
2555
+ const eventListeners = {
2535
2556
  name: 'eventListeners',
2536
2557
  enabled: true,
2537
2558
  phase: 'write',
@@ -2757,10 +2778,6 @@
2757
2778
  return clippingRect;
2758
2779
  }
2759
2780
 
2760
- function getVariation(placement) {
2761
- return placement.split('-')[1];
2762
- }
2763
-
2764
2781
  function computeOffsets(_ref) {
2765
2782
  var reference = _ref.reference,
2766
2783
  element = _ref.element,
@@ -2846,11 +2863,10 @@
2846
2863
  padding = _options$padding === void 0 ? 0 : _options$padding;
2847
2864
  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
2848
2865
  var altContext = elementContext === popper ? reference : popper;
2849
- var referenceElement = state.elements.reference;
2850
2866
  var popperRect = state.rects.popper;
2851
2867
  var element = state.elements[altBoundary ? altContext : elementContext];
2852
2868
  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);
2853
- var referenceClientRect = getBoundingClientRect(referenceElement);
2869
+ var referenceClientRect = getBoundingClientRect(state.elements.reference);
2854
2870
  var popperOffsets = computeOffsets({
2855
2871
  reference: referenceClientRect,
2856
2872
  element: popperRect,
@@ -3050,7 +3066,7 @@
3050
3066
  } // eslint-disable-next-line import/no-unused-modules
3051
3067
 
3052
3068
 
3053
- var flip$1 = {
3069
+ const flip$1 = {
3054
3070
  name: 'flip',
3055
3071
  enabled: true,
3056
3072
  phase: 'main',
@@ -3083,7 +3099,7 @@
3083
3099
  });
3084
3100
  }
3085
3101
 
3086
- function hide$1(_ref) {
3102
+ function hide(_ref) {
3087
3103
  var state = _ref.state,
3088
3104
  name = _ref.name;
3089
3105
  var referenceRect = state.rects.reference;
@@ -3112,12 +3128,12 @@
3112
3128
  } // eslint-disable-next-line import/no-unused-modules
3113
3129
 
3114
3130
 
3115
- var hide$2 = {
3131
+ const hide$1 = {
3116
3132
  name: 'hide',
3117
3133
  enabled: true,
3118
3134
  phase: 'main',
3119
3135
  requiresIfExists: ['preventOverflow'],
3120
- fn: hide$1
3136
+ fn: hide
3121
3137
  };
3122
3138
 
3123
3139
  function distanceAndSkiddingToXY(placement, rects, offset) {
@@ -3164,7 +3180,7 @@
3164
3180
  } // eslint-disable-next-line import/no-unused-modules
3165
3181
 
3166
3182
 
3167
- var offset$1 = {
3183
+ const offset$1 = {
3168
3184
  name: 'offset',
3169
3185
  enabled: true,
3170
3186
  phase: 'main',
@@ -3188,7 +3204,7 @@
3188
3204
  } // eslint-disable-next-line import/no-unused-modules
3189
3205
 
3190
3206
 
3191
- var popperOffsets$1 = {
3207
+ const popperOffsets$1 = {
3192
3208
  name: 'popperOffsets',
3193
3209
  enabled: true,
3194
3210
  phase: 'read',
@@ -3304,7 +3320,7 @@
3304
3320
  } // eslint-disable-next-line import/no-unused-modules
3305
3321
 
3306
3322
 
3307
- var preventOverflow$1 = {
3323
+ const preventOverflow$1 = {
3308
3324
  name: 'preventOverflow',
3309
3325
  enabled: true,
3310
3326
  phase: 'main',
@@ -3327,16 +3343,24 @@
3327
3343
  }
3328
3344
  }
3329
3345
 
3346
+ function isElementScaled(element) {
3347
+ var rect = element.getBoundingClientRect();
3348
+ var scaleX = rect.width / element.offsetWidth || 1;
3349
+ var scaleY = rect.height / element.offsetHeight || 1;
3350
+ return scaleX !== 1 || scaleY !== 1;
3351
+ } // Returns the composite rect of an element relative to its offsetParent.
3330
3352
  // Composite means it takes into account transforms as well as layout.
3331
3353
 
3354
+
3332
3355
  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
3333
3356
  if (isFixed === void 0) {
3334
3357
  isFixed = false;
3335
3358
  }
3336
3359
 
3360
+ var isOffsetParentAnElement = isHTMLElement(offsetParent);
3361
+ isHTMLElement(offsetParent) && isElementScaled(offsetParent);
3337
3362
  var documentElement = getDocumentElement(offsetParent);
3338
3363
  var rect = getBoundingClientRect(elementOrVirtualElement);
3339
- var isOffsetParentAnElement = isHTMLElement(offsetParent);
3340
3364
  var scroll = {
3341
3365
  scrollLeft: 0,
3342
3366
  scrollTop: 0
@@ -3490,7 +3514,8 @@
3490
3514
  var isDestroyed = false;
3491
3515
  var instance = {
3492
3516
  state: state,
3493
- setOptions: function setOptions(options) {
3517
+ setOptions: function setOptions(setOptionsAction) {
3518
+ var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;
3494
3519
  cleanupModifierEffects();
3495
3520
  state.options = Object.assign({}, defaultOptions, state.options, options);
3496
3521
  state.scrollParents = {
@@ -3640,48 +3665,48 @@
3640
3665
  defaultModifiers: defaultModifiers$1
3641
3666
  }); // eslint-disable-next-line import/no-unused-modules
3642
3667
 
3643
- var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$2];
3668
+ var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];
3644
3669
  var createPopper = /*#__PURE__*/popperGenerator({
3645
3670
  defaultModifiers: defaultModifiers
3646
3671
  }); // eslint-disable-next-line import/no-unused-modules
3647
3672
 
3648
- var Popper = /*#__PURE__*/Object.freeze({
3673
+ const Popper = /*#__PURE__*/Object.freeze({
3649
3674
  __proto__: null,
3650
- popperGenerator: popperGenerator,
3651
- detectOverflow: detectOverflow,
3675
+ popperGenerator,
3676
+ detectOverflow,
3652
3677
  createPopperBase: createPopper$2,
3653
- createPopper: createPopper,
3678
+ createPopper,
3654
3679
  createPopperLite: createPopper$1,
3655
- top: top,
3656
- bottom: bottom,
3657
- right: right,
3658
- left: left,
3659
- auto: auto,
3660
- basePlacements: basePlacements,
3661
- start: start,
3662
- end: end,
3663
- clippingParents: clippingParents,
3664
- viewport: viewport,
3665
- popper: popper,
3666
- reference: reference,
3667
- variationPlacements: variationPlacements,
3668
- placements: placements,
3669
- beforeRead: beforeRead,
3670
- read: read,
3671
- afterRead: afterRead,
3672
- beforeMain: beforeMain,
3673
- main: main,
3674
- afterMain: afterMain,
3675
- beforeWrite: beforeWrite,
3676
- write: write,
3677
- afterWrite: afterWrite,
3678
- modifierPhases: modifierPhases,
3680
+ top,
3681
+ bottom,
3682
+ right,
3683
+ left,
3684
+ auto,
3685
+ basePlacements,
3686
+ start,
3687
+ end,
3688
+ clippingParents,
3689
+ viewport,
3690
+ popper,
3691
+ reference,
3692
+ variationPlacements,
3693
+ placements,
3694
+ beforeRead,
3695
+ read,
3696
+ afterRead,
3697
+ beforeMain,
3698
+ main,
3699
+ afterMain,
3700
+ beforeWrite,
3701
+ write,
3702
+ afterWrite,
3703
+ modifierPhases,
3679
3704
  applyStyles: applyStyles$1,
3680
3705
  arrow: arrow$1,
3681
3706
  computeStyles: computeStyles$1,
3682
- eventListeners: eventListeners,
3707
+ eventListeners,
3683
3708
  flip: flip$1,
3684
- hide: hide$2,
3709
+ hide: hide$1,
3685
3710
  offset: offset$1,
3686
3711
  popperOffsets: popperOffsets$1,
3687
3712
  preventOverflow: preventOverflow$1
@@ -3689,7 +3714,7 @@
3689
3714
 
3690
3715
  /**
3691
3716
  * --------------------------------------------------------------------------
3692
- * Bootstrap (v5.0.1): dropdown.js
3717
+ * Bootstrap (v5.1.3): dropdown.js
3693
3718
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3694
3719
  * --------------------------------------------------------------------------
3695
3720
  */
@@ -3699,27 +3724,26 @@
3699
3724
  * ------------------------------------------------------------------------
3700
3725
  */
3701
3726
 
3702
- const NAME$8 = 'dropdown';
3703
- const DATA_KEY$7 = 'bs.dropdown';
3704
- const EVENT_KEY$7 = `.${DATA_KEY$7}`;
3727
+ const NAME$9 = 'dropdown';
3728
+ const DATA_KEY$8 = 'bs.dropdown';
3729
+ const EVENT_KEY$8 = `.${DATA_KEY$8}`;
3705
3730
  const DATA_API_KEY$4 = '.data-api';
3706
3731
  const ESCAPE_KEY$2 = 'Escape';
3707
3732
  const SPACE_KEY = 'Space';
3708
- const TAB_KEY = 'Tab';
3733
+ const TAB_KEY$1 = 'Tab';
3709
3734
  const ARROW_UP_KEY = 'ArrowUp';
3710
3735
  const ARROW_DOWN_KEY = 'ArrowDown';
3711
3736
  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
3712
3737
 
3713
3738
  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);
3714
- const EVENT_HIDE$4 = `hide${EVENT_KEY$7}`;
3715
- const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$7}`;
3716
- const EVENT_SHOW$4 = `show${EVENT_KEY$7}`;
3717
- const EVENT_SHOWN$4 = `shown${EVENT_KEY$7}`;
3718
- const EVENT_CLICK = `click${EVENT_KEY$7}`;
3719
- const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
3720
- const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$7}${DATA_API_KEY$4}`;
3721
- const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$7}${DATA_API_KEY$4}`;
3722
- const CLASS_NAME_SHOW$7 = 'show';
3739
+ const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;
3740
+ const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;
3741
+ const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;
3742
+ const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;
3743
+ const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;
3744
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;
3745
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;
3746
+ const CLASS_NAME_SHOW$6 = 'show';
3723
3747
  const CLASS_NAME_DROPUP = 'dropup';
3724
3748
  const CLASS_NAME_DROPEND = 'dropend';
3725
3749
  const CLASS_NAME_DROPSTART = 'dropstart';
@@ -3734,7 +3758,7 @@
3734
3758
  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
3735
3759
  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
3736
3760
  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
3737
- const Default$7 = {
3761
+ const Default$8 = {
3738
3762
  offset: [0, 2],
3739
3763
  boundary: 'clippingParents',
3740
3764
  reference: 'toggle',
@@ -3742,7 +3766,7 @@
3742
3766
  popperConfig: null,
3743
3767
  autoClose: true
3744
3768
  };
3745
- const DefaultType$7 = {
3769
+ const DefaultType$8 = {
3746
3770
  offset: '(array|string|function)',
3747
3771
  boundary: '(string|element)',
3748
3772
  reference: '(string|element|object)',
@@ -3763,45 +3787,31 @@
3763
3787
  this._config = this._getConfig(config);
3764
3788
  this._menu = this._getMenuElement();
3765
3789
  this._inNavbar = this._detectNavbar();
3766
-
3767
- this._addEventListeners();
3768
3790
  } // Getters
3769
3791
 
3770
3792
 
3771
3793
  static get Default() {
3772
- return Default$7;
3794
+ return Default$8;
3773
3795
  }
3774
3796
 
3775
3797
  static get DefaultType() {
3776
- return DefaultType$7;
3798
+ return DefaultType$8;
3777
3799
  }
3778
3800
 
3779
3801
  static get NAME() {
3780
- return NAME$8;
3802
+ return NAME$9;
3781
3803
  } // Public
3782
3804
 
3783
3805
 
3784
3806
  toggle() {
3785
- if (isDisabled(this._element)) {
3786
- return;
3787
- }
3788
-
3789
- const isActive = this._element.classList.contains(CLASS_NAME_SHOW$7);
3790
-
3791
- if (isActive) {
3792
- this.hide();
3793
- return;
3794
- }
3795
-
3796
- this.show();
3807
+ return this._isShown() ? this.hide() : this.show();
3797
3808
  }
3798
3809
 
3799
3810
  show() {
3800
- if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW$7)) {
3811
+ if (isDisabled(this._element) || this._isShown(this._menu)) {
3801
3812
  return;
3802
3813
  }
3803
3814
 
3804
- const parent = Dropdown.getParentFromElement(this._element);
3805
3815
  const relatedTarget = {
3806
3816
  relatedTarget: this._element
3807
3817
  };
@@ -3809,34 +3819,14 @@
3809
3819
 
3810
3820
  if (showEvent.defaultPrevented) {
3811
3821
  return;
3812
- } // Totally disable Popper for Dropdowns in Navbar
3822
+ }
3813
3823
 
3824
+ const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar
3814
3825
 
3815
3826
  if (this._inNavbar) {
3816
3827
  Manipulator.setDataAttribute(this._menu, 'popper', 'none');
3817
3828
  } else {
3818
- if (typeof Popper === 'undefined') {
3819
- throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
3820
- }
3821
-
3822
- let referenceElement = this._element;
3823
-
3824
- if (this._config.reference === 'parent') {
3825
- referenceElement = parent;
3826
- } else if (isElement$1(this._config.reference)) {
3827
- referenceElement = getElement(this._config.reference);
3828
- } else if (typeof this._config.reference === 'object') {
3829
- referenceElement = this._config.reference;
3830
- }
3831
-
3832
- const popperConfig = this._getPopperConfig();
3833
-
3834
- const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
3835
- this._popper = createPopper(referenceElement, this._menu, popperConfig);
3836
-
3837
- if (isDisplayStatic) {
3838
- Manipulator.setDataAttribute(this._menu, 'popper', 'static');
3839
- }
3829
+ this._createPopper(parent);
3840
3830
  } // If this is a touch-enabled device we add extra
3841
3831
  // empty mouseover listeners to the body's immediate children;
3842
3832
  // only needed because of broken event delegation on iOS
@@ -3851,15 +3841,15 @@
3851
3841
 
3852
3842
  this._element.setAttribute('aria-expanded', true);
3853
3843
 
3854
- this._menu.classList.toggle(CLASS_NAME_SHOW$7);
3844
+ this._menu.classList.add(CLASS_NAME_SHOW$6);
3855
3845
 
3856
- this._element.classList.toggle(CLASS_NAME_SHOW$7);
3846
+ this._element.classList.add(CLASS_NAME_SHOW$6);
3857
3847
 
3858
3848
  EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
3859
3849
  }
3860
3850
 
3861
3851
  hide() {
3862
- if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW$7)) {
3852
+ if (isDisabled(this._element) || !this._isShown(this._menu)) {
3863
3853
  return;
3864
3854
  }
3865
3855
 
@@ -3887,13 +3877,6 @@
3887
3877
  } // Private
3888
3878
 
3889
3879
 
3890
- _addEventListeners() {
3891
- EventHandler.on(this._element, EVENT_CLICK, event => {
3892
- event.preventDefault();
3893
- this.toggle();
3894
- });
3895
- }
3896
-
3897
3880
  _completeHide(relatedTarget) {
3898
3881
  const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
3899
3882
 
@@ -3911,9 +3894,9 @@
3911
3894
  this._popper.destroy();
3912
3895
  }
3913
3896
 
3914
- this._menu.classList.remove(CLASS_NAME_SHOW$7);
3897
+ this._menu.classList.remove(CLASS_NAME_SHOW$6);
3915
3898
 
3916
- this._element.classList.remove(CLASS_NAME_SHOW$7);
3899
+ this._element.classList.remove(CLASS_NAME_SHOW$6);
3917
3900
 
3918
3901
  this._element.setAttribute('aria-expanded', 'false');
3919
3902
 
@@ -3926,16 +3909,45 @@
3926
3909
  ...Manipulator.getDataAttributes(this._element),
3927
3910
  ...config
3928
3911
  };
3929
- typeCheckConfig(NAME$8, config, this.constructor.DefaultType);
3912
+ typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
3930
3913
 
3931
3914
  if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
3932
3915
  // Popper virtual elements require a getBoundingClientRect method
3933
- throw new TypeError(`${NAME$8.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
3916
+ throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
3934
3917
  }
3935
3918
 
3936
3919
  return config;
3937
3920
  }
3938
3921
 
3922
+ _createPopper(parent) {
3923
+ if (typeof Popper === 'undefined') {
3924
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
3925
+ }
3926
+
3927
+ let referenceElement = this._element;
3928
+
3929
+ if (this._config.reference === 'parent') {
3930
+ referenceElement = parent;
3931
+ } else if (isElement$1(this._config.reference)) {
3932
+ referenceElement = getElement(this._config.reference);
3933
+ } else if (typeof this._config.reference === 'object') {
3934
+ referenceElement = this._config.reference;
3935
+ }
3936
+
3937
+ const popperConfig = this._getPopperConfig();
3938
+
3939
+ const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
3940
+ this._popper = createPopper(referenceElement, this._menu, popperConfig);
3941
+
3942
+ if (isDisplayStatic) {
3943
+ Manipulator.setDataAttribute(this._menu, 'popper', 'static');
3944
+ }
3945
+ }
3946
+
3947
+ _isShown(element = this._element) {
3948
+ return element.classList.contains(CLASS_NAME_SHOW$6);
3949
+ }
3950
+
3939
3951
  _getMenuElement() {
3940
3952
  return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
3941
3953
  }
@@ -4009,69 +4021,53 @@
4009
4021
  };
4010
4022
  }
4011
4023
 
4012
- _selectMenuItem(event) {
4024
+ _selectMenuItem({
4025
+ key,
4026
+ target
4027
+ }) {
4013
4028
  const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
4014
4029
 
4015
4030
  if (!items.length) {
4016
4031
  return;
4017
- }
4018
-
4019
- let index = items.indexOf(event.target); // Up
4032
+ } // if target isn't included in items (e.g. when expanding the dropdown)
4033
+ // allow cycling to get the last item in case key equals ARROW_UP_KEY
4020
4034
 
4021
- if (event.key === ARROW_UP_KEY && index > 0) {
4022
- index--;
4023
- } // Down
4024
4035
 
4025
-
4026
- if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
4027
- index++;
4028
- } // index is -1 if the first keydown is an ArrowUp
4029
-
4030
-
4031
- index = index === -1 ? 0 : index;
4032
- items[index].focus();
4036
+ getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
4033
4037
  } // Static
4034
4038
 
4035
4039
 
4036
- static dropdownInterface(element, config) {
4037
- let data = Data.get(element, DATA_KEY$7);
4038
-
4039
- const _config = typeof config === 'object' ? config : null;
4040
+ static jQueryInterface(config) {
4041
+ return this.each(function () {
4042
+ const data = Dropdown.getOrCreateInstance(this, config);
4040
4043
 
4041
- if (!data) {
4042
- data = new Dropdown(element, _config);
4043
- }
4044
+ if (typeof config !== 'string') {
4045
+ return;
4046
+ }
4044
4047
 
4045
- if (typeof config === 'string') {
4046
4048
  if (typeof data[config] === 'undefined') {
4047
4049
  throw new TypeError(`No method named "${config}"`);
4048
4050
  }
4049
4051
 
4050
4052
  data[config]();
4051
- }
4052
- }
4053
-
4054
- static jQueryInterface(config) {
4055
- return this.each(function () {
4056
- Dropdown.dropdownInterface(this, config);
4057
4053
  });
4058
4054
  }
4059
4055
 
4060
4056
  static clearMenus(event) {
4061
- if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
4057
+ if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {
4062
4058
  return;
4063
4059
  }
4064
4060
 
4065
4061
  const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);
4066
4062
 
4067
4063
  for (let i = 0, len = toggles.length; i < len; i++) {
4068
- const context = Data.get(toggles[i], DATA_KEY$7);
4064
+ const context = Dropdown.getInstance(toggles[i]);
4069
4065
 
4070
4066
  if (!context || context._config.autoClose === false) {
4071
4067
  continue;
4072
4068
  }
4073
4069
 
4074
- if (!context._element.classList.contains(CLASS_NAME_SHOW$7)) {
4070
+ if (!context._isShown()) {
4075
4071
  continue;
4076
4072
  }
4077
4073
 
@@ -4088,7 +4084,7 @@
4088
4084
  } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
4089
4085
 
4090
4086
 
4091
- if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
4087
+ if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
4092
4088
  continue;
4093
4089
  }
4094
4090
 
@@ -4117,7 +4113,7 @@
4117
4113
  return;
4118
4114
  }
4119
4115
 
4120
- const isActive = this.classList.contains(CLASS_NAME_SHOW$7);
4116
+ const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
4121
4117
 
4122
4118
  if (!isActive && event.key === ESCAPE_KEY$2) {
4123
4119
  return;
@@ -4130,25 +4126,27 @@
4130
4126
  return;
4131
4127
  }
4132
4128
 
4133
- const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
4129
+ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
4130
+ const instance = Dropdown.getOrCreateInstance(getToggleButton);
4134
4131
 
4135
4132
  if (event.key === ESCAPE_KEY$2) {
4136
- getToggleButton().focus();
4137
- Dropdown.clearMenus();
4133
+ instance.hide();
4138
4134
  return;
4139
4135
  }
4140
4136
 
4141
- if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
4142
- getToggleButton().click();
4137
+ if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
4138
+ if (!isActive) {
4139
+ instance.show();
4140
+ }
4141
+
4142
+ instance._selectMenuItem(event);
4143
+
4143
4144
  return;
4144
4145
  }
4145
4146
 
4146
4147
  if (!isActive || event.key === SPACE_KEY) {
4147
4148
  Dropdown.clearMenus();
4148
- return;
4149
4149
  }
4150
-
4151
- Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
4152
4150
  }
4153
4151
 
4154
4152
  }
@@ -4165,7 +4163,7 @@
4165
4163
  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
4166
4164
  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
4167
4165
  event.preventDefault();
4168
- Dropdown.dropdownInterface(this);
4166
+ Dropdown.getOrCreateInstance(this).toggle();
4169
4167
  });
4170
4168
  /**
4171
4169
  * ------------------------------------------------------------------------
@@ -4178,103 +4176,134 @@
4178
4176
 
4179
4177
  /**
4180
4178
  * --------------------------------------------------------------------------
4181
- * Bootstrap (v5.0.1): util/scrollBar.js
4179
+ * Bootstrap (v5.1.3): util/scrollBar.js
4182
4180
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4183
4181
  * --------------------------------------------------------------------------
4184
4182
  */
4185
4183
  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
4186
4184
  const SELECTOR_STICKY_CONTENT = '.sticky-top';
4187
4185
 
4188
- const getWidth = () => {
4189
- // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
4190
- const documentWidth = document.documentElement.clientWidth;
4191
- return Math.abs(window.innerWidth - documentWidth);
4192
- };
4186
+ class ScrollBarHelper {
4187
+ constructor() {
4188
+ this._element = document.body;
4189
+ }
4190
+
4191
+ getWidth() {
4192
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
4193
+ const documentWidth = document.documentElement.clientWidth;
4194
+ return Math.abs(window.innerWidth - documentWidth);
4195
+ }
4196
+
4197
+ hide() {
4198
+ const width = this.getWidth();
4199
+
4200
+ this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
4201
+
4202
+
4203
+ this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
4204
+
4205
+
4206
+ this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
4193
4207
 
4194
- const hide = (width = getWidth()) => {
4195
- _disableOverFlow(); // give padding to element to balances the hidden scrollbar width
4208
+ this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
4209
+ }
4196
4210
 
4211
+ _disableOverFlow() {
4212
+ this._saveInitialAttribute(this._element, 'overflow');
4197
4213
 
4198
- _setElementAttributes('body', 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements, to keep shown fullwidth
4214
+ this._element.style.overflow = 'hidden';
4215
+ }
4199
4216
 
4217
+ _setElementAttributes(selector, styleProp, callback) {
4218
+ const scrollbarWidth = this.getWidth();
4200
4219
 
4201
- _setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
4220
+ const manipulationCallBack = element => {
4221
+ if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
4222
+ return;
4223
+ }
4202
4224
 
4203
- _setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
4204
- };
4225
+ this._saveInitialAttribute(element, styleProp);
4205
4226
 
4206
- const _disableOverFlow = () => {
4207
- const actualValue = document.body.style.overflow;
4227
+ const calculatedValue = window.getComputedStyle(element)[styleProp];
4228
+ element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
4229
+ };
4208
4230
 
4209
- if (actualValue) {
4210
- Manipulator.setDataAttribute(document.body, 'overflow', actualValue);
4231
+ this._applyManipulationCallback(selector, manipulationCallBack);
4211
4232
  }
4212
4233
 
4213
- document.body.style.overflow = 'hidden';
4214
- };
4234
+ reset() {
4235
+ this._resetElementAttributes(this._element, 'overflow');
4215
4236
 
4216
- const _setElementAttributes = (selector, styleProp, callback) => {
4217
- const scrollbarWidth = getWidth();
4218
- SelectorEngine.find(selector).forEach(element => {
4219
- if (element !== document.body && window.innerWidth > element.clientWidth + scrollbarWidth) {
4220
- return;
4221
- }
4237
+ this._resetElementAttributes(this._element, 'paddingRight');
4222
4238
 
4223
- const actualValue = element.style[styleProp];
4224
- const calculatedValue = window.getComputedStyle(element)[styleProp];
4225
- Manipulator.setDataAttribute(element, styleProp, actualValue);
4226
- element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
4227
- });
4228
- };
4239
+ this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
4229
4240
 
4230
- const reset = () => {
4231
- _resetElementAttributes('body', 'overflow');
4241
+ this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
4242
+ }
4243
+
4244
+ _saveInitialAttribute(element, styleProp) {
4245
+ const actualValue = element.style[styleProp];
4232
4246
 
4233
- _resetElementAttributes('body', 'paddingRight');
4247
+ if (actualValue) {
4248
+ Manipulator.setDataAttribute(element, styleProp, actualValue);
4249
+ }
4250
+ }
4234
4251
 
4235
- _resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
4252
+ _resetElementAttributes(selector, styleProp) {
4253
+ const manipulationCallBack = element => {
4254
+ const value = Manipulator.getDataAttribute(element, styleProp);
4236
4255
 
4237
- _resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
4238
- };
4256
+ if (typeof value === 'undefined') {
4257
+ element.style.removeProperty(styleProp);
4258
+ } else {
4259
+ Manipulator.removeDataAttribute(element, styleProp);
4260
+ element.style[styleProp] = value;
4261
+ }
4262
+ };
4239
4263
 
4240
- const _resetElementAttributes = (selector, styleProp) => {
4241
- SelectorEngine.find(selector).forEach(element => {
4242
- const value = Manipulator.getDataAttribute(element, styleProp);
4264
+ this._applyManipulationCallback(selector, manipulationCallBack);
4265
+ }
4243
4266
 
4244
- if (typeof value === 'undefined') {
4245
- element.style.removeProperty(styleProp);
4267
+ _applyManipulationCallback(selector, callBack) {
4268
+ if (isElement$1(selector)) {
4269
+ callBack(selector);
4246
4270
  } else {
4247
- Manipulator.removeDataAttribute(element, styleProp);
4248
- element.style[styleProp] = value;
4271
+ SelectorEngine.find(selector, this._element).forEach(callBack);
4249
4272
  }
4250
- });
4251
- };
4273
+ }
4274
+
4275
+ isOverflowing() {
4276
+ return this.getWidth() > 0;
4277
+ }
4278
+
4279
+ }
4252
4280
 
4253
4281
  /**
4254
4282
  * --------------------------------------------------------------------------
4255
- * Bootstrap (v5.0.1): util/backdrop.js
4256
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
4283
+ * Bootstrap (v5.1.3): util/backdrop.js
4284
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4257
4285
  * --------------------------------------------------------------------------
4258
4286
  */
4259
- const Default$6 = {
4287
+ const Default$7 = {
4288
+ className: 'modal-backdrop',
4260
4289
  isVisible: true,
4261
4290
  // if false, we use the backdrop helper without adding any element to the dom
4262
4291
  isAnimated: false,
4263
- rootElement: document.body,
4292
+ rootElement: 'body',
4264
4293
  // give the choice to place backdrop under different elements
4265
4294
  clickCallback: null
4266
4295
  };
4267
- const DefaultType$6 = {
4296
+ const DefaultType$7 = {
4297
+ className: 'string',
4268
4298
  isVisible: 'boolean',
4269
4299
  isAnimated: 'boolean',
4270
- rootElement: 'element',
4300
+ rootElement: '(element|string)',
4271
4301
  clickCallback: '(function|null)'
4272
4302
  };
4273
- const NAME$7 = 'backdrop';
4274
- const CLASS_NAME_BACKDROP = 'modal-backdrop';
4275
- const CLASS_NAME_FADE$5 = 'fade';
4276
- const CLASS_NAME_SHOW$6 = 'show';
4277
- const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$7}`;
4303
+ const NAME$8 = 'backdrop';
4304
+ const CLASS_NAME_FADE$4 = 'fade';
4305
+ const CLASS_NAME_SHOW$5 = 'show';
4306
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;
4278
4307
 
4279
4308
  class Backdrop {
4280
4309
  constructor(config) {
@@ -4295,7 +4324,7 @@
4295
4324
  reflow(this._getElement());
4296
4325
  }
4297
4326
 
4298
- this._getElement().classList.add(CLASS_NAME_SHOW$6);
4327
+ this._getElement().classList.add(CLASS_NAME_SHOW$5);
4299
4328
 
4300
4329
  this._emulateAnimation(() => {
4301
4330
  execute(callback);
@@ -4308,7 +4337,7 @@
4308
4337
  return;
4309
4338
  }
4310
4339
 
4311
- this._getElement().classList.remove(CLASS_NAME_SHOW$6);
4340
+ this._getElement().classList.remove(CLASS_NAME_SHOW$5);
4312
4341
 
4313
4342
  this._emulateAnimation(() => {
4314
4343
  this.dispose();
@@ -4320,10 +4349,10 @@
4320
4349
  _getElement() {
4321
4350
  if (!this._element) {
4322
4351
  const backdrop = document.createElement('div');
4323
- backdrop.className = CLASS_NAME_BACKDROP;
4352
+ backdrop.className = this._config.className;
4324
4353
 
4325
4354
  if (this._config.isAnimated) {
4326
- backdrop.classList.add(CLASS_NAME_FADE$5);
4355
+ backdrop.classList.add(CLASS_NAME_FADE$4);
4327
4356
  }
4328
4357
 
4329
4358
  this._element = backdrop;
@@ -4333,11 +4362,12 @@
4333
4362
  }
4334
4363
 
4335
4364
  _getConfig(config) {
4336
- config = { ...Default$6,
4365
+ config = { ...Default$7,
4337
4366
  ...(typeof config === 'object' ? config : {})
4338
- };
4339
- config.rootElement = config.rootElement || document.body;
4340
- typeCheckConfig(NAME$7, config, DefaultType$6);
4367
+ }; // use getElement() with the default "body" to get a fresh Element on each instantiation
4368
+
4369
+ config.rootElement = getElement(config.rootElement);
4370
+ typeCheckConfig(NAME$8, config, DefaultType$7);
4341
4371
  return config;
4342
4372
  }
4343
4373
 
@@ -4346,7 +4376,7 @@
4346
4376
  return;
4347
4377
  }
4348
4378
 
4349
- this._config.rootElement.appendChild(this._getElement());
4379
+ this._config.rootElement.append(this._getElement());
4350
4380
 
4351
4381
  EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
4352
4382
  execute(this._config.clickCallback);
@@ -4361,27 +4391,123 @@
4361
4391
 
4362
4392
  EventHandler.off(this._element, EVENT_MOUSEDOWN);
4363
4393
 
4364
- this._getElement().parentNode.removeChild(this._element);
4394
+ this._element.remove();
4365
4395
 
4366
4396
  this._isAppended = false;
4367
4397
  }
4368
4398
 
4369
4399
  _emulateAnimation(callback) {
4370
- if (!this._config.isAnimated) {
4371
- execute(callback);
4400
+ executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
4401
+ }
4402
+
4403
+ }
4404
+
4405
+ /**
4406
+ * --------------------------------------------------------------------------
4407
+ * Bootstrap (v5.1.3): util/focustrap.js
4408
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4409
+ * --------------------------------------------------------------------------
4410
+ */
4411
+ const Default$6 = {
4412
+ trapElement: null,
4413
+ // The element to trap focus inside of
4414
+ autofocus: true
4415
+ };
4416
+ const DefaultType$6 = {
4417
+ trapElement: 'element',
4418
+ autofocus: 'boolean'
4419
+ };
4420
+ const NAME$7 = 'focustrap';
4421
+ const DATA_KEY$7 = 'bs.focustrap';
4422
+ const EVENT_KEY$7 = `.${DATA_KEY$7}`;
4423
+ const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;
4424
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
4425
+ const TAB_KEY = 'Tab';
4426
+ const TAB_NAV_FORWARD = 'forward';
4427
+ const TAB_NAV_BACKWARD = 'backward';
4428
+
4429
+ class FocusTrap {
4430
+ constructor(config) {
4431
+ this._config = this._getConfig(config);
4432
+ this._isActive = false;
4433
+ this._lastTabNavDirection = null;
4434
+ }
4435
+
4436
+ activate() {
4437
+ const {
4438
+ trapElement,
4439
+ autofocus
4440
+ } = this._config;
4441
+
4442
+ if (this._isActive) {
4443
+ return;
4444
+ }
4445
+
4446
+ if (autofocus) {
4447
+ trapElement.focus();
4448
+ }
4449
+
4450
+ EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop
4451
+
4452
+ EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));
4453
+ EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
4454
+ this._isActive = true;
4455
+ }
4456
+
4457
+ deactivate() {
4458
+ if (!this._isActive) {
4459
+ return;
4460
+ }
4461
+
4462
+ this._isActive = false;
4463
+ EventHandler.off(document, EVENT_KEY$7);
4464
+ } // Private
4465
+
4466
+
4467
+ _handleFocusin(event) {
4468
+ const {
4469
+ target
4470
+ } = event;
4471
+ const {
4472
+ trapElement
4473
+ } = this._config;
4474
+
4475
+ if (target === document || target === trapElement || trapElement.contains(target)) {
4476
+ return;
4477
+ }
4478
+
4479
+ const elements = SelectorEngine.focusableChildren(trapElement);
4480
+
4481
+ if (elements.length === 0) {
4482
+ trapElement.focus();
4483
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
4484
+ elements[elements.length - 1].focus();
4485
+ } else {
4486
+ elements[0].focus();
4487
+ }
4488
+ }
4489
+
4490
+ _handleKeydown(event) {
4491
+ if (event.key !== TAB_KEY) {
4372
4492
  return;
4373
4493
  }
4374
4494
 
4375
- const backdropTransitionDuration = getTransitionDurationFromElement(this._getElement());
4376
- EventHandler.one(this._getElement(), 'transitionend', () => execute(callback));
4377
- emulateTransitionEnd(this._getElement(), backdropTransitionDuration);
4495
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
4496
+ }
4497
+
4498
+ _getConfig(config) {
4499
+ config = { ...Default$6,
4500
+ ...(typeof config === 'object' ? config : {})
4501
+ };
4502
+ typeCheckConfig(NAME$7, config, DefaultType$6);
4503
+ return config;
4378
4504
  }
4379
4505
 
4380
4506
  }
4381
4507
 
4382
4508
  /**
4383
4509
  * --------------------------------------------------------------------------
4384
- * Bootstrap (v5.0.1): modal.js
4510
+ * Bootstrap (v5.1.3): modal.js
4385
4511
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4386
4512
  * --------------------------------------------------------------------------
4387
4513
  */
@@ -4411,21 +4537,20 @@
4411
4537
  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;
4412
4538
  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;
4413
4539
  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;
4414
- const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$6}`;
4415
4540
  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;
4416
- const EVENT_CLICK_DISMISS$2 = `click.dismiss${EVENT_KEY$6}`;
4541
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
4417
4542
  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
4418
4543
  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
4419
4544
  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
4420
4545
  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
4421
4546
  const CLASS_NAME_OPEN = 'modal-open';
4422
- const CLASS_NAME_FADE$4 = 'fade';
4423
- const CLASS_NAME_SHOW$5 = 'show';
4547
+ const CLASS_NAME_FADE$3 = 'fade';
4548
+ const CLASS_NAME_SHOW$4 = 'show';
4424
4549
  const CLASS_NAME_STATIC = 'modal-static';
4550
+ const OPEN_SELECTOR$1 = '.modal.show';
4425
4551
  const SELECTOR_DIALOG = '.modal-dialog';
4426
4552
  const SELECTOR_MODAL_BODY = '.modal-body';
4427
4553
  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
4428
- const SELECTOR_DATA_DISMISS$2 = '[data-bs-dismiss="modal"]';
4429
4554
  /**
4430
4555
  * ------------------------------------------------------------------------
4431
4556
  * Class Definition
@@ -4438,9 +4563,11 @@
4438
4563
  this._config = this._getConfig(config);
4439
4564
  this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
4440
4565
  this._backdrop = this._initializeBackDrop();
4566
+ this._focustrap = this._initializeFocusTrap();
4441
4567
  this._isShown = false;
4442
4568
  this._ignoreBackdropClick = false;
4443
4569
  this._isTransitioning = false;
4570
+ this._scrollBar = new ScrollBarHelper();
4444
4571
  } // Getters
4445
4572
 
4446
4573
 
@@ -4462,20 +4589,22 @@
4462
4589
  return;
4463
4590
  }
4464
4591
 
4465
- if (this._isAnimated()) {
4466
- this._isTransitioning = true;
4467
- }
4468
-
4469
4592
  const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
4470
4593
  relatedTarget
4471
4594
  });
4472
4595
 
4473
- if (this._isShown || showEvent.defaultPrevented) {
4596
+ if (showEvent.defaultPrevented) {
4474
4597
  return;
4475
4598
  }
4476
4599
 
4477
4600
  this._isShown = true;
4478
- hide();
4601
+
4602
+ if (this._isAnimated()) {
4603
+ this._isTransitioning = true;
4604
+ }
4605
+
4606
+ this._scrollBar.hide();
4607
+
4479
4608
  document.body.classList.add(CLASS_NAME_OPEN);
4480
4609
 
4481
4610
  this._adjustDialog();
@@ -4484,7 +4613,6 @@
4484
4613
 
4485
4614
  this._setResizeEvent();
4486
4615
 
4487
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, SELECTOR_DATA_DISMISS$2, event => this.hide(event));
4488
4616
  EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
4489
4617
  EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
4490
4618
  if (event.target === this._element) {
@@ -4496,11 +4624,7 @@
4496
4624
  this._showBackdrop(() => this._showElement(relatedTarget));
4497
4625
  }
4498
4626
 
4499
- hide(event) {
4500
- if (event) {
4501
- event.preventDefault();
4502
- }
4503
-
4627
+ hide() {
4504
4628
  if (!this._isShown || this._isTransitioning) {
4505
4629
  return;
4506
4630
  }
@@ -4523,11 +4647,11 @@
4523
4647
 
4524
4648
  this._setResizeEvent();
4525
4649
 
4526
- EventHandler.off(document, EVENT_FOCUSIN$2);
4650
+ this._focustrap.deactivate();
4527
4651
 
4528
- this._element.classList.remove(CLASS_NAME_SHOW$5);
4652
+ this._element.classList.remove(CLASS_NAME_SHOW$4);
4529
4653
 
4530
- EventHandler.off(this._element, EVENT_CLICK_DISMISS$2);
4654
+ EventHandler.off(this._element, EVENT_CLICK_DISMISS);
4531
4655
  EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
4532
4656
 
4533
4657
  this._queueCallback(() => this._hideModal(), this._element, isAnimated);
@@ -4538,14 +4662,9 @@
4538
4662
 
4539
4663
  this._backdrop.dispose();
4540
4664
 
4541
- super.dispose();
4542
- /**
4543
- * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
4544
- * Do not move `document` in `htmlElements` array
4545
- * It will remove `EVENT_CLICK_DATA_API` event that should remain
4546
- */
4665
+ this._focustrap.deactivate();
4547
4666
 
4548
- EventHandler.off(document, EVENT_FOCUSIN$2);
4667
+ super.dispose();
4549
4668
  }
4550
4669
 
4551
4670
  handleUpdate() {
@@ -4561,10 +4680,16 @@
4561
4680
  });
4562
4681
  }
4563
4682
 
4683
+ _initializeFocusTrap() {
4684
+ return new FocusTrap({
4685
+ trapElement: this._element
4686
+ });
4687
+ }
4688
+
4564
4689
  _getConfig(config) {
4565
4690
  config = { ...Default$5,
4566
4691
  ...Manipulator.getDataAttributes(this._element),
4567
- ...config
4692
+ ...(typeof config === 'object' ? config : {})
4568
4693
  };
4569
4694
  typeCheckConfig(NAME$6, config, DefaultType$5);
4570
4695
  return config;
@@ -4577,7 +4702,7 @@
4577
4702
 
4578
4703
  if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
4579
4704
  // Don't move modal's DOM position
4580
- document.body.appendChild(this._element);
4705
+ document.body.append(this._element);
4581
4706
  }
4582
4707
 
4583
4708
  this._element.style.display = 'block';
@@ -4598,15 +4723,11 @@
4598
4723
  reflow(this._element);
4599
4724
  }
4600
4725
 
4601
- this._element.classList.add(CLASS_NAME_SHOW$5);
4602
-
4603
- if (this._config.focus) {
4604
- this._enforceFocus();
4605
- }
4726
+ this._element.classList.add(CLASS_NAME_SHOW$4);
4606
4727
 
4607
4728
  const transitionComplete = () => {
4608
4729
  if (this._config.focus) {
4609
- this._element.focus();
4730
+ this._focustrap.activate();
4610
4731
  }
4611
4732
 
4612
4733
  this._isTransitioning = false;
@@ -4618,16 +4739,6 @@
4618
4739
  this._queueCallback(transitionComplete, this._dialog, isAnimated);
4619
4740
  }
4620
4741
 
4621
- _enforceFocus() {
4622
- EventHandler.off(document, EVENT_FOCUSIN$2); // guard against infinite focus loop
4623
-
4624
- EventHandler.on(document, EVENT_FOCUSIN$2, event => {
4625
- if (document !== event.target && this._element !== event.target && !this._element.contains(event.target)) {
4626
- this._element.focus();
4627
- }
4628
- });
4629
- }
4630
-
4631
4742
  _setEscapeEvent() {
4632
4743
  if (this._isShown) {
4633
4744
  EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
@@ -4667,13 +4778,14 @@
4667
4778
 
4668
4779
  this._resetAdjustments();
4669
4780
 
4670
- reset();
4781
+ this._scrollBar.reset();
4782
+
4671
4783
  EventHandler.trigger(this._element, EVENT_HIDDEN$3);
4672
4784
  });
4673
4785
  }
4674
4786
 
4675
4787
  _showBackdrop(callback) {
4676
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, event => {
4788
+ EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {
4677
4789
  if (this._ignoreBackdropClick) {
4678
4790
  this._ignoreBackdropClick = false;
4679
4791
  return;
@@ -4694,7 +4806,7 @@
4694
4806
  }
4695
4807
 
4696
4808
  _isAnimated() {
4697
- return this._element.classList.contains(CLASS_NAME_FADE$4);
4809
+ return this._element.classList.contains(CLASS_NAME_FADE$3);
4698
4810
  }
4699
4811
 
4700
4812
  _triggerBackdropTransition() {
@@ -4704,27 +4816,32 @@
4704
4816
  return;
4705
4817
  }
4706
4818
 
4707
- const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
4819
+ const {
4820
+ classList,
4821
+ scrollHeight,
4822
+ style
4823
+ } = this._element;
4824
+ const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
4825
+
4826
+ if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
4827
+ return;
4828
+ }
4708
4829
 
4709
4830
  if (!isModalOverflowing) {
4710
- this._element.style.overflowY = 'hidden';
4831
+ style.overflowY = 'hidden';
4711
4832
  }
4712
4833
 
4713
- this._element.classList.add(CLASS_NAME_STATIC);
4834
+ classList.add(CLASS_NAME_STATIC);
4714
4835
 
4715
- const modalTransitionDuration = getTransitionDurationFromElement(this._dialog);
4716
- EventHandler.off(this._element, 'transitionend');
4717
- EventHandler.one(this._element, 'transitionend', () => {
4718
- this._element.classList.remove(CLASS_NAME_STATIC);
4836
+ this._queueCallback(() => {
4837
+ classList.remove(CLASS_NAME_STATIC);
4719
4838
 
4720
4839
  if (!isModalOverflowing) {
4721
- EventHandler.one(this._element, 'transitionend', () => {
4722
- this._element.style.overflowY = '';
4723
- });
4724
- emulateTransitionEnd(this._element, modalTransitionDuration);
4840
+ this._queueCallback(() => {
4841
+ style.overflowY = '';
4842
+ }, this._dialog);
4725
4843
  }
4726
- });
4727
- emulateTransitionEnd(this._element, modalTransitionDuration);
4844
+ }, this._dialog);
4728
4845
 
4729
4846
  this._element.focus();
4730
4847
  } // ----------------------------------------------------------------------
@@ -4734,7 +4851,9 @@
4734
4851
 
4735
4852
  _adjustDialog() {
4736
4853
  const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
4737
- const scrollbarWidth = getWidth();
4854
+
4855
+ const scrollbarWidth = this._scrollBar.getWidth();
4856
+
4738
4857
  const isBodyOverflowing = scrollbarWidth > 0;
4739
4858
 
4740
4859
  if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
@@ -4754,7 +4873,7 @@
4754
4873
 
4755
4874
  static jQueryInterface(config, relatedTarget) {
4756
4875
  return this.each(function () {
4757
- const data = Modal.getInstance(this) || new Modal(this, typeof config === 'object' ? config : {});
4876
+ const data = Modal.getOrCreateInstance(this, config);
4758
4877
 
4759
4878
  if (typeof config !== 'string') {
4760
4879
  return;
@@ -4794,10 +4913,18 @@
4794
4913
  this.focus();
4795
4914
  }
4796
4915
  });
4797
- });
4798
- const data = Modal.getInstance(target) || new Modal(target);
4916
+ }); // avoid conflict when clicking moddal toggler while another one is open
4917
+
4918
+ const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
4919
+
4920
+ if (allReadyOpen) {
4921
+ Modal.getInstance(allReadyOpen).hide();
4922
+ }
4923
+
4924
+ const data = Modal.getOrCreateInstance(target);
4799
4925
  data.toggle(this);
4800
4926
  });
4927
+ enableDismissTrigger(Modal);
4801
4928
  /**
4802
4929
  * ------------------------------------------------------------------------
4803
4930
  * jQuery
@@ -4809,8 +4936,8 @@
4809
4936
 
4810
4937
  /**
4811
4938
  * --------------------------------------------------------------------------
4812
- * Bootstrap (v5.0.1): offcanvas.js
4813
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
4939
+ * Bootstrap (v5.1.3): offcanvas.js
4940
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4814
4941
  * --------------------------------------------------------------------------
4815
4942
  */
4816
4943
  /**
@@ -4835,17 +4962,15 @@
4835
4962
  keyboard: 'boolean',
4836
4963
  scroll: 'boolean'
4837
4964
  };
4838
- const CLASS_NAME_SHOW$4 = 'show';
4965
+ const CLASS_NAME_SHOW$3 = 'show';
4966
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
4839
4967
  const OPEN_SELECTOR = '.offcanvas.show';
4840
4968
  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
4841
4969
  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
4842
4970
  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
4843
4971
  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;
4844
- const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$5}`;
4845
4972
  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
4846
- const EVENT_CLICK_DISMISS$1 = `click.dismiss${EVENT_KEY$5}`;
4847
4973
  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
4848
- const SELECTOR_DATA_DISMISS$1 = '[data-bs-dismiss="offcanvas"]';
4849
4974
  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
4850
4975
  /**
4851
4976
  * ------------------------------------------------------------------------
@@ -4859,6 +4984,7 @@
4859
4984
  this._config = this._getConfig(config);
4860
4985
  this._isShown = false;
4861
4986
  this._backdrop = this._initializeBackDrop();
4987
+ this._focustrap = this._initializeFocusTrap();
4862
4988
 
4863
4989
  this._addEventListeners();
4864
4990
  } // Getters
@@ -4896,9 +5022,7 @@
4896
5022
  this._backdrop.show();
4897
5023
 
4898
5024
  if (!this._config.scroll) {
4899
- hide();
4900
-
4901
- this._enforceFocusOnElement(this._element);
5025
+ new ScrollBarHelper().hide();
4902
5026
  }
4903
5027
 
4904
5028
  this._element.removeAttribute('aria-hidden');
@@ -4907,9 +5031,13 @@
4907
5031
 
4908
5032
  this._element.setAttribute('role', 'dialog');
4909
5033
 
4910
- this._element.classList.add(CLASS_NAME_SHOW$4);
5034
+ this._element.classList.add(CLASS_NAME_SHOW$3);
4911
5035
 
4912
5036
  const completeCallBack = () => {
5037
+ if (!this._config.scroll) {
5038
+ this._focustrap.activate();
5039
+ }
5040
+
4913
5041
  EventHandler.trigger(this._element, EVENT_SHOWN$2, {
4914
5042
  relatedTarget
4915
5043
  });
@@ -4929,13 +5057,13 @@
4929
5057
  return;
4930
5058
  }
4931
5059
 
4932
- EventHandler.off(document, EVENT_FOCUSIN$1);
5060
+ this._focustrap.deactivate();
4933
5061
 
4934
5062
  this._element.blur();
4935
5063
 
4936
5064
  this._isShown = false;
4937
5065
 
4938
- this._element.classList.remove(CLASS_NAME_SHOW$4);
5066
+ this._element.classList.remove(CLASS_NAME_SHOW$3);
4939
5067
 
4940
5068
  this._backdrop.hide();
4941
5069
 
@@ -4949,7 +5077,7 @@
4949
5077
  this._element.style.visibility = 'hidden';
4950
5078
 
4951
5079
  if (!this._config.scroll) {
4952
- reset();
5080
+ new ScrollBarHelper().reset();
4953
5081
  }
4954
5082
 
4955
5083
  EventHandler.trigger(this._element, EVENT_HIDDEN$2);
@@ -4961,8 +5089,9 @@
4961
5089
  dispose() {
4962
5090
  this._backdrop.dispose();
4963
5091
 
5092
+ this._focustrap.deactivate();
5093
+
4964
5094
  super.dispose();
4965
- EventHandler.off(document, EVENT_FOCUSIN$1);
4966
5095
  } // Private
4967
5096
 
4968
5097
 
@@ -4977,6 +5106,7 @@
4977
5106
 
4978
5107
  _initializeBackDrop() {
4979
5108
  return new Backdrop({
5109
+ className: CLASS_NAME_BACKDROP,
4980
5110
  isVisible: this._config.backdrop,
4981
5111
  isAnimated: true,
4982
5112
  rootElement: this._element.parentNode,
@@ -4984,19 +5114,13 @@
4984
5114
  });
4985
5115
  }
4986
5116
 
4987
- _enforceFocusOnElement(element) {
4988
- EventHandler.off(document, EVENT_FOCUSIN$1); // guard against infinite focus loop
4989
-
4990
- EventHandler.on(document, EVENT_FOCUSIN$1, event => {
4991
- if (document !== event.target && element !== event.target && !element.contains(event.target)) {
4992
- element.focus();
4993
- }
5117
+ _initializeFocusTrap() {
5118
+ return new FocusTrap({
5119
+ trapElement: this._element
4994
5120
  });
4995
- element.focus();
4996
5121
  }
4997
5122
 
4998
5123
  _addEventListeners() {
4999
- EventHandler.on(this._element, EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, () => this.hide());
5000
5124
  EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
5001
5125
  if (this._config.keyboard && event.key === ESCAPE_KEY) {
5002
5126
  this.hide();
@@ -5007,7 +5131,7 @@
5007
5131
 
5008
5132
  static jQueryInterface(config) {
5009
5133
  return this.each(function () {
5010
- const data = Data.get(this, DATA_KEY$5) || new Offcanvas(this, typeof config === 'object' ? config : {});
5134
+ const data = Offcanvas.getOrCreateInstance(this, config);
5011
5135
 
5012
5136
  if (typeof config !== 'string') {
5013
5137
  return;
@@ -5053,12 +5177,11 @@
5053
5177
  Offcanvas.getInstance(allReadyOpen).hide();
5054
5178
  }
5055
5179
 
5056
- const data = Data.get(target, DATA_KEY$5) || new Offcanvas(target);
5180
+ const data = Offcanvas.getOrCreateInstance(target);
5057
5181
  data.toggle(this);
5058
5182
  });
5059
- EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
5060
- SelectorEngine.find(OPEN_SELECTOR).forEach(el => (Data.get(el, DATA_KEY$5) || new Offcanvas(el)).show());
5061
- });
5183
+ EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));
5184
+ enableDismissTrigger(Offcanvas);
5062
5185
  /**
5063
5186
  * ------------------------------------------------------------------------
5064
5187
  * jQuery
@@ -5069,42 +5192,42 @@
5069
5192
 
5070
5193
  /**
5071
5194
  * --------------------------------------------------------------------------
5072
- * Bootstrap (v5.0.1): util/sanitizer.js
5195
+ * Bootstrap (v5.1.3): util/sanitizer.js
5073
5196
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5074
5197
  * --------------------------------------------------------------------------
5075
5198
  */
5076
- const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
5199
+ const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
5077
5200
  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
5078
5201
  /**
5079
5202
  * A pattern that recognizes a commonly useful subset of URLs that are safe.
5080
5203
  *
5081
- * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
5204
+ * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
5082
5205
  */
5083
5206
 
5084
- const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;
5207
+ const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
5085
5208
  /**
5086
5209
  * A pattern that matches safe data URLs. Only matches image, video and audio types.
5087
5210
  *
5088
- * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
5211
+ * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
5089
5212
  */
5090
5213
 
5091
5214
  const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
5092
5215
 
5093
- const allowedAttribute = (attr, allowedAttributeList) => {
5094
- const attrName = attr.nodeName.toLowerCase();
5216
+ const allowedAttribute = (attribute, allowedAttributeList) => {
5217
+ const attributeName = attribute.nodeName.toLowerCase();
5095
5218
 
5096
- if (allowedAttributeList.includes(attrName)) {
5097
- if (uriAttrs.has(attrName)) {
5098
- return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));
5219
+ if (allowedAttributeList.includes(attributeName)) {
5220
+ if (uriAttributes.has(attributeName)) {
5221
+ return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
5099
5222
  }
5100
5223
 
5101
5224
  return true;
5102
5225
  }
5103
5226
 
5104
- const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.
5227
+ const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute.
5105
5228
 
5106
5229
  for (let i = 0, len = regExp.length; i < len; i++) {
5107
- if (regExp[i].test(attrName)) {
5230
+ if (regExp[i].test(attributeName)) {
5108
5231
  return true;
5109
5232
  }
5110
5233
  }
@@ -5156,23 +5279,22 @@
5156
5279
 
5157
5280
  const domParser = new window.DOMParser();
5158
5281
  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
5159
- const allowlistKeys = Object.keys(allowList);
5160
5282
  const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
5161
5283
 
5162
5284
  for (let i = 0, len = elements.length; i < len; i++) {
5163
- const el = elements[i];
5164
- const elName = el.nodeName.toLowerCase();
5285
+ const element = elements[i];
5286
+ const elementName = element.nodeName.toLowerCase();
5165
5287
 
5166
- if (!allowlistKeys.includes(elName)) {
5167
- el.parentNode.removeChild(el);
5288
+ if (!Object.keys(allowList).includes(elementName)) {
5289
+ element.remove();
5168
5290
  continue;
5169
5291
  }
5170
5292
 
5171
- const attributeList = [].concat(...el.attributes);
5172
- const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);
5173
- attributeList.forEach(attr => {
5174
- if (!allowedAttribute(attr, allowedAttributes)) {
5175
- el.removeAttribute(attr.nodeName);
5293
+ const attributeList = [].concat(...element.attributes);
5294
+ const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
5295
+ attributeList.forEach(attribute => {
5296
+ if (!allowedAttribute(attribute, allowedAttributes)) {
5297
+ element.removeAttribute(attribute.nodeName);
5176
5298
  }
5177
5299
  });
5178
5300
  }
@@ -5182,7 +5304,7 @@
5182
5304
 
5183
5305
  /**
5184
5306
  * --------------------------------------------------------------------------
5185
- * Bootstrap (v5.0.1): tooltip.js
5307
+ * Bootstrap (v5.1.3): tooltip.js
5186
5308
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5187
5309
  * --------------------------------------------------------------------------
5188
5310
  */
@@ -5196,7 +5318,6 @@
5196
5318
  const DATA_KEY$4 = 'bs.tooltip';
5197
5319
  const EVENT_KEY$4 = `.${DATA_KEY$4}`;
5198
5320
  const CLASS_PREFIX$1 = 'bs-tooltip';
5199
- const BSCLS_PREFIX_REGEX$1 = new RegExp(`(^|\\s)${CLASS_PREFIX$1}\\S+`, 'g');
5200
5321
  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
5201
5322
  const DefaultType$3 = {
5202
5323
  animation: 'boolean',
@@ -5255,12 +5376,14 @@
5255
5376
  MOUSEENTER: `mouseenter${EVENT_KEY$4}`,
5256
5377
  MOUSELEAVE: `mouseleave${EVENT_KEY$4}`
5257
5378
  };
5258
- const CLASS_NAME_FADE$3 = 'fade';
5379
+ const CLASS_NAME_FADE$2 = 'fade';
5259
5380
  const CLASS_NAME_MODAL = 'modal';
5260
- const CLASS_NAME_SHOW$3 = 'show';
5381
+ const CLASS_NAME_SHOW$2 = 'show';
5261
5382
  const HOVER_STATE_SHOW = 'show';
5262
5383
  const HOVER_STATE_OUT = 'out';
5263
5384
  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
5385
+ const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
5386
+ const EVENT_MODAL_HIDE = 'hide.bs.modal';
5264
5387
  const TRIGGER_HOVER = 'hover';
5265
5388
  const TRIGGER_FOCUS = 'focus';
5266
5389
  const TRIGGER_CLICK = 'click';
@@ -5337,7 +5460,7 @@
5337
5460
  context._leave(null, context);
5338
5461
  }
5339
5462
  } else {
5340
- if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$3)) {
5463
+ if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {
5341
5464
  this._leave(null, this);
5342
5465
 
5343
5466
  return;
@@ -5349,15 +5472,13 @@
5349
5472
 
5350
5473
  dispose() {
5351
5474
  clearTimeout(this._timeout);
5352
- EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
5475
+ EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
5353
5476
 
5354
- if (this.tip && this.tip.parentNode) {
5355
- this.tip.parentNode.removeChild(this.tip);
5477
+ if (this.tip) {
5478
+ this.tip.remove();
5356
5479
  }
5357
5480
 
5358
- if (this._popper) {
5359
- this._popper.destroy();
5360
- }
5481
+ this._disposePopper();
5361
5482
 
5362
5483
  super.dispose();
5363
5484
  }
@@ -5377,6 +5498,15 @@
5377
5498
 
5378
5499
  if (showEvent.defaultPrevented || !isInTheDom) {
5379
5500
  return;
5501
+ } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`
5502
+ // This will be removed later in favor of a `setContent` method
5503
+
5504
+
5505
+ if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {
5506
+ this._disposePopper();
5507
+
5508
+ this.tip.remove();
5509
+ this.tip = null;
5380
5510
  }
5381
5511
 
5382
5512
  const tip = this.getTipElement();
@@ -5385,10 +5515,8 @@
5385
5515
 
5386
5516
  this._element.setAttribute('aria-describedby', tipId);
5387
5517
 
5388
- this.setContent();
5389
-
5390
5518
  if (this._config.animation) {
5391
- tip.classList.add(CLASS_NAME_FADE$3);
5519
+ tip.classList.add(CLASS_NAME_FADE$2);
5392
5520
  }
5393
5521
 
5394
5522
  const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
@@ -5403,7 +5531,7 @@
5403
5531
  Data.set(tip, this.constructor.DATA_KEY, this);
5404
5532
 
5405
5533
  if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
5406
- container.appendChild(tip);
5534
+ container.append(tip);
5407
5535
  EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
5408
5536
  }
5409
5537
 
@@ -5413,8 +5541,9 @@
5413
5541
  this._popper = createPopper(this._element, tip, this._getPopperConfig(attachment));
5414
5542
  }
5415
5543
 
5416
- tip.classList.add(CLASS_NAME_SHOW$3);
5417
- const customClass = typeof this._config.customClass === 'function' ? this._config.customClass() : this._config.customClass;
5544
+ tip.classList.add(CLASS_NAME_SHOW$2);
5545
+
5546
+ const customClass = this._resolvePossibleFunction(this._config.customClass);
5418
5547
 
5419
5548
  if (customClass) {
5420
5549
  tip.classList.add(...customClass.split(' '));
@@ -5440,7 +5569,7 @@
5440
5569
  }
5441
5570
  };
5442
5571
 
5443
- const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$3);
5572
+ const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
5444
5573
 
5445
5574
  this._queueCallback(complete, this.tip, isAnimated);
5446
5575
  }
@@ -5457,8 +5586,8 @@
5457
5586
  return;
5458
5587
  }
5459
5588
 
5460
- if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
5461
- tip.parentNode.removeChild(tip);
5589
+ if (this._hoverState !== HOVER_STATE_SHOW) {
5590
+ tip.remove();
5462
5591
  }
5463
5592
 
5464
5593
  this._cleanTipClass();
@@ -5467,11 +5596,7 @@
5467
5596
 
5468
5597
  EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);
5469
5598
 
5470
- if (this._popper) {
5471
- this._popper.destroy();
5472
-
5473
- this._popper = null;
5474
- }
5599
+ this._disposePopper();
5475
5600
  };
5476
5601
 
5477
5602
  const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);
@@ -5480,7 +5605,7 @@
5480
5605
  return;
5481
5606
  }
5482
5607
 
5483
- tip.classList.remove(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra
5608
+ tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
5484
5609
  // empty mouseover listeners we added for iOS support
5485
5610
 
5486
5611
  if ('ontouchstart' in document.documentElement) {
@@ -5490,7 +5615,7 @@
5490
5615
  this._activeTrigger[TRIGGER_CLICK] = false;
5491
5616
  this._activeTrigger[TRIGGER_FOCUS] = false;
5492
5617
  this._activeTrigger[TRIGGER_HOVER] = false;
5493
- const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$3);
5618
+ const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
5494
5619
 
5495
5620
  this._queueCallback(complete, this.tip, isAnimated);
5496
5621
 
@@ -5515,14 +5640,27 @@
5515
5640
 
5516
5641
  const element = document.createElement('div');
5517
5642
  element.innerHTML = this._config.template;
5518
- this.tip = element.children[0];
5643
+ const tip = element.children[0];
5644
+ this.setContent(tip);
5645
+ tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
5646
+ this.tip = tip;
5519
5647
  return this.tip;
5520
5648
  }
5521
5649
 
5522
- setContent() {
5523
- const tip = this.getTipElement();
5524
- this.setElementContent(SelectorEngine.findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle());
5525
- tip.classList.remove(CLASS_NAME_FADE$3, CLASS_NAME_SHOW$3);
5650
+ setContent(tip) {
5651
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
5652
+ }
5653
+
5654
+ _sanitizeAndSetContent(template, content, selector) {
5655
+ const templateElement = SelectorEngine.findOne(selector, template);
5656
+
5657
+ if (!content && templateElement) {
5658
+ templateElement.remove();
5659
+ return;
5660
+ } // we use append for html objects to maintain js events
5661
+
5662
+
5663
+ this.setElementContent(templateElement, content);
5526
5664
  }
5527
5665
 
5528
5666
  setElementContent(element, content) {
@@ -5536,7 +5674,7 @@
5536
5674
  if (this._config.html) {
5537
5675
  if (content.parentNode !== element) {
5538
5676
  element.innerHTML = '';
5539
- element.appendChild(content);
5677
+ element.append(content);
5540
5678
  }
5541
5679
  } else {
5542
5680
  element.textContent = content.textContent;
@@ -5557,13 +5695,9 @@
5557
5695
  }
5558
5696
 
5559
5697
  getTitle() {
5560
- let title = this._element.getAttribute('data-bs-original-title');
5698
+ const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
5561
5699
 
5562
- if (!title) {
5563
- title = typeof this._config.title === 'function' ? this._config.title.call(this._element) : this._config.title;
5564
- }
5565
-
5566
- return title;
5700
+ return this._resolvePossibleFunction(title);
5567
5701
  }
5568
5702
 
5569
5703
  updateAttachment(attachment) {
@@ -5580,15 +5714,7 @@
5580
5714
 
5581
5715
 
5582
5716
  _initializeOnDelegatedTarget(event, context) {
5583
- const dataKey = this.constructor.DATA_KEY;
5584
- context = context || Data.get(event.delegateTarget, dataKey);
5585
-
5586
- if (!context) {
5587
- context = new this.constructor(event.delegateTarget, this._getDelegateConfig());
5588
- Data.set(event.delegateTarget, dataKey, context);
5589
- }
5590
-
5591
- return context;
5717
+ return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
5592
5718
  }
5593
5719
 
5594
5720
  _getOffset() {
@@ -5607,6 +5733,10 @@
5607
5733
  return offset;
5608
5734
  }
5609
5735
 
5736
+ _resolvePossibleFunction(content) {
5737
+ return typeof content === 'function' ? content.call(this._element) : content;
5738
+ }
5739
+
5610
5740
  _getPopperConfig(attachment) {
5611
5741
  const defaultBsPopperConfig = {
5612
5742
  placement: attachment,
@@ -5648,7 +5778,7 @@
5648
5778
  }
5649
5779
 
5650
5780
  _addAttachmentClass(attachment) {
5651
- this.getTipElement().classList.add(`${CLASS_PREFIX$1}-${this.updateAttachment(attachment)}`);
5781
+ this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
5652
5782
  }
5653
5783
 
5654
5784
  _getAttachment(placement) {
@@ -5675,7 +5805,7 @@
5675
5805
  }
5676
5806
  };
5677
5807
 
5678
- EventHandler.on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler);
5808
+ EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
5679
5809
 
5680
5810
  if (this._config.selector) {
5681
5811
  this._config = { ...this._config,
@@ -5710,7 +5840,7 @@
5710
5840
  context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
5711
5841
  }
5712
5842
 
5713
- if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) {
5843
+ if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {
5714
5844
  context._hoverState = HOVER_STATE_SHOW;
5715
5845
  return;
5716
5846
  }
@@ -5806,26 +5936,32 @@
5806
5936
  _getDelegateConfig() {
5807
5937
  const config = {};
5808
5938
 
5809
- if (this._config) {
5810
- for (const key in this._config) {
5811
- if (this.constructor.Default[key] !== this._config[key]) {
5812
- config[key] = this._config[key];
5813
- }
5939
+ for (const key in this._config) {
5940
+ if (this.constructor.Default[key] !== this._config[key]) {
5941
+ config[key] = this._config[key];
5814
5942
  }
5815
- }
5943
+ } // In the future can be replaced with:
5944
+ // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
5945
+ // `Object.fromEntries(keysWithDifferentValues)`
5946
+
5816
5947
 
5817
5948
  return config;
5818
5949
  }
5819
5950
 
5820
5951
  _cleanTipClass() {
5821
5952
  const tip = this.getTipElement();
5822
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX$1);
5953
+ const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g');
5954
+ const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);
5823
5955
 
5824
5956
  if (tabClass !== null && tabClass.length > 0) {
5825
5957
  tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
5826
5958
  }
5827
5959
  }
5828
5960
 
5961
+ _getBasicClassPrefix() {
5962
+ return CLASS_PREFIX$1;
5963
+ }
5964
+
5829
5965
  _handlePopperPlacementChange(popperData) {
5830
5966
  const {
5831
5967
  state
@@ -5840,22 +5976,20 @@
5840
5976
  this._cleanTipClass();
5841
5977
 
5842
5978
  this._addAttachmentClass(this._getAttachment(state.placement));
5979
+ }
5980
+
5981
+ _disposePopper() {
5982
+ if (this._popper) {
5983
+ this._popper.destroy();
5984
+
5985
+ this._popper = null;
5986
+ }
5843
5987
  } // Static
5844
5988
 
5845
5989
 
5846
5990
  static jQueryInterface(config) {
5847
5991
  return this.each(function () {
5848
- let data = Data.get(this, DATA_KEY$4);
5849
-
5850
- const _config = typeof config === 'object' && config;
5851
-
5852
- if (!data && /dispose|hide/.test(config)) {
5853
- return;
5854
- }
5855
-
5856
- if (!data) {
5857
- data = new Tooltip(this, _config);
5858
- }
5992
+ const data = Tooltip.getOrCreateInstance(this, config);
5859
5993
 
5860
5994
  if (typeof config === 'string') {
5861
5995
  if (typeof data[config] === 'undefined') {
@@ -5880,7 +6014,7 @@
5880
6014
 
5881
6015
  /**
5882
6016
  * --------------------------------------------------------------------------
5883
- * Bootstrap (v5.0.1): popover.js
6017
+ * Bootstrap (v5.1.3): popover.js
5884
6018
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5885
6019
  * --------------------------------------------------------------------------
5886
6020
  */
@@ -5894,7 +6028,6 @@
5894
6028
  const DATA_KEY$3 = 'bs.popover';
5895
6029
  const EVENT_KEY$3 = `.${DATA_KEY$3}`;
5896
6030
  const CLASS_PREFIX = 'bs-popover';
5897
- const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g');
5898
6031
  const Default$2 = { ...Tooltip.Default,
5899
6032
  placement: 'right',
5900
6033
  offset: [0, 8],
@@ -5917,8 +6050,6 @@
5917
6050
  MOUSEENTER: `mouseenter${EVENT_KEY$3}`,
5918
6051
  MOUSELEAVE: `mouseleave${EVENT_KEY$3}`
5919
6052
  };
5920
- const CLASS_NAME_FADE$2 = 'fade';
5921
- const CLASS_NAME_SHOW$2 = 'show';
5922
6053
  const SELECTOR_TITLE = '.popover-header';
5923
6054
  const SELECTOR_CONTENT = '.popover-body';
5924
6055
  /**
@@ -5950,54 +6081,25 @@
5950
6081
  return this.getTitle() || this._getContent();
5951
6082
  }
5952
6083
 
5953
- setContent() {
5954
- const tip = this.getTipElement(); // we use append for html objects to maintain js events
5955
-
5956
- this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle());
5957
-
5958
- let content = this._getContent();
6084
+ setContent(tip) {
6085
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
5959
6086
 
5960
- if (typeof content === 'function') {
5961
- content = content.call(this._element);
5962
- }
5963
-
5964
- this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content);
5965
- tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
6087
+ this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
5966
6088
  } // Private
5967
6089
 
5968
6090
 
5969
- _addAttachmentClass(attachment) {
5970
- this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`);
5971
- }
5972
-
5973
6091
  _getContent() {
5974
- return this._element.getAttribute('data-bs-content') || this._config.content;
6092
+ return this._resolvePossibleFunction(this._config.content);
5975
6093
  }
5976
6094
 
5977
- _cleanTipClass() {
5978
- const tip = this.getTipElement();
5979
- const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX);
5980
-
5981
- if (tabClass !== null && tabClass.length > 0) {
5982
- tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));
5983
- }
6095
+ _getBasicClassPrefix() {
6096
+ return CLASS_PREFIX;
5984
6097
  } // Static
5985
6098
 
5986
6099
 
5987
6100
  static jQueryInterface(config) {
5988
6101
  return this.each(function () {
5989
- let data = Data.get(this, DATA_KEY$3);
5990
-
5991
- const _config = typeof config === 'object' ? config : null;
5992
-
5993
- if (!data && /dispose|hide/.test(config)) {
5994
- return;
5995
- }
5996
-
5997
- if (!data) {
5998
- data = new Popover(this, _config);
5999
- Data.set(this, DATA_KEY$3, data);
6000
- }
6102
+ const data = Popover.getOrCreateInstance(this, config);
6001
6103
 
6002
6104
  if (typeof config === 'string') {
6003
6105
  if (typeof data[config] === 'undefined') {
@@ -6022,7 +6124,7 @@
6022
6124
 
6023
6125
  /**
6024
6126
  * --------------------------------------------------------------------------
6025
- * Bootstrap (v5.0.1): scrollspy.js
6127
+ * Bootstrap (v5.1.3): scrollspy.js
6026
6128
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6027
6129
  * --------------------------------------------------------------------------
6028
6130
  */
@@ -6056,6 +6158,7 @@
6056
6158
  const SELECTOR_NAV_LINKS = '.nav-link';
6057
6159
  const SELECTOR_NAV_ITEMS = '.nav-item';
6058
6160
  const SELECTOR_LIST_ITEMS = '.list-group-item';
6161
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
6059
6162
  const SELECTOR_DROPDOWN$1 = '.dropdown';
6060
6163
  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
6061
6164
  const METHOD_OFFSET = 'offset';
@@ -6071,7 +6174,6 @@
6071
6174
  super(element);
6072
6175
  this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
6073
6176
  this._config = this._getConfig(config);
6074
- this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`;
6075
6177
  this._offsets = [];
6076
6178
  this._targets = [];
6077
6179
  this._activeTarget = null;
@@ -6099,7 +6201,7 @@
6099
6201
  this._offsets = [];
6100
6202
  this._targets = [];
6101
6203
  this._scrollHeight = this._getScrollHeight();
6102
- const targets = SelectorEngine.find(this._selector);
6204
+ const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);
6103
6205
  targets.map(element => {
6104
6206
  const targetSelector = getSelectorFromElement(element);
6105
6207
  const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;
@@ -6131,20 +6233,7 @@
6131
6233
  ...Manipulator.getDataAttributes(this._element),
6132
6234
  ...(typeof config === 'object' && config ? config : {})
6133
6235
  };
6134
-
6135
- if (typeof config.target !== 'string' && isElement$1(config.target)) {
6136
- let {
6137
- id
6138
- } = config.target;
6139
-
6140
- if (!id) {
6141
- id = getUID(NAME$2);
6142
- config.target.id = id;
6143
- }
6144
-
6145
- config.target = `#${id}`;
6146
- }
6147
-
6236
+ config.target = getElement(config.target) || document.documentElement;
6148
6237
  typeCheckConfig(NAME$2, config, DefaultType$1);
6149
6238
  return config;
6150
6239
  }
@@ -6204,16 +6293,13 @@
6204
6293
 
6205
6294
  this._clear();
6206
6295
 
6207
- const queries = this._selector.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
6208
-
6209
- const link = SelectorEngine.findOne(queries.join(','));
6296
+ const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
6297
+ const link = SelectorEngine.findOne(queries.join(','), this._config.target);
6298
+ link.classList.add(CLASS_NAME_ACTIVE$1);
6210
6299
 
6211
6300
  if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
6212
6301
  SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);
6213
- link.classList.add(CLASS_NAME_ACTIVE$1);
6214
6302
  } else {
6215
- // Set triggered link as active
6216
- link.classList.add(CLASS_NAME_ACTIVE$1);
6217
6303
  SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {
6218
6304
  // Set triggered links parents as active
6219
6305
  // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
@@ -6231,13 +6317,13 @@
6231
6317
  }
6232
6318
 
6233
6319
  _clear() {
6234
- SelectorEngine.find(this._selector).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));
6320
+ 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));
6235
6321
  } // Static
6236
6322
 
6237
6323
 
6238
6324
  static jQueryInterface(config) {
6239
6325
  return this.each(function () {
6240
- const data = ScrollSpy.getInstance(this) || new ScrollSpy(this, typeof config === 'object' ? config : {});
6326
+ const data = ScrollSpy.getOrCreateInstance(this, config);
6241
6327
 
6242
6328
  if (typeof config !== 'string') {
6243
6329
  return;
@@ -6273,7 +6359,7 @@
6273
6359
 
6274
6360
  /**
6275
6361
  * --------------------------------------------------------------------------
6276
- * Bootstrap (v5.0.1): tab.js
6362
+ * Bootstrap (v5.1.3): tab.js
6277
6363
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6278
6364
  * --------------------------------------------------------------------------
6279
6365
  */
@@ -6428,7 +6514,7 @@
6428
6514
 
6429
6515
  static jQueryInterface(config) {
6430
6516
  return this.each(function () {
6431
- const data = Data.get(this, DATA_KEY$1) || new Tab(this);
6517
+ const data = Tab.getOrCreateInstance(this);
6432
6518
 
6433
6519
  if (typeof config === 'string') {
6434
6520
  if (typeof data[config] === 'undefined') {
@@ -6457,7 +6543,7 @@
6457
6543
  return;
6458
6544
  }
6459
6545
 
6460
- const data = Data.get(this, DATA_KEY$1) || new Tab(this);
6546
+ const data = Tab.getOrCreateInstance(this);
6461
6547
  data.show();
6462
6548
  });
6463
6549
  /**
@@ -6471,7 +6557,7 @@
6471
6557
 
6472
6558
  /**
6473
6559
  * --------------------------------------------------------------------------
6474
- * Bootstrap (v5.0.1): toast.js
6560
+ * Bootstrap (v5.1.3): toast.js
6475
6561
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6476
6562
  * --------------------------------------------------------------------------
6477
6563
  */
@@ -6484,7 +6570,6 @@
6484
6570
  const NAME = 'toast';
6485
6571
  const DATA_KEY = 'bs.toast';
6486
6572
  const EVENT_KEY = `.${DATA_KEY}`;
6487
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;
6488
6573
  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
6489
6574
  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
6490
6575
  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
@@ -6494,7 +6579,8 @@
6494
6579
  const EVENT_SHOW = `show${EVENT_KEY}`;
6495
6580
  const EVENT_SHOWN = `shown${EVENT_KEY}`;
6496
6581
  const CLASS_NAME_FADE = 'fade';
6497
- const CLASS_NAME_HIDE = 'hide';
6582
+ const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
6583
+
6498
6584
  const CLASS_NAME_SHOW = 'show';
6499
6585
  const CLASS_NAME_SHOWING = 'showing';
6500
6586
  const DefaultType = {
@@ -6507,7 +6593,6 @@
6507
6593
  autohide: true,
6508
6594
  delay: 5000
6509
6595
  };
6510
- const SELECTOR_DATA_DISMISS = '[data-bs-dismiss="toast"]';
6511
6596
  /**
6512
6597
  * ------------------------------------------------------------------------
6513
6598
  * Class Definition
@@ -6555,17 +6640,18 @@
6555
6640
  const complete = () => {
6556
6641
  this._element.classList.remove(CLASS_NAME_SHOWING);
6557
6642
 
6558
- this._element.classList.add(CLASS_NAME_SHOW);
6559
-
6560
6643
  EventHandler.trigger(this._element, EVENT_SHOWN);
6561
6644
 
6562
6645
  this._maybeScheduleHide();
6563
6646
  };
6564
6647
 
6565
- this._element.classList.remove(CLASS_NAME_HIDE);
6648
+ this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
6649
+
6566
6650
 
6567
6651
  reflow(this._element);
6568
6652
 
6653
+ this._element.classList.add(CLASS_NAME_SHOW);
6654
+
6569
6655
  this._element.classList.add(CLASS_NAME_SHOWING);
6570
6656
 
6571
6657
  this._queueCallback(complete, this._element, this._config.animation);
@@ -6583,12 +6669,17 @@
6583
6669
  }
6584
6670
 
6585
6671
  const complete = () => {
6586
- this._element.classList.add(CLASS_NAME_HIDE);
6672
+ this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
6673
+
6674
+
6675
+ this._element.classList.remove(CLASS_NAME_SHOWING);
6676
+
6677
+ this._element.classList.remove(CLASS_NAME_SHOW);
6587
6678
 
6588
6679
  EventHandler.trigger(this._element, EVENT_HIDDEN);
6589
6680
  };
6590
6681
 
6591
- this._element.classList.remove(CLASS_NAME_SHOW);
6682
+ this._element.classList.add(CLASS_NAME_SHOWING);
6592
6683
 
6593
6684
  this._queueCallback(complete, this._element, this._config.animation);
6594
6685
  }
@@ -6656,7 +6747,6 @@
6656
6747
  }
6657
6748
 
6658
6749
  _setListeners() {
6659
- EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide());
6660
6750
  EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
6661
6751
  EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
6662
6752
  EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
@@ -6671,13 +6761,7 @@
6671
6761
 
6672
6762
  static jQueryInterface(config) {
6673
6763
  return this.each(function () {
6674
- let data = Data.get(this, DATA_KEY);
6675
-
6676
- const _config = typeof config === 'object' && config;
6677
-
6678
- if (!data) {
6679
- data = new Toast(this, _config);
6680
- }
6764
+ const data = Toast.getOrCreateInstance(this, config);
6681
6765
 
6682
6766
  if (typeof config === 'string') {
6683
6767
  if (typeof data[config] === 'undefined') {
@@ -6690,6 +6774,8 @@
6690
6774
  }
6691
6775
 
6692
6776
  }
6777
+
6778
+ enableDismissTrigger(Toast);
6693
6779
  /**
6694
6780
  * ------------------------------------------------------------------------
6695
6781
  * jQuery
@@ -6697,16 +6783,15 @@
6697
6783
  * add .Toast to jQuery only if jQuery is present
6698
6784
  */
6699
6785
 
6700
-
6701
6786
  defineJQueryPlugin(Toast);
6702
6787
 
6703
6788
  /**
6704
6789
  * --------------------------------------------------------------------------
6705
- * Bootstrap (v5.0.1): index.umd.js
6790
+ * Bootstrap (v5.1.3): index.umd.js
6706
6791
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6707
6792
  * --------------------------------------------------------------------------
6708
6793
  */
6709
- var index_umd = {
6794
+ const index_umd = {
6710
6795
  Alert,
6711
6796
  Button,
6712
6797
  Carousel,
@@ -6723,5 +6808,5 @@
6723
6808
 
6724
6809
  return index_umd;
6725
6810
 
6726
- })));
6811
+ }));
6727
6812
  //# sourceMappingURL=bootstrap.bundle.js.map