@openeuropa/bcl-theme-default 1.9.0 → 1.9.2

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 (35) hide show
  1. package/css/color-scheme.min.css +1 -1
  2. package/css/color-scheme.min.css.map +1 -1
  3. package/css/oe-bcl-ckeditor5.min.css +1 -1
  4. package/css/oe-bcl-ckeditor5.min.css.map +1 -1
  5. package/css/oe-bcl-default.css +2312 -680
  6. package/css/oe-bcl-default.css.map +1 -1
  7. package/css/oe-bcl-default.min.css +1 -1
  8. package/css/oe-bcl-default.min.css.map +1 -1
  9. package/icons/bcl-default-icons.svg +1 -1
  10. package/icons/bootstrap-icons.svg +1 -1
  11. package/js/oe-bcl-default.bundle.js +842 -699
  12. package/js/oe-bcl-default.bundle.js.map +1 -1
  13. package/js/oe-bcl-default.bundle.min.js +1 -1
  14. package/js/oe-bcl-default.bundle.min.js.map +1 -1
  15. package/js/oe-bcl-default.esm.js +830 -688
  16. package/js/oe-bcl-default.esm.js.map +1 -1
  17. package/js/oe-bcl-default.esm.min.js +1 -1
  18. package/js/oe-bcl-default.esm.min.js.map +1 -1
  19. package/js/oe-bcl-default.umd.js +842 -699
  20. package/js/oe-bcl-default.umd.js.map +1 -1
  21. package/js/oe-bcl-default.umd.min.js +1 -1
  22. package/js/oe-bcl-default.umd.min.js.map +1 -1
  23. package/package.json +5 -5
  24. package/src/js/accordion-toggle/accordion-toggle.js +51 -0
  25. package/src/js/index.esm.js +6 -4
  26. package/src/js/index.umd.js +6 -4
  27. package/src/scss/_inpage-navigation.scss +69 -4
  28. package/src/scss/base/_colors.scss +31 -3
  29. package/src/scss/color_scheme/_alert.scss +14 -10
  30. package/src/scss/color_scheme/_background.scss +1 -0
  31. package/src/scss/color_scheme/_list_group.scss +15 -10
  32. package/src/scss/oe-bcl-default.scss +4 -2
  33. package/templates/bcl-accordion/accordion.html.twig +85 -46
  34. package/templates/bcl-inpage-navigation/inpage-navigation.html.twig +9 -1
  35. package/templates/bcl-mega-menu/mega-menu.html.twig +0 -123
@@ -6,7 +6,55 @@
6
6
 
7
7
  /**
8
8
  * --------------------------------------------------------------------------
9
- * Bootstrap (v5.2.3): util/index.js
9
+ * Bootstrap dom/data.js
10
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11
+ * --------------------------------------------------------------------------
12
+ */
13
+
14
+ /**
15
+ * Constants
16
+ */
17
+
18
+ const elementMap = new Map();
19
+ var Data = {
20
+ set(element, key, instance) {
21
+ if (!elementMap.has(element)) {
22
+ elementMap.set(element, new Map());
23
+ }
24
+ const instanceMap = elementMap.get(element);
25
+
26
+ // make it clear we only want one instance per element
27
+ // can be removed later when multiple key/instances are fine to be used
28
+ if (!instanceMap.has(key) && instanceMap.size !== 0) {
29
+ // eslint-disable-next-line no-console
30
+ console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
31
+ return;
32
+ }
33
+ instanceMap.set(key, instance);
34
+ },
35
+ get(element, key) {
36
+ if (elementMap.has(element)) {
37
+ return elementMap.get(element).get(key) || null;
38
+ }
39
+ return null;
40
+ },
41
+ remove(element, key) {
42
+ if (!elementMap.has(element)) {
43
+ return;
44
+ }
45
+ const instanceMap = elementMap.get(element);
46
+ instanceMap.delete(key);
47
+
48
+ // free up element references if there are no instances left for an element
49
+ if (instanceMap.size === 0) {
50
+ elementMap.delete(element);
51
+ }
52
+ }
53
+ };
54
+
55
+ /**
56
+ * --------------------------------------------------------------------------
57
+ * Bootstrap util/index.js
10
58
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
11
59
  * --------------------------------------------------------------------------
12
60
  */
@@ -15,6 +63,19 @@
15
63
  const MILLISECONDS_MULTIPLIER = 1000;
16
64
  const TRANSITION_END = 'transitionend';
17
65
 
66
+ /**
67
+ * Properly escape IDs selectors to handle weird IDs
68
+ * @param {string} selector
69
+ * @returns {string}
70
+ */
71
+ const parseSelector = selector => {
72
+ if (selector && window.CSS && window.CSS.escape) {
73
+ // document.querySelector needs escaping to handle IDs (html5+) containing for instance /
74
+ selector = selector.replace(/#([^\s"#']+)/g, (match, id) => `#${CSS.escape(id)}`);
75
+ }
76
+ return selector;
77
+ };
78
+
18
79
  // Shout-out Angus Croll (https://goo.gl/pxwQGp)
19
80
  const toType = object => {
20
81
  if (object === null || object === undefined) {
@@ -33,38 +94,6 @@
33
94
  } while (document.getElementById(prefix));
34
95
  return prefix;
35
96
  };
36
- const getSelector = element => {
37
- let selector = element.getAttribute('data-bs-target');
38
- if (!selector || selector === '#') {
39
- let hrefAttribute = element.getAttribute('href');
40
-
41
- // The only valid content that could double as a selector are IDs or classes,
42
- // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
43
- // `document.querySelector` will rightfully complain it is invalid.
44
- // See https://github.com/twbs/bootstrap/issues/32273
45
- if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
46
- return null;
47
- }
48
-
49
- // Just in case some CMS puts out a full URL with the anchor appended
50
- if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
51
- hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
52
- }
53
- selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
54
- }
55
- return selector;
56
- };
57
- const getSelectorFromElement = element => {
58
- const selector = getSelector(element);
59
- if (selector) {
60
- return document.querySelector(selector) ? selector : null;
61
- }
62
- return null;
63
- };
64
- const getElementFromSelector = element => {
65
- const selector = getSelector(element);
66
- return selector ? document.querySelector(selector) : null;
67
- };
68
97
  const getTransitionDurationFromElement = element => {
69
98
  if (!element) {
70
99
  return 0;
@@ -91,7 +120,7 @@
91
120
  const triggerTransitionEnd = element => {
92
121
  element.dispatchEvent(new Event(TRANSITION_END));
93
122
  };
94
- const isElement$1 = object => {
123
+ const isElement$2 = object => {
95
124
  if (!object || typeof object !== 'object') {
96
125
  return false;
97
126
  }
@@ -100,18 +129,18 @@
100
129
  }
101
130
  return typeof object.nodeType !== 'undefined';
102
131
  };
103
- const getElement = object => {
132
+ const getElement$1 = object => {
104
133
  // it's a jQuery object or a node element
105
- if (isElement$1(object)) {
134
+ if (isElement$2(object)) {
106
135
  return object.jquery ? object[0] : object;
107
136
  }
108
137
  if (typeof object === 'string' && object.length > 0) {
109
- return document.querySelector(object);
138
+ return document.querySelector(parseSelector(object));
110
139
  }
111
140
  return null;
112
141
  };
113
142
  const isVisible = element => {
114
- if (!isElement$1(element) || element.getClientRects().length === 0) {
143
+ if (!isElement$2(element) || element.getClientRects().length === 0) {
115
144
  return false;
116
145
  }
117
146
  const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';
@@ -176,32 +205,32 @@
176
205
  const reflow = element => {
177
206
  element.offsetHeight; // eslint-disable-line no-unused-expressions
178
207
  };
179
- const getjQuery = () => {
208
+ const getjQuery$1 = () => {
180
209
  if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
181
210
  return window.jQuery;
182
211
  }
183
212
  return null;
184
213
  };
185
- const DOMContentLoadedCallbacks = [];
186
- const onDOMContentLoaded = callback => {
214
+ const DOMContentLoadedCallbacks$1 = [];
215
+ const onDOMContentLoaded$1 = callback => {
187
216
  if (document.readyState === 'loading') {
188
217
  // add listener on the first call when the document is in loading state
189
- if (!DOMContentLoadedCallbacks.length) {
218
+ if (!DOMContentLoadedCallbacks$1.length) {
190
219
  document.addEventListener('DOMContentLoaded', () => {
191
- for (const callback of DOMContentLoadedCallbacks) {
220
+ for (const callback of DOMContentLoadedCallbacks$1) {
192
221
  callback();
193
222
  }
194
223
  });
195
224
  }
196
- DOMContentLoadedCallbacks.push(callback);
225
+ DOMContentLoadedCallbacks$1.push(callback);
197
226
  } else {
198
227
  callback();
199
228
  }
200
229
  };
201
230
  const isRTL = () => document.documentElement.dir === 'rtl';
202
- const defineJQueryPlugin = plugin => {
203
- onDOMContentLoaded(() => {
204
- const $ = getjQuery();
231
+ const defineJQueryPlugin$1 = plugin => {
232
+ onDOMContentLoaded$1(() => {
233
+ const $ = getjQuery$1();
205
234
  /* istanbul ignore if */
206
235
  if ($) {
207
236
  const name = plugin.NAME;
@@ -215,10 +244,8 @@
215
244
  }
216
245
  });
217
246
  };
218
- const execute = callback => {
219
- if (typeof callback === 'function') {
220
- callback();
221
- }
247
+ const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {
248
+ return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;
222
249
  };
223
250
  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
224
251
  if (!waitForTransition) {
@@ -273,7 +300,7 @@
273
300
 
274
301
  /**
275
302
  * --------------------------------------------------------------------------
276
- * Bootstrap (v5.2.3): dom/event-handler.js
303
+ * Bootstrap dom/event-handler.js
277
304
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
278
305
  * --------------------------------------------------------------------------
279
306
  */
@@ -344,7 +371,7 @@
344
371
  }
345
372
  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
346
373
  const isDelegated = typeof handler === 'string';
347
- // todo: tooltip passes `false` instead of selector, so we need to check
374
+ // TODO: tooltip passes `false` instead of selector, so we need to check
348
375
  const callable = isDelegated ? delegationFunction : handler || delegationFunction;
349
376
  let typeEvent = getTypeEvent(originalTypeEvent);
350
377
  if (!nativeEvents.has(typeEvent)) {
@@ -396,9 +423,8 @@
396
423
  }
397
424
  function removeNamespacedHandlers(element, events, typeEvent, namespace) {
398
425
  const storeElementEvent = events[typeEvent] || {};
399
- for (const handlerKey of Object.keys(storeElementEvent)) {
426
+ for (const [handlerKey, event] of Object.entries(storeElementEvent)) {
400
427
  if (handlerKey.includes(namespace)) {
401
- const event = storeElementEvent[handlerKey];
402
428
  removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
403
429
  }
404
430
  }
@@ -437,10 +463,9 @@
437
463
  removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
438
464
  }
439
465
  }
440
- for (const keyHandlers of Object.keys(storeElementEvent)) {
466
+ for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {
441
467
  const handlerKey = keyHandlers.replace(stripUidRegex, '');
442
468
  if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
443
- const event = storeElementEvent[keyHandlers];
444
469
  removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
445
470
  }
446
471
  }
@@ -449,7 +474,7 @@
449
474
  if (typeof event !== 'string' || !element) {
450
475
  return null;
451
476
  }
452
- const $ = getjQuery();
477
+ const $ = getjQuery$1();
453
478
  const typeEvent = getTypeEvent(event);
454
479
  const inNamespace = event !== typeEvent;
455
480
  let jQueryEvent = null;
@@ -463,11 +488,10 @@
463
488
  nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
464
489
  defaultPrevented = jQueryEvent.isDefaultPrevented();
465
490
  }
466
- let evt = new Event(event, {
491
+ const evt = hydrateObj(new Event(event, {
467
492
  bubbles,
468
493
  cancelable: true
469
- });
470
- evt = hydrateObj(evt, args);
494
+ }), args);
471
495
  if (defaultPrevented) {
472
496
  evt.preventDefault();
473
497
  }
@@ -480,8 +504,8 @@
480
504
  return evt;
481
505
  }
482
506
  };
483
- function hydrateObj(obj, meta) {
484
- for (const [key, value] of Object.entries(meta || {})) {
507
+ function hydrateObj(obj, meta = {}) {
508
+ for (const [key, value] of Object.entries(meta)) {
485
509
  try {
486
510
  obj[key] = value;
487
511
  } catch {
@@ -498,55 +522,7 @@
498
522
 
499
523
  /**
500
524
  * --------------------------------------------------------------------------
501
- * Bootstrap (v5.2.3): dom/data.js
502
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
503
- * --------------------------------------------------------------------------
504
- */
505
-
506
- /**
507
- * Constants
508
- */
509
-
510
- const elementMap = new Map();
511
- var Data = {
512
- set(element, key, instance) {
513
- if (!elementMap.has(element)) {
514
- elementMap.set(element, new Map());
515
- }
516
- const instanceMap = elementMap.get(element);
517
-
518
- // make it clear we only want one instance per element
519
- // can be removed later when multiple key/instances are fine to be used
520
- if (!instanceMap.has(key) && instanceMap.size !== 0) {
521
- // eslint-disable-next-line no-console
522
- console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
523
- return;
524
- }
525
- instanceMap.set(key, instance);
526
- },
527
- get(element, key) {
528
- if (elementMap.has(element)) {
529
- return elementMap.get(element).get(key) || null;
530
- }
531
- return null;
532
- },
533
- remove(element, key) {
534
- if (!elementMap.has(element)) {
535
- return;
536
- }
537
- const instanceMap = elementMap.get(element);
538
- instanceMap.delete(key);
539
-
540
- // free up element references if there are no instances left for an element
541
- if (instanceMap.size === 0) {
542
- elementMap.delete(element);
543
- }
544
- }
545
- };
546
-
547
- /**
548
- * --------------------------------------------------------------------------
549
- * Bootstrap (v5.2.3): dom/manipulator.js
525
+ * Bootstrap dom/manipulator.js
550
526
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
551
527
  * --------------------------------------------------------------------------
552
528
  */
@@ -603,7 +579,7 @@
603
579
 
604
580
  /**
605
581
  * --------------------------------------------------------------------------
606
- * Bootstrap (v5.2.3): util/config.js
582
+ * Bootstrap util/config.js
607
583
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
608
584
  * --------------------------------------------------------------------------
609
585
  */
@@ -634,20 +610,19 @@
634
610
  return config;
635
611
  }
636
612
  _mergeConfigObj(config, element) {
637
- const jsonConfig = isElement$1(element) ? Manipulator$1.getDataAttribute(element, 'config') : {}; // try to parse
613
+ const jsonConfig = isElement$2(element) ? Manipulator$1.getDataAttribute(element, 'config') : {}; // try to parse
638
614
 
639
615
  return {
640
616
  ...this.constructor.Default,
641
617
  ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
642
- ...(isElement$1(element) ? Manipulator$1.getDataAttributes(element) : {}),
618
+ ...(isElement$2(element) ? Manipulator$1.getDataAttributes(element) : {}),
643
619
  ...(typeof config === 'object' ? config : {})
644
620
  };
645
621
  }
646
622
  _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
647
- for (const property of Object.keys(configTypes)) {
648
- const expectedTypes = configTypes[property];
623
+ for (const [property, expectedTypes] of Object.entries(configTypes)) {
649
624
  const value = config[property];
650
- const valueType = isElement$1(value) ? 'element' : toType(value);
625
+ const valueType = isElement$2(value) ? 'element' : toType(value);
651
626
  if (!new RegExp(expectedTypes).test(valueType)) {
652
627
  throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
653
628
  }
@@ -657,7 +632,7 @@
657
632
 
658
633
  /**
659
634
  * --------------------------------------------------------------------------
660
- * Bootstrap (v5.2.3): base-component.js
635
+ * Bootstrap base-component.js
661
636
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
662
637
  * --------------------------------------------------------------------------
663
638
  */
@@ -667,7 +642,7 @@
667
642
  * Constants
668
643
  */
669
644
 
670
- const VERSION = '5.2.3';
645
+ const VERSION = '5.3.3';
671
646
 
672
647
  /**
673
648
  * Class definition
@@ -676,7 +651,7 @@
676
651
  class BaseComponent extends Config {
677
652
  constructor(element, config) {
678
653
  super();
679
- element = getElement(element);
654
+ element = getElement$1(element);
680
655
  if (!element) {
681
656
  return;
682
657
  }
@@ -705,7 +680,7 @@
705
680
 
706
681
  // Static
707
682
  static getInstance(element) {
708
- return Data.get(getElement(element), this.DATA_KEY);
683
+ return Data.get(getElement$1(element), this.DATA_KEY);
709
684
  }
710
685
  static getOrCreateInstance(element, config = {}) {
711
686
  return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
@@ -726,7 +701,96 @@
726
701
 
727
702
  /**
728
703
  * --------------------------------------------------------------------------
729
- * Bootstrap (v5.2.3): util/component-functions.js
704
+ * Bootstrap dom/selector-engine.js
705
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
706
+ * --------------------------------------------------------------------------
707
+ */
708
+
709
+ const getSelector$1 = element => {
710
+ let selector = element.getAttribute('data-bs-target');
711
+ if (!selector || selector === '#') {
712
+ let hrefAttribute = element.getAttribute('href');
713
+
714
+ // The only valid content that could double as a selector are IDs or classes,
715
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
716
+ // `document.querySelector` will rightfully complain it is invalid.
717
+ // See https://github.com/twbs/bootstrap/issues/32273
718
+ if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
719
+ return null;
720
+ }
721
+
722
+ // Just in case some CMS puts out a full URL with the anchor appended
723
+ if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
724
+ hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
725
+ }
726
+ selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
727
+ }
728
+ return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;
729
+ };
730
+ const SelectorEngine = {
731
+ find(selector, element = document.documentElement) {
732
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
733
+ },
734
+ findOne(selector, element = document.documentElement) {
735
+ return Element.prototype.querySelector.call(element, selector);
736
+ },
737
+ children(element, selector) {
738
+ return [].concat(...element.children).filter(child => child.matches(selector));
739
+ },
740
+ parents(element, selector) {
741
+ const parents = [];
742
+ let ancestor = element.parentNode.closest(selector);
743
+ while (ancestor) {
744
+ parents.push(ancestor);
745
+ ancestor = ancestor.parentNode.closest(selector);
746
+ }
747
+ return parents;
748
+ },
749
+ prev(element, selector) {
750
+ let previous = element.previousElementSibling;
751
+ while (previous) {
752
+ if (previous.matches(selector)) {
753
+ return [previous];
754
+ }
755
+ previous = previous.previousElementSibling;
756
+ }
757
+ return [];
758
+ },
759
+ // TODO: this is now unused; remove later along with prev()
760
+ next(element, selector) {
761
+ let next = element.nextElementSibling;
762
+ while (next) {
763
+ if (next.matches(selector)) {
764
+ return [next];
765
+ }
766
+ next = next.nextElementSibling;
767
+ }
768
+ return [];
769
+ },
770
+ focusableChildren(element) {
771
+ const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
772
+ return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
773
+ },
774
+ getSelectorFromElement(element) {
775
+ const selector = getSelector$1(element);
776
+ if (selector) {
777
+ return SelectorEngine.findOne(selector) ? selector : null;
778
+ }
779
+ return null;
780
+ },
781
+ getElementFromSelector(element) {
782
+ const selector = getSelector$1(element);
783
+ return selector ? SelectorEngine.findOne(selector) : null;
784
+ },
785
+ getMultipleElementsFromSelector(element) {
786
+ const selector = getSelector$1(element);
787
+ return selector ? SelectorEngine.find(selector) : [];
788
+ }
789
+ };
790
+
791
+ /**
792
+ * --------------------------------------------------------------------------
793
+ * Bootstrap util/component-functions.js
730
794
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
731
795
  * --------------------------------------------------------------------------
732
796
  */
@@ -741,7 +805,7 @@
741
805
  if (isDisabled(this)) {
742
806
  return;
743
807
  }
744
- const target = getElementFromSelector(this) || this.closest(`.${name}`);
808
+ const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);
745
809
  const instance = component.getOrCreateInstance(target);
746
810
 
747
811
  // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
@@ -751,7 +815,7 @@
751
815
 
752
816
  /**
753
817
  * --------------------------------------------------------------------------
754
- * Bootstrap (v5.2.3): alert.js
818
+ * Bootstrap alert.js
755
819
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
756
820
  * --------------------------------------------------------------------------
757
821
  */
@@ -822,11 +886,11 @@
822
886
  * jQuery
823
887
  */
824
888
 
825
- defineJQueryPlugin(Alert);
889
+ defineJQueryPlugin$1(Alert);
826
890
 
827
891
  /**
828
892
  * --------------------------------------------------------------------------
829
- * Bootstrap (v5.2.3): button.js
893
+ * Bootstrap button.js
830
894
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
831
895
  * --------------------------------------------------------------------------
832
896
  */
@@ -886,69 +950,11 @@
886
950
  * jQuery
887
951
  */
888
952
 
889
- defineJQueryPlugin(Button);
953
+ defineJQueryPlugin$1(Button);
890
954
 
891
955
  /**
892
956
  * --------------------------------------------------------------------------
893
- * Bootstrap (v5.2.3): dom/selector-engine.js
894
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
895
- * --------------------------------------------------------------------------
896
- */
897
-
898
-
899
- /**
900
- * Constants
901
- */
902
-
903
- const SelectorEngine = {
904
- find(selector, element = document.documentElement) {
905
- return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
906
- },
907
- findOne(selector, element = document.documentElement) {
908
- return Element.prototype.querySelector.call(element, selector);
909
- },
910
- children(element, selector) {
911
- return [].concat(...element.children).filter(child => child.matches(selector));
912
- },
913
- parents(element, selector) {
914
- const parents = [];
915
- let ancestor = element.parentNode.closest(selector);
916
- while (ancestor) {
917
- parents.push(ancestor);
918
- ancestor = ancestor.parentNode.closest(selector);
919
- }
920
- return parents;
921
- },
922
- prev(element, selector) {
923
- let previous = element.previousElementSibling;
924
- while (previous) {
925
- if (previous.matches(selector)) {
926
- return [previous];
927
- }
928
- previous = previous.previousElementSibling;
929
- }
930
- return [];
931
- },
932
- // TODO: this is now unused; remove later along with prev()
933
- next(element, selector) {
934
- let next = element.nextElementSibling;
935
- while (next) {
936
- if (next.matches(selector)) {
937
- return [next];
938
- }
939
- next = next.nextElementSibling;
940
- }
941
- return [];
942
- },
943
- focusableChildren(element) {
944
- const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(',');
945
- return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
946
- }
947
- };
948
-
949
- /**
950
- * --------------------------------------------------------------------------
951
- * Bootstrap (v5.2.3): util/swipe.js
957
+ * Bootstrap util/swipe.js
952
958
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
953
959
  * --------------------------------------------------------------------------
954
960
  */
@@ -1068,7 +1074,7 @@
1068
1074
 
1069
1075
  /**
1070
1076
  * --------------------------------------------------------------------------
1071
- * Bootstrap (v5.2.3): carousel.js
1077
+ * Bootstrap carousel.js
1072
1078
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1073
1079
  * --------------------------------------------------------------------------
1074
1080
  */
@@ -1329,7 +1335,7 @@
1329
1335
  }
1330
1336
  if (!activeElement || !nextElement) {
1331
1337
  // Some weirdness is happening, so we bail
1332
- // todo: change tests that use empty divs to avoid this check
1338
+ // TODO: change tests that use empty divs to avoid this check
1333
1339
  return;
1334
1340
  }
1335
1341
  const isCycling = Boolean(this._interval);
@@ -1406,7 +1412,7 @@
1406
1412
  */
1407
1413
 
1408
1414
  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_SLIDE, function (event) {
1409
- const target = getElementFromSelector(this);
1415
+ const target = SelectorEngine.getElementFromSelector(this);
1410
1416
  if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
1411
1417
  return;
1412
1418
  }
@@ -1437,11 +1443,11 @@
1437
1443
  * jQuery
1438
1444
  */
1439
1445
 
1440
- defineJQueryPlugin(Carousel);
1446
+ defineJQueryPlugin$1(Carousel);
1441
1447
 
1442
1448
  /**
1443
1449
  * --------------------------------------------------------------------------
1444
- * Bootstrap (v5.2.3): collapse.js
1450
+ * Bootstrap collapse.js
1445
1451
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1446
1452
  * --------------------------------------------------------------------------
1447
1453
  */
@@ -1490,7 +1496,7 @@
1490
1496
  this._triggerArray = [];
1491
1497
  const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1492
1498
  for (const elem of toggleList) {
1493
- const selector = getSelectorFromElement(elem);
1499
+ const selector = SelectorEngine.getSelectorFromElement(elem);
1494
1500
  const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);
1495
1501
  if (selector !== null && filterElement.length) {
1496
1502
  this._triggerArray.push(elem);
@@ -1578,7 +1584,7 @@
1578
1584
  this._element.classList.add(CLASS_NAME_COLLAPSING);
1579
1585
  this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1580
1586
  for (const trigger of this._triggerArray) {
1581
- const element = getElementFromSelector(trigger);
1587
+ const element = SelectorEngine.getElementFromSelector(trigger);
1582
1588
  if (element && !this._isShown(element)) {
1583
1589
  this._addAriaAndCollapsedClass([trigger], false);
1584
1590
  }
@@ -1600,7 +1606,7 @@
1600
1606
  // Private
1601
1607
  _configAfterMerge(config) {
1602
1608
  config.toggle = Boolean(config.toggle); // Coerce string values
1603
- config.parent = getElement(config.parent);
1609
+ config.parent = getElement$1(config.parent);
1604
1610
  return config;
1605
1611
  }
1606
1612
  _getDimension() {
@@ -1612,7 +1618,7 @@
1612
1618
  }
1613
1619
  const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
1614
1620
  for (const element of children) {
1615
- const selected = getElementFromSelector(element);
1621
+ const selected = SelectorEngine.getElementFromSelector(element);
1616
1622
  if (selected) {
1617
1623
  this._addAriaAndCollapsedClass([element], this._isShown(selected));
1618
1624
  }
@@ -1660,9 +1666,7 @@
1660
1666
  if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
1661
1667
  event.preventDefault();
1662
1668
  }
1663
- const selector = getSelectorFromElement(this);
1664
- const selectorElements = SelectorEngine.find(selector);
1665
- for (const element of selectorElements) {
1669
+ for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {
1666
1670
  Collapse.getOrCreateInstance(element, {
1667
1671
  toggle: false
1668
1672
  }).toggle();
@@ -1673,7 +1677,7 @@
1673
1677
  * jQuery
1674
1678
  */
1675
1679
 
1676
- defineJQueryPlugin(Collapse);
1680
+ defineJQueryPlugin$1(Collapse);
1677
1681
 
1678
1682
  var top = 'top';
1679
1683
  var bottom = 'bottom';
@@ -1722,7 +1726,7 @@
1722
1726
  return node;
1723
1727
  }
1724
1728
 
1725
- function isElement(node) {
1729
+ function isElement$1(node) {
1726
1730
  var OwnElement = getWindow(node).Element;
1727
1731
  return node instanceof OwnElement || node instanceof Element;
1728
1732
  }
@@ -1851,7 +1855,7 @@
1851
1855
  scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
1852
1856
  scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
1853
1857
  }
1854
- var _ref = isElement(element) ? getWindow(element) : window,
1858
+ var _ref = isElement$1(element) ? getWindow(element) : window,
1855
1859
  visualViewport = _ref.visualViewport;
1856
1860
  var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
1857
1861
  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
@@ -1922,7 +1926,7 @@
1922
1926
 
1923
1927
  function getDocumentElement(element) {
1924
1928
  // $FlowFixMe[incompatible-return]: assume body is always available
1925
- return ((isElement(element) ? element.ownerDocument :
1929
+ return ((isElement$1(element) ? element.ownerDocument :
1926
1930
  // $FlowFixMe[prop-missing]
1927
1931
  element.document) || window.document).documentElement;
1928
1932
  }
@@ -2441,7 +2445,7 @@
2441
2445
  return rect;
2442
2446
  }
2443
2447
  function getClientRectFromMixedType(element, clippingParent, strategy) {
2444
- return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
2448
+ return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement$1(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
2445
2449
  } // A "clipping parent" is an overflowable container with the characteristic of
2446
2450
  // clipping (or hiding) overflowing elements with a position different from
2447
2451
  // `initial`
@@ -2450,12 +2454,12 @@
2450
2454
  var clippingParents = listScrollParents(getParentNode(element));
2451
2455
  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0;
2452
2456
  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
2453
- if (!isElement(clipperElement)) {
2457
+ if (!isElement$1(clipperElement)) {
2454
2458
  return [];
2455
2459
  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414
2456
2460
 
2457
2461
  return clippingParents.filter(function (clippingParent) {
2458
- return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
2462
+ return isElement$1(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';
2459
2463
  });
2460
2464
  } // Gets the maximum area that the element is visible in due to any number of
2461
2465
  // clipping parents
@@ -2557,7 +2561,7 @@
2557
2561
  var altContext = elementContext === popper ? reference : popper;
2558
2562
  var popperRect = state.rects.popper;
2559
2563
  var element = state.elements[altBoundary ? altContext : elementContext];
2560
- var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
2564
+ var clippingClientRect = getClippingRect(isElement$1(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
2561
2565
  var referenceClientRect = getBoundingClientRect(state.elements.reference);
2562
2566
  var popperOffsets = computeOffsets({
2563
2567
  reference: referenceClientRect,
@@ -3161,7 +3165,7 @@
3161
3165
  cleanupModifierEffects();
3162
3166
  state.options = Object.assign({}, defaultOptions, state.options, options);
3163
3167
  state.scrollParents = {
3164
- reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],
3168
+ reference: isElement$1(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],
3165
3169
  popper: listScrollParents(popper)
3166
3170
  }; // Orders the modifiers based on their dependencies and `phase`
3167
3171
  // properties
@@ -3340,7 +3344,7 @@
3340
3344
 
3341
3345
  /**
3342
3346
  * --------------------------------------------------------------------------
3343
- * Bootstrap (v5.2.3): dropdown.js
3347
+ * Bootstrap dropdown.js
3344
3348
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3345
3349
  * --------------------------------------------------------------------------
3346
3350
  */
@@ -3413,7 +3417,7 @@
3413
3417
  super(element, config);
3414
3418
  this._popper = null;
3415
3419
  this._parent = this._element.parentNode; // dropdown wrapper
3416
- // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
3420
+ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
3417
3421
  this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
3418
3422
  this._inNavbar = this._detectNavbar();
3419
3423
  }
@@ -3508,7 +3512,7 @@
3508
3512
  }
3509
3513
  _getConfig(config) {
3510
3514
  config = super._getConfig(config);
3511
- if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
3515
+ if (typeof config.reference === 'object' && !isElement$2(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
3512
3516
  // Popper virtual elements require a getBoundingClientRect method
3513
3517
  throw new TypeError(`${NAME$c.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
3514
3518
  }
@@ -3521,8 +3525,8 @@
3521
3525
  let referenceElement = this._element;
3522
3526
  if (this._config.reference === 'parent') {
3523
3527
  referenceElement = this._parent;
3524
- } else if (isElement$1(this._config.reference)) {
3525
- referenceElement = getElement(this._config.reference);
3528
+ } else if (isElement$2(this._config.reference)) {
3529
+ referenceElement = getElement$1(this._config.reference);
3526
3530
  } else if (typeof this._config.reference === 'object') {
3527
3531
  referenceElement = this._config.reference;
3528
3532
  }
@@ -3587,7 +3591,7 @@
3587
3591
 
3588
3592
  // Disable Popper if we have a static display or Dropdown is in Navbar
3589
3593
  if (this._inNavbar || this._config.display === 'static') {
3590
- Manipulator$1.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove
3594
+ Manipulator$1.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
3591
3595
  defaultBsPopperConfig.modifiers = [{
3592
3596
  name: 'applyStyles',
3593
3597
  enabled: false
@@ -3595,7 +3599,7 @@
3595
3599
  }
3596
3600
  return {
3597
3601
  ...defaultBsPopperConfig,
3598
- ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
3602
+ ...execute(this._config.popperConfig, [defaultBsPopperConfig])
3599
3603
  };
3600
3604
  }
3601
3605
  _selectMenuItem({
@@ -3669,7 +3673,7 @@
3669
3673
  }
3670
3674
  event.preventDefault();
3671
3675
 
3672
- // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
3676
+ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
3673
3677
  const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
3674
3678
  const instance = Dropdown.getOrCreateInstance(getToggleButton);
3675
3679
  if (isUpOrDownEvent) {
@@ -3704,237 +3708,11 @@
3704
3708
  * jQuery
3705
3709
  */
3706
3710
 
3707
- defineJQueryPlugin(Dropdown);
3708
-
3709
- /**
3710
- * --------------------------------------------------------------------------
3711
- * Bootstrap (v5.1.3): gallery.js
3712
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3713
- * --------------------------------------------------------------------------
3714
- */
3715
-
3716
-
3717
- /**
3718
- * ------------------------------------------------------------------------
3719
- * Constants
3720
- * ------------------------------------------------------------------------
3721
- */
3722
-
3723
- const Default$a = {};
3724
- const NAME$b = 'gallery';
3725
- const DATA_KEY$7 = 'bs.gallery';
3726
- const EVENT_KEY$7 = `.${DATA_KEY$7}`;
3727
- const DATA_API_KEY$4 = '.data-api';
3728
- const CAROUSEL_SELECTOR = '.carousel';
3729
- const CAROUSEL_PAGER_SELECTOR = '.carousel-pager span';
3730
- const CAROUSEL_ACTIVE_SELECTOR = '.carousel-item.active';
3731
- const CAROUSEL_ITEM_SELECTOR = '.carousel-item';
3732
- const THUMBNAIL_SELECTOR = '.bcl-gallery__grid a, .bcl-gallery__mobile-view-more';
3733
- const MODAL_SELECTOR = '.modal';
3734
- const EVENT_MODAL_HIDE$1 = 'hide.bs.modal';
3735
- const CAROUSEL_EVENT = 'slide.bs.carousel';
3736
- const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
3737
-
3738
- /**
3739
- * ------------------------------------------------------------------------
3740
- * Class Definition
3741
- * ------------------------------------------------------------------------
3742
- */
3743
-
3744
- class Gallery extends BaseComponent {
3745
- constructor(element, config) {
3746
- super(element, config);
3747
- /* eslint no-underscore-dangle: ["error", { "allow": ["_element"] }] */
3748
- this.carousel = SelectorEngine.findOne(CAROUSEL_SELECTOR, this._element);
3749
- this.carouselPager = SelectorEngine.findOne(CAROUSEL_PAGER_SELECTOR, this._element);
3750
- this.carouselStartIndex = element.getAttribute('data-gallery-start');
3751
- this.carouselActiveItem = SelectorEngine.find(CAROUSEL_ITEM_SELECTOR, this.carousel)[this.carouselStartIndex];
3752
- this.carouselPager.textContent = Number(this.carouselStartIndex) + 1;
3753
- this.modal = SelectorEngine.findOne(MODAL_SELECTOR, this._element);
3754
- this.addEventListeners();
3755
- this.carouselLazyLoad(this.carouselActiveItem);
3756
- }
3757
-
3758
- // Getters
3759
- static get NAME() {
3760
- return NAME$b;
3761
- }
3762
-
3763
- // Public
3764
- setSlide(event) {
3765
- const slideFrom = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
3766
- const slideTo = event.relatedTarget;
3767
- this.carouselLazyLoad(slideTo);
3768
- this.carouselPager.textContent = event.to + 1;
3769
- this.stopVideo(slideFrom);
3770
- }
3771
- stopSlide() {
3772
- const currentSlide = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
3773
- this.stopVideo(currentSlide);
3774
- }
3775
- stopVideo(slide) {
3776
- const iframe = SelectorEngine.findOne('iframe', slide);
3777
- const video = SelectorEngine.findOne('video', slide);
3778
- if (iframe) {
3779
- iframe.src = iframe.dataset.src;
3780
- } else if (video) {
3781
- video.pause();
3782
- }
3783
- }
3784
-
3785
- // Private
3786
- carouselLazyLoad(slide) {
3787
- const media = SelectorEngine.findOne('[data-src]', slide);
3788
- if (media && !media.src) {
3789
- media.src = media.dataset.src;
3790
- }
3791
- }
3792
- addEventListeners() {
3793
- EventHandler.on(this.carousel, CAROUSEL_EVENT, event => this.setSlide(event));
3794
- EventHandler.on(this.modal, EVENT_MODAL_HIDE$1, event => this.stopSlide(event));
3795
- }
3796
-
3797
- // Static
3798
- static get Default() {
3799
- return Default$a;
3800
- }
3801
- static jQueryInterface(config) {
3802
- return this.each(function jInterface() {
3803
- const data = Gallery.getOrCreateInstance(this);
3804
- if (typeof config !== 'string') {
3805
- return;
3806
- }
3807
- if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3808
- throw new TypeError(`No method named "${config}"`);
3809
- }
3810
- data[config](this);
3811
- });
3812
- }
3813
- }
3814
-
3815
- /**
3816
- * ------------------------------------------------------------------------
3817
- * Data Api implementation
3818
- * ------------------------------------------------------------------------
3819
- */
3820
-
3821
- EventHandler.on(document, EVENT_CLICK_DATA_API$3, THUMBNAIL_SELECTOR, event => {
3822
- const gallery = event.target.closest('div.bcl-gallery');
3823
- const firstSlide = event.target.parentNode.getAttribute('data-bs-slide-to');
3824
- gallery.dataset.galleryStart = firstSlide;
3825
- Gallery.getOrCreateInstance(gallery);
3826
- });
3827
-
3828
- /**
3829
- * ------------------------------------------------------------------------
3830
- * jQuery
3831
- * ------------------------------------------------------------------------
3832
- * add .gallery to jQuery only if jQuery is present
3833
- */
3834
-
3835
- defineJQueryPlugin(Gallery);
3836
-
3837
- /**
3838
- * --------------------------------------------------------------------------
3839
- * Bootstrap (v5.2.3): util/scrollBar.js
3840
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3841
- * --------------------------------------------------------------------------
3842
- */
3843
-
3844
-
3845
- /**
3846
- * Constants
3847
- */
3848
-
3849
- const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
3850
- const SELECTOR_STICKY_CONTENT = '.sticky-top';
3851
- const PROPERTY_PADDING = 'padding-right';
3852
- const PROPERTY_MARGIN = 'margin-right';
3853
-
3854
- /**
3855
- * Class definition
3856
- */
3857
-
3858
- class ScrollBarHelper {
3859
- constructor() {
3860
- this._element = document.body;
3861
- }
3862
-
3863
- // Public
3864
- getWidth() {
3865
- // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
3866
- const documentWidth = document.documentElement.clientWidth;
3867
- return Math.abs(window.innerWidth - documentWidth);
3868
- }
3869
- hide() {
3870
- const width = this.getWidth();
3871
- this._disableOverFlow();
3872
- // give padding to element to balance the hidden scrollbar width
3873
- this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
3874
- // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
3875
- this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
3876
- this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
3877
- }
3878
- reset() {
3879
- this._resetElementAttributes(this._element, 'overflow');
3880
- this._resetElementAttributes(this._element, PROPERTY_PADDING);
3881
- this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
3882
- this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
3883
- }
3884
- isOverflowing() {
3885
- return this.getWidth() > 0;
3886
- }
3887
-
3888
- // Private
3889
- _disableOverFlow() {
3890
- this._saveInitialAttribute(this._element, 'overflow');
3891
- this._element.style.overflow = 'hidden';
3892
- }
3893
- _setElementAttributes(selector, styleProperty, callback) {
3894
- const scrollbarWidth = this.getWidth();
3895
- const manipulationCallBack = element => {
3896
- if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
3897
- return;
3898
- }
3899
- this._saveInitialAttribute(element, styleProperty);
3900
- const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
3901
- element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
3902
- };
3903
- this._applyManipulationCallback(selector, manipulationCallBack);
3904
- }
3905
- _saveInitialAttribute(element, styleProperty) {
3906
- const actualValue = element.style.getPropertyValue(styleProperty);
3907
- if (actualValue) {
3908
- Manipulator$1.setDataAttribute(element, styleProperty, actualValue);
3909
- }
3910
- }
3911
- _resetElementAttributes(selector, styleProperty) {
3912
- const manipulationCallBack = element => {
3913
- const value = Manipulator$1.getDataAttribute(element, styleProperty);
3914
- // We only want to remove the property if the value is `null`; the value can also be zero
3915
- if (value === null) {
3916
- element.style.removeProperty(styleProperty);
3917
- return;
3918
- }
3919
- Manipulator$1.removeDataAttribute(element, styleProperty);
3920
- element.style.setProperty(styleProperty, value);
3921
- };
3922
- this._applyManipulationCallback(selector, manipulationCallBack);
3923
- }
3924
- _applyManipulationCallback(selector, callBack) {
3925
- if (isElement$1(selector)) {
3926
- callBack(selector);
3927
- return;
3928
- }
3929
- for (const sel of SelectorEngine.find(selector, this._element)) {
3930
- callBack(sel);
3931
- }
3932
- }
3933
- }
3711
+ defineJQueryPlugin$1(Dropdown);
3934
3712
 
3935
3713
  /**
3936
3714
  * --------------------------------------------------------------------------
3937
- * Bootstrap (v5.2.3): util/backdrop.js
3715
+ * Bootstrap util/backdrop.js
3938
3716
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3939
3717
  * --------------------------------------------------------------------------
3940
3718
  */
@@ -3944,11 +3722,11 @@
3944
3722
  * Constants
3945
3723
  */
3946
3724
 
3947
- const NAME$a = 'backdrop';
3725
+ const NAME$b = 'backdrop';
3948
3726
  const CLASS_NAME_FADE$4 = 'fade';
3949
3727
  const CLASS_NAME_SHOW$5 = 'show';
3950
- const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$a}`;
3951
- const Default$9 = {
3728
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$b}`;
3729
+ const Default$a = {
3952
3730
  className: 'modal-backdrop',
3953
3731
  clickCallback: null,
3954
3732
  isAnimated: false,
@@ -3978,13 +3756,13 @@
3978
3756
 
3979
3757
  // Getters
3980
3758
  static get Default() {
3981
- return Default$9;
3759
+ return Default$a;
3982
3760
  }
3983
3761
  static get DefaultType() {
3984
3762
  return DefaultType$8;
3985
3763
  }
3986
3764
  static get NAME() {
3987
- return NAME$a;
3765
+ return NAME$b;
3988
3766
  }
3989
3767
 
3990
3768
  // Public
@@ -4037,7 +3815,7 @@
4037
3815
  }
4038
3816
  _configAfterMerge(config) {
4039
3817
  // use getElement() with the default "body" to get a fresh Element on each instantiation
4040
- config.rootElement = getElement(config.rootElement);
3818
+ config.rootElement = getElement$1(config.rootElement);
4041
3819
  return config;
4042
3820
  }
4043
3821
  _append() {
@@ -4058,7 +3836,7 @@
4058
3836
 
4059
3837
  /**
4060
3838
  * --------------------------------------------------------------------------
4061
- * Bootstrap (v5.2.3): util/focustrap.js
3839
+ * Bootstrap util/focustrap.js
4062
3840
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4063
3841
  * --------------------------------------------------------------------------
4064
3842
  */
@@ -4068,15 +3846,15 @@
4068
3846
  * Constants
4069
3847
  */
4070
3848
 
4071
- const NAME$9 = 'focustrap';
4072
- const DATA_KEY$6 = 'bs.focustrap';
4073
- const EVENT_KEY$6 = `.${DATA_KEY$6}`;
4074
- const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$6}`;
4075
- const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$6}`;
3849
+ const NAME$a = 'focustrap';
3850
+ const DATA_KEY$7 = 'bs.focustrap';
3851
+ const EVENT_KEY$7 = `.${DATA_KEY$7}`;
3852
+ const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$7}`;
3853
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
4076
3854
  const TAB_KEY = 'Tab';
4077
3855
  const TAB_NAV_FORWARD = 'forward';
4078
3856
  const TAB_NAV_BACKWARD = 'backward';
4079
- const Default$8 = {
3857
+ const Default$9 = {
4080
3858
  autofocus: true,
4081
3859
  trapElement: null // The element to trap focus inside of
4082
3860
  };
@@ -4099,13 +3877,13 @@
4099
3877
 
4100
3878
  // Getters
4101
3879
  static get Default() {
4102
- return Default$8;
3880
+ return Default$9;
4103
3881
  }
4104
3882
  static get DefaultType() {
4105
3883
  return DefaultType$7;
4106
3884
  }
4107
3885
  static get NAME() {
4108
- return NAME$9;
3886
+ return NAME$a;
4109
3887
  }
4110
3888
 
4111
3889
  // Public
@@ -4116,7 +3894,7 @@
4116
3894
  if (this._config.autofocus) {
4117
3895
  this._config.trapElement.focus();
4118
3896
  }
4119
- EventHandler.off(document, EVENT_KEY$6); // guard against infinite focus loop
3897
+ EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop
4120
3898
  EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));
4121
3899
  EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
4122
3900
  this._isActive = true;
@@ -4126,7 +3904,7 @@
4126
3904
  return;
4127
3905
  }
4128
3906
  this._isActive = false;
4129
- EventHandler.off(document, EVENT_KEY$6);
3907
+ EventHandler.off(document, EVENT_KEY$7);
4130
3908
  }
4131
3909
 
4132
3910
  // Private
@@ -4156,7 +3934,7 @@
4156
3934
 
4157
3935
  /**
4158
3936
  * --------------------------------------------------------------------------
4159
- * Bootstrap (v5.2.3): modal.js
3937
+ * Bootstrap util/scrollBar.js
4160
3938
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4161
3939
  * --------------------------------------------------------------------------
4162
3940
  */
@@ -4166,21 +3944,119 @@
4166
3944
  * Constants
4167
3945
  */
4168
3946
 
4169
- const NAME$8 = 'modal';
4170
- const DATA_KEY$5 = 'bs.modal';
4171
- const EVENT_KEY$5 = `.${DATA_KEY$5}`;
4172
- const DATA_API_KEY$3 = '.data-api';
4173
- const ESCAPE_KEY$1 = 'Escape';
4174
- const EVENT_HIDE$4 = `hide${EVENT_KEY$5}`;
4175
- const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$5}`;
4176
- const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$5}`;
4177
- const EVENT_SHOW$4 = `show${EVENT_KEY$5}`;
4178
- const EVENT_SHOWN$4 = `shown${EVENT_KEY$5}`;
4179
- const EVENT_RESIZE$1 = `resize${EVENT_KEY$5}`;
4180
- const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$5}`;
4181
- const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$5}`;
4182
- const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$5}`;
4183
- const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$5}${DATA_API_KEY$3}`;
3947
+ const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
3948
+ const SELECTOR_STICKY_CONTENT = '.sticky-top';
3949
+ const PROPERTY_PADDING = 'padding-right';
3950
+ const PROPERTY_MARGIN = 'margin-right';
3951
+
3952
+ /**
3953
+ * Class definition
3954
+ */
3955
+
3956
+ class ScrollBarHelper {
3957
+ constructor() {
3958
+ this._element = document.body;
3959
+ }
3960
+
3961
+ // Public
3962
+ getWidth() {
3963
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
3964
+ const documentWidth = document.documentElement.clientWidth;
3965
+ return Math.abs(window.innerWidth - documentWidth);
3966
+ }
3967
+ hide() {
3968
+ const width = this.getWidth();
3969
+ this._disableOverFlow();
3970
+ // give padding to element to balance the hidden scrollbar width
3971
+ this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
3972
+ // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
3973
+ this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);
3974
+ this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);
3975
+ }
3976
+ reset() {
3977
+ this._resetElementAttributes(this._element, 'overflow');
3978
+ this._resetElementAttributes(this._element, PROPERTY_PADDING);
3979
+ this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
3980
+ this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
3981
+ }
3982
+ isOverflowing() {
3983
+ return this.getWidth() > 0;
3984
+ }
3985
+
3986
+ // Private
3987
+ _disableOverFlow() {
3988
+ this._saveInitialAttribute(this._element, 'overflow');
3989
+ this._element.style.overflow = 'hidden';
3990
+ }
3991
+ _setElementAttributes(selector, styleProperty, callback) {
3992
+ const scrollbarWidth = this.getWidth();
3993
+ const manipulationCallBack = element => {
3994
+ if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
3995
+ return;
3996
+ }
3997
+ this._saveInitialAttribute(element, styleProperty);
3998
+ const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
3999
+ element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
4000
+ };
4001
+ this._applyManipulationCallback(selector, manipulationCallBack);
4002
+ }
4003
+ _saveInitialAttribute(element, styleProperty) {
4004
+ const actualValue = element.style.getPropertyValue(styleProperty);
4005
+ if (actualValue) {
4006
+ Manipulator$1.setDataAttribute(element, styleProperty, actualValue);
4007
+ }
4008
+ }
4009
+ _resetElementAttributes(selector, styleProperty) {
4010
+ const manipulationCallBack = element => {
4011
+ const value = Manipulator$1.getDataAttribute(element, styleProperty);
4012
+ // We only want to remove the property if the value is `null`; the value can also be zero
4013
+ if (value === null) {
4014
+ element.style.removeProperty(styleProperty);
4015
+ return;
4016
+ }
4017
+ Manipulator$1.removeDataAttribute(element, styleProperty);
4018
+ element.style.setProperty(styleProperty, value);
4019
+ };
4020
+ this._applyManipulationCallback(selector, manipulationCallBack);
4021
+ }
4022
+ _applyManipulationCallback(selector, callBack) {
4023
+ if (isElement$2(selector)) {
4024
+ callBack(selector);
4025
+ return;
4026
+ }
4027
+ for (const sel of SelectorEngine.find(selector, this._element)) {
4028
+ callBack(sel);
4029
+ }
4030
+ }
4031
+ }
4032
+
4033
+ /**
4034
+ * --------------------------------------------------------------------------
4035
+ * Bootstrap modal.js
4036
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4037
+ * --------------------------------------------------------------------------
4038
+ */
4039
+
4040
+
4041
+ /**
4042
+ * Constants
4043
+ */
4044
+
4045
+ const NAME$9 = 'modal';
4046
+ const DATA_KEY$6 = 'bs.modal';
4047
+ const EVENT_KEY$6 = `.${DATA_KEY$6}`;
4048
+ const DATA_API_KEY$4 = '.data-api';
4049
+ const ESCAPE_KEY$1 = 'Escape';
4050
+ const EVENT_HIDE$4 = `hide${EVENT_KEY$6}`;
4051
+ const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$6}`;
4052
+ const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$6}`;
4053
+ const EVENT_SHOW$4 = `show${EVENT_KEY$6}`;
4054
+ const EVENT_SHOWN$4 = `shown${EVENT_KEY$6}`;
4055
+ const EVENT_RESIZE$1 = `resize${EVENT_KEY$6}`;
4056
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
4057
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
4058
+ const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
4059
+ const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$4}`;
4184
4060
  const CLASS_NAME_OPEN = 'modal-open';
4185
4061
  const CLASS_NAME_FADE$3 = 'fade';
4186
4062
  const CLASS_NAME_SHOW$4 = 'show';
@@ -4189,7 +4065,7 @@
4189
4065
  const SELECTOR_DIALOG = '.modal-dialog';
4190
4066
  const SELECTOR_MODAL_BODY = '.modal-body';
4191
4067
  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
4192
- const Default$7 = {
4068
+ const Default$8 = {
4193
4069
  backdrop: true,
4194
4070
  focus: true,
4195
4071
  keyboard: true
@@ -4218,13 +4094,13 @@
4218
4094
 
4219
4095
  // Getters
4220
4096
  static get Default() {
4221
- return Default$7;
4097
+ return Default$8;
4222
4098
  }
4223
4099
  static get DefaultType() {
4224
4100
  return DefaultType$6;
4225
4101
  }
4226
4102
  static get NAME() {
4227
- return NAME$8;
4103
+ return NAME$9;
4228
4104
  }
4229
4105
 
4230
4106
  // Public
@@ -4263,9 +4139,8 @@
4263
4139
  this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
4264
4140
  }
4265
4141
  dispose() {
4266
- for (const htmlElement of [window, this._dialog]) {
4267
- EventHandler.off(htmlElement, EVENT_KEY$5);
4268
- }
4142
+ EventHandler.off(window, EVENT_KEY$6);
4143
+ EventHandler.off(this._dialog, EVENT_KEY$6);
4269
4144
  this._backdrop.dispose();
4270
4145
  this._focustrap.deactivate();
4271
4146
  super.dispose();
@@ -4320,7 +4195,6 @@
4320
4195
  return;
4321
4196
  }
4322
4197
  if (this._config.keyboard) {
4323
- event.preventDefault();
4324
4198
  this.hide();
4325
4199
  return;
4326
4200
  }
@@ -4428,8 +4302,8 @@
4428
4302
  * Data API implementation
4429
4303
  */
4430
4304
 
4431
- EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
4432
- const target = getElementFromSelector(this);
4305
+ EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$2, function (event) {
4306
+ const target = SelectorEngine.getElementFromSelector(this);
4433
4307
  if (['A', 'AREA'].includes(this.tagName)) {
4434
4308
  event.preventDefault();
4435
4309
  }
@@ -4459,11 +4333,11 @@
4459
4333
  * jQuery
4460
4334
  */
4461
4335
 
4462
- defineJQueryPlugin(Modal);
4336
+ defineJQueryPlugin$1(Modal);
4463
4337
 
4464
4338
  /**
4465
4339
  * --------------------------------------------------------------------------
4466
- * Bootstrap (v5.2.3): offcanvas.js
4340
+ * Bootstrap offcanvas.js
4467
4341
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4468
4342
  * --------------------------------------------------------------------------
4469
4343
  */
@@ -4473,27 +4347,27 @@
4473
4347
  * Constants
4474
4348
  */
4475
4349
 
4476
- const NAME$7 = 'offcanvas';
4477
- const DATA_KEY$4 = 'bs.offcanvas';
4478
- const EVENT_KEY$4 = `.${DATA_KEY$4}`;
4479
- const DATA_API_KEY$2 = '.data-api';
4480
- const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$4}${DATA_API_KEY$2}`;
4350
+ const NAME$8 = 'offcanvas';
4351
+ const DATA_KEY$5 = 'bs.offcanvas';
4352
+ const EVENT_KEY$5 = `.${DATA_KEY$5}`;
4353
+ const DATA_API_KEY$3 = '.data-api';
4354
+ const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$5}${DATA_API_KEY$3}`;
4481
4355
  const ESCAPE_KEY = 'Escape';
4482
4356
  const CLASS_NAME_SHOW$3 = 'show';
4483
4357
  const CLASS_NAME_SHOWING$1 = 'showing';
4484
4358
  const CLASS_NAME_HIDING = 'hiding';
4485
4359
  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
4486
4360
  const OPEN_SELECTOR = '.offcanvas.show';
4487
- const EVENT_SHOW$3 = `show${EVENT_KEY$4}`;
4488
- const EVENT_SHOWN$3 = `shown${EVENT_KEY$4}`;
4489
- const EVENT_HIDE$3 = `hide${EVENT_KEY$4}`;
4490
- const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$4}`;
4491
- const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$4}`;
4492
- const EVENT_RESIZE = `resize${EVENT_KEY$4}`;
4493
- const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
4494
- const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$4}`;
4361
+ const EVENT_SHOW$3 = `show${EVENT_KEY$5}`;
4362
+ const EVENT_SHOWN$3 = `shown${EVENT_KEY$5}`;
4363
+ const EVENT_HIDE$3 = `hide${EVENT_KEY$5}`;
4364
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$5}`;
4365
+ const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$5}`;
4366
+ const EVENT_RESIZE = `resize${EVENT_KEY$5}`;
4367
+ const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$5}${DATA_API_KEY$3}`;
4368
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
4495
4369
  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
4496
- const Default$6 = {
4370
+ const Default$7 = {
4497
4371
  backdrop: true,
4498
4372
  keyboard: true,
4499
4373
  scroll: false
@@ -4519,13 +4393,13 @@
4519
4393
 
4520
4394
  // Getters
4521
4395
  static get Default() {
4522
- return Default$6;
4396
+ return Default$7;
4523
4397
  }
4524
4398
  static get DefaultType() {
4525
4399
  return DefaultType$5;
4526
4400
  }
4527
4401
  static get NAME() {
4528
- return NAME$7;
4402
+ return NAME$8;
4529
4403
  }
4530
4404
 
4531
4405
  // Public
@@ -4622,11 +4496,11 @@
4622
4496
  if (event.key !== ESCAPE_KEY) {
4623
4497
  return;
4624
4498
  }
4625
- if (!this._config.keyboard) {
4626
- EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
4499
+ if (this._config.keyboard) {
4500
+ this.hide();
4627
4501
  return;
4628
4502
  }
4629
- this.hide();
4503
+ EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
4630
4504
  });
4631
4505
  }
4632
4506
 
@@ -4649,8 +4523,8 @@
4649
4523
  * Data API implementation
4650
4524
  */
4651
4525
 
4652
- EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
4653
- const target = getElementFromSelector(this);
4526
+ EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$1, function (event) {
4527
+ const target = SelectorEngine.getElementFromSelector(this);
4654
4528
  if (['A', 'AREA'].includes(this.tagName)) {
4655
4529
  event.preventDefault();
4656
4530
  }
@@ -4690,93 +4564,17 @@
4690
4564
  * jQuery
4691
4565
  */
4692
4566
 
4693
- defineJQueryPlugin(Offcanvas);
4694
-
4695
- /**
4696
- * AccessibleToggle enhances Bootstrap Modal and Offcanvas components by:
4697
- * - Adding ARIA attributes for improved accessibility.
4698
- * - Updating `aria-expanded` on trigger elements based on visibility.
4699
- * Automatically initializes all modal and offcanvas triggers on the page.
4700
- */
4701
- class AccessibleToggle {
4702
- constructor(triggerElement, type) {
4703
- this.triggerElement = triggerElement;
4704
- this.type = type;
4705
- const target = triggerElement.getAttribute("data-bs-target") || triggerElement.getAttribute("href");
4706
- if (!target || target === "#") {
4707
- return;
4708
- }
4709
- this.targetElement = SelectorEngine.findOne(target);
4710
- if (!this.targetElement) {
4711
- return;
4712
- }
4713
- if (this.type === "modal") {
4714
- this.instance = Modal.getOrCreateInstance(this.targetElement);
4715
- } else if (this.type === "offcanvas") {
4716
- this.instance = Offcanvas.getOrCreateInstance(this.targetElement);
4717
- }
4718
- this.addAriaAttributes();
4719
- this.addEventListeners();
4720
- }
4721
- addAriaAttributes() {
4722
- if (this.triggerElement) {
4723
- this.triggerElement.setAttribute("aria-haspopup", "true");
4724
- this.triggerElement.setAttribute("aria-expanded", "false");
4725
- }
4726
- }
4727
- addEventListeners() {
4728
- const showEvent = this.type === "modal" ? "show.bs.modal" : "show.bs.offcanvas";
4729
- const hideEvent = this.type === "modal" ? "hide.bs.modal" : "hide.bs.offcanvas";
4730
- EventHandler.on(this.targetElement, showEvent, () => {
4731
- this.triggerElement.setAttribute("aria-expanded", "true");
4732
- });
4733
- EventHandler.on(this.targetElement, hideEvent, () => {
4734
- this.triggerElement.setAttribute("aria-expanded", "false");
4735
- });
4736
- }
4737
- static init(toggles) {
4738
- toggles.forEach(toggle => {
4739
- const triggerElements = SelectorEngine.find(toggle.selector);
4740
- triggerElements.forEach(triggerElement => new AccessibleToggle(triggerElement, toggle.type));
4741
- });
4742
- }
4743
- }
4567
+ defineJQueryPlugin$1(Offcanvas);
4744
4568
 
4745
4569
  /**
4746
4570
  * --------------------------------------------------------------------------
4747
- * Bootstrap (v5.2.3): util/sanitizer.js
4571
+ * Bootstrap util/sanitizer.js
4748
4572
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4749
4573
  * --------------------------------------------------------------------------
4750
4574
  */
4751
4575
 
4752
- const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
4576
+ // js-docs-start allow-list
4753
4577
  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
4754
-
4755
- /**
4756
- * A pattern that recognizes a commonly useful subset of URLs that are safe.
4757
- *
4758
- * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
4759
- */
4760
- const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
4761
-
4762
- /**
4763
- * A pattern that matches safe data URLs. Only matches image, video and audio types.
4764
- *
4765
- * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
4766
- */
4767
- 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;
4768
- const allowedAttribute = (attribute, allowedAttributeList) => {
4769
- const attributeName = attribute.nodeName.toLowerCase();
4770
- if (allowedAttributeList.includes(attributeName)) {
4771
- if (uriAttributes.has(attributeName)) {
4772
- return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
4773
- }
4774
- return true;
4775
- }
4776
-
4777
- // Check if a regular expression validates the attribute.
4778
- return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
4779
- };
4780
4578
  const DefaultAllowlist = {
4781
4579
  // Global attributes allowed on any supplied element below.
4782
4580
  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
@@ -4786,7 +4584,10 @@
4786
4584
  br: [],
4787
4585
  col: [],
4788
4586
  code: [],
4587
+ dd: [],
4789
4588
  div: [],
4589
+ dl: [],
4590
+ dt: [],
4790
4591
  em: [],
4791
4592
  hr: [],
4792
4593
  h1: [],
@@ -4810,6 +4611,30 @@
4810
4611
  u: [],
4811
4612
  ul: []
4812
4613
  };
4614
+ // js-docs-end allow-list
4615
+
4616
+ const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
4617
+
4618
+ /**
4619
+ * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation
4620
+ * contexts.
4621
+ *
4622
+ * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38
4623
+ */
4624
+ // eslint-disable-next-line unicorn/better-regex
4625
+ const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;
4626
+ const allowedAttribute = (attribute, allowedAttributeList) => {
4627
+ const attributeName = attribute.nodeName.toLowerCase();
4628
+ if (allowedAttributeList.includes(attributeName)) {
4629
+ if (uriAttributes.has(attributeName)) {
4630
+ return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));
4631
+ }
4632
+ return true;
4633
+ }
4634
+
4635
+ // Check if a regular expression validates the attribute.
4636
+ return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
4637
+ };
4813
4638
  function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
4814
4639
  if (!unsafeHtml.length) {
4815
4640
  return unsafeHtml;
@@ -4839,7 +4664,7 @@
4839
4664
 
4840
4665
  /**
4841
4666
  * --------------------------------------------------------------------------
4842
- * Bootstrap (v5.2.3): util/template-factory.js
4667
+ * Bootstrap util/template-factory.js
4843
4668
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4844
4669
  * --------------------------------------------------------------------------
4845
4670
  */
@@ -4849,8 +4674,8 @@
4849
4674
  * Constants
4850
4675
  */
4851
4676
 
4852
- const NAME$6 = 'TemplateFactory';
4853
- const Default$5 = {
4677
+ const NAME$7 = 'TemplateFactory';
4678
+ const Default$6 = {
4854
4679
  allowList: DefaultAllowlist,
4855
4680
  content: {},
4856
4681
  // { selector : text , selector2 : text2 , }
@@ -4886,13 +4711,13 @@
4886
4711
 
4887
4712
  // Getters
4888
4713
  static get Default() {
4889
- return Default$5;
4714
+ return Default$6;
4890
4715
  }
4891
4716
  static get DefaultType() {
4892
4717
  return DefaultType$4;
4893
4718
  }
4894
4719
  static get NAME() {
4895
- return NAME$6;
4720
+ return NAME$7;
4896
4721
  }
4897
4722
 
4898
4723
  // Public
@@ -4947,8 +4772,8 @@
4947
4772
  templateElement.remove();
4948
4773
  return;
4949
4774
  }
4950
- if (isElement$1(content)) {
4951
- this._putElementInTemplate(getElement(content), templateElement);
4775
+ if (isElement$2(content)) {
4776
+ this._putElementInTemplate(getElement$1(content), templateElement);
4952
4777
  return;
4953
4778
  }
4954
4779
  if (this._config.html) {
@@ -4961,7 +4786,7 @@
4961
4786
  return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
4962
4787
  }
4963
4788
  _resolvePossibleFunction(arg) {
4964
- return typeof arg === 'function' ? arg(this) : arg;
4789
+ return execute(arg, [this]);
4965
4790
  }
4966
4791
  _putElementInTemplate(element, templateElement) {
4967
4792
  if (this._config.html) {
@@ -4975,7 +4800,7 @@
4975
4800
 
4976
4801
  /**
4977
4802
  * --------------------------------------------------------------------------
4978
- * Bootstrap (v5.2.3): tooltip.js
4803
+ * Bootstrap tooltip.js
4979
4804
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4980
4805
  * --------------------------------------------------------------------------
4981
4806
  */
@@ -4985,14 +4810,14 @@
4985
4810
  * Constants
4986
4811
  */
4987
4812
 
4988
- const NAME$5 = 'tooltip';
4813
+ const NAME$6 = 'tooltip';
4989
4814
  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
4990
4815
  const CLASS_NAME_FADE$2 = 'fade';
4991
4816
  const CLASS_NAME_MODAL = 'modal';
4992
4817
  const CLASS_NAME_SHOW$2 = 'show';
4993
4818
  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
4994
4819
  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
4995
- const EVENT_MODAL_HIDE = 'hide.bs.modal';
4820
+ const EVENT_MODAL_HIDE$1 = 'hide.bs.modal';
4996
4821
  const TRIGGER_HOVER = 'hover';
4997
4822
  const TRIGGER_FOCUS = 'focus';
4998
4823
  const TRIGGER_CLICK = 'click';
@@ -5014,7 +4839,7 @@
5014
4839
  BOTTOM: 'bottom',
5015
4840
  LEFT: isRTL() ? 'right' : 'left'
5016
4841
  };
5017
- const Default$4 = {
4842
+ const Default$5 = {
5018
4843
  allowList: DefaultAllowlist,
5019
4844
  animation: true,
5020
4845
  boundary: 'clippingParents',
@@ -5023,7 +4848,7 @@
5023
4848
  delay: 0,
5024
4849
  fallbackPlacements: ['top', 'right', 'bottom', 'left'],
5025
4850
  html: false,
5026
- offset: [0, 0],
4851
+ offset: [0, 6],
5027
4852
  placement: 'top',
5028
4853
  popperConfig: null,
5029
4854
  sanitize: true,
@@ -5083,13 +4908,13 @@
5083
4908
 
5084
4909
  // Getters
5085
4910
  static get Default() {
5086
- return Default$4;
4911
+ return Default$5;
5087
4912
  }
5088
4913
  static get DefaultType() {
5089
4914
  return DefaultType$3;
5090
4915
  }
5091
4916
  static get NAME() {
5092
- return NAME$5;
4917
+ return NAME$6;
5093
4918
  }
5094
4919
 
5095
4920
  // Public
@@ -5115,7 +4940,7 @@
5115
4940
  }
5116
4941
  dispose() {
5117
4942
  clearTimeout(this._timeout);
5118
- EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
4943
+ EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE$1, this._hideModalHandler);
5119
4944
  if (this._element.getAttribute('data-bs-original-title')) {
5120
4945
  this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));
5121
4946
  }
@@ -5136,7 +4961,7 @@
5136
4961
  return;
5137
4962
  }
5138
4963
 
5139
- // todo v6 remove this OR make it optional
4964
+ // TODO: v6 remove this or make it optional
5140
4965
  this._disposePopper();
5141
4966
  const tip = this._getTipElement();
5142
4967
  this._element.setAttribute('aria-describedby', tip.getAttribute('id'));
@@ -5222,12 +5047,12 @@
5222
5047
  _createTipElement(content) {
5223
5048
  const tip = this._getTemplateFactory(content).toHtml();
5224
5049
 
5225
- // todo: remove this check on v6
5050
+ // TODO: remove this check in v6
5226
5051
  if (!tip) {
5227
5052
  return null;
5228
5053
  }
5229
5054
  tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
5230
- // todo: on v6 the following can be achieved with CSS only
5055
+ // TODO: v6 the following can be achieved with CSS only
5231
5056
  tip.classList.add(`bs-${this.constructor.NAME}-auto`);
5232
5057
  const tipId = getUID(this.constructor.NAME).toString();
5233
5058
  tip.setAttribute('id', tipId);
@@ -5277,7 +5102,7 @@
5277
5102
  return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
5278
5103
  }
5279
5104
  _createPopper(tip) {
5280
- const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
5105
+ const placement = execute(this._config.placement, [this, tip, this._element]);
5281
5106
  const attachment = AttachmentMap[placement.toUpperCase()];
5282
5107
  return createPopper(this._element, tip, this._getPopperConfig(attachment));
5283
5108
  }
@@ -5294,7 +5119,7 @@
5294
5119
  return offset;
5295
5120
  }
5296
5121
  _resolvePossibleFunction(arg) {
5297
- return typeof arg === 'function' ? arg.call(this._element) : arg;
5122
+ return execute(arg, [this._element]);
5298
5123
  }
5299
5124
  _getPopperConfig(attachment) {
5300
5125
  const defaultBsPopperConfig = {
@@ -5332,7 +5157,7 @@
5332
5157
  };
5333
5158
  return {
5334
5159
  ...defaultBsPopperConfig,
5335
- ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
5160
+ ...execute(this._config.popperConfig, [defaultBsPopperConfig])
5336
5161
  };
5337
5162
  }
5338
5163
  _setListeners() {
@@ -5363,7 +5188,7 @@
5363
5188
  this.hide();
5364
5189
  }
5365
5190
  };
5366
- EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
5191
+ EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE$1, this._hideModalHandler);
5367
5192
  }
5368
5193
  _fixTitle() {
5369
5194
  const title = this._element.getAttribute('title');
@@ -5423,7 +5248,7 @@
5423
5248
  return config;
5424
5249
  }
5425
5250
  _configAfterMerge(config) {
5426
- config.container = config.container === false ? document.body : getElement(config.container);
5251
+ config.container = config.container === false ? document.body : getElement$1(config.container);
5427
5252
  if (typeof config.delay === 'number') {
5428
5253
  config.delay = {
5429
5254
  show: config.delay,
@@ -5440,9 +5265,9 @@
5440
5265
  }
5441
5266
  _getDelegateConfig() {
5442
5267
  const config = {};
5443
- for (const key in this._config) {
5444
- if (this.constructor.Default[key] !== this._config[key]) {
5445
- config[key] = this._config[key];
5268
+ for (const [key, value] of Object.entries(this._config)) {
5269
+ if (this.constructor.Default[key] !== value) {
5270
+ config[key] = value;
5446
5271
  }
5447
5272
  }
5448
5273
  config.selector = false;
@@ -5483,11 +5308,11 @@
5483
5308
  * jQuery
5484
5309
  */
5485
5310
 
5486
- defineJQueryPlugin(Tooltip);
5311
+ defineJQueryPlugin$1(Tooltip);
5487
5312
 
5488
5313
  /**
5489
5314
  * --------------------------------------------------------------------------
5490
- * Bootstrap (v5.2.3): popover.js
5315
+ * Bootstrap popover.js
5491
5316
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5492
5317
  * --------------------------------------------------------------------------
5493
5318
  */
@@ -5497,10 +5322,10 @@
5497
5322
  * Constants
5498
5323
  */
5499
5324
 
5500
- const NAME$4 = 'popover';
5325
+ const NAME$5 = 'popover';
5501
5326
  const SELECTOR_TITLE = '.popover-header';
5502
5327
  const SELECTOR_CONTENT = '.popover-body';
5503
- const Default$3 = {
5328
+ const Default$4 = {
5504
5329
  ...Tooltip.Default,
5505
5330
  content: '',
5506
5331
  offset: [0, 8],
@@ -5520,13 +5345,13 @@
5520
5345
  class Popover extends Tooltip {
5521
5346
  // Getters
5522
5347
  static get Default() {
5523
- return Default$3;
5348
+ return Default$4;
5524
5349
  }
5525
5350
  static get DefaultType() {
5526
5351
  return DefaultType$2;
5527
5352
  }
5528
5353
  static get NAME() {
5529
- return NAME$4;
5354
+ return NAME$5;
5530
5355
  }
5531
5356
 
5532
5357
  // Overrides
@@ -5564,11 +5389,11 @@
5564
5389
  * jQuery
5565
5390
  */
5566
5391
 
5567
- defineJQueryPlugin(Popover);
5392
+ defineJQueryPlugin$1(Popover);
5568
5393
 
5569
5394
  /**
5570
5395
  * --------------------------------------------------------------------------
5571
- * Bootstrap (v5.2.3): scrollspy.js
5396
+ * Bootstrap scrollspy.js
5572
5397
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5573
5398
  * --------------------------------------------------------------------------
5574
5399
  */
@@ -5578,13 +5403,13 @@
5578
5403
  * Constants
5579
5404
  */
5580
5405
 
5581
- const NAME$3 = 'scrollspy';
5582
- const DATA_KEY$3 = 'bs.scrollspy';
5583
- const EVENT_KEY$3 = `.${DATA_KEY$3}`;
5584
- const DATA_API_KEY$1 = '.data-api';
5585
- const EVENT_ACTIVATE$1 = `activate${EVENT_KEY$3}`;
5586
- const EVENT_CLICK = `click${EVENT_KEY$3}`;
5587
- const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
5406
+ const NAME$4 = 'scrollspy';
5407
+ const DATA_KEY$4 = 'bs.scrollspy';
5408
+ const EVENT_KEY$4 = `.${DATA_KEY$4}`;
5409
+ const DATA_API_KEY$2 = '.data-api';
5410
+ const EVENT_ACTIVATE$1 = `activate${EVENT_KEY$4}`;
5411
+ const EVENT_CLICK = `click${EVENT_KEY$4}`;
5412
+ const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$4}${DATA_API_KEY$2}`;
5588
5413
  const CLASS_NAME_DROPDOWN_ITEM$1 = 'dropdown-item';
5589
5414
  const CLASS_NAME_ACTIVE$2 = 'active';
5590
5415
  const SELECTOR_DATA_SPY$1 = '[data-bs-spy="scroll"]';
@@ -5596,7 +5421,7 @@
5596
5421
  const SELECTOR_LINK_ITEMS$1 = `${SELECTOR_NAV_LINKS$1}, ${SELECTOR_NAV_ITEMS$1} > ${SELECTOR_NAV_LINKS$1}, ${SELECTOR_LIST_ITEMS$1}`;
5597
5422
  const SELECTOR_DROPDOWN$1 = '.dropdown';
5598
5423
  const SELECTOR_DROPDOWN_TOGGLE$2 = '.dropdown-toggle';
5599
- const Default$2 = {
5424
+ const Default$3 = {
5600
5425
  offset: null,
5601
5426
  // TODO: v6 @deprecated, keep it for backwards compatibility reasons
5602
5427
  rootMargin: '0px 0px -25%',
@@ -5636,13 +5461,13 @@
5636
5461
 
5637
5462
  // Getters
5638
5463
  static get Default() {
5639
- return Default$2;
5464
+ return Default$3;
5640
5465
  }
5641
5466
  static get DefaultType() {
5642
5467
  return DefaultType$1;
5643
5468
  }
5644
5469
  static get NAME() {
5645
- return NAME$3;
5470
+ return NAME$4;
5646
5471
  }
5647
5472
 
5648
5473
  // Public
@@ -5666,7 +5491,7 @@
5666
5491
  // Private
5667
5492
  _configAfterMerge(config) {
5668
5493
  // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
5669
- config.target = getElement(config.target) || document.body;
5494
+ config.target = getElement$1(config.target) || document.body;
5670
5495
 
5671
5496
  // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
5672
5497
  config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
@@ -5752,11 +5577,11 @@
5752
5577
  if (!anchor.hash || isDisabled(anchor)) {
5753
5578
  continue;
5754
5579
  }
5755
- const observableSection = SelectorEngine.findOne(anchor.hash, this._element);
5580
+ const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);
5756
5581
 
5757
5582
  // ensure that the observableSection exists & is visible
5758
5583
  if (isVisible(observableSection)) {
5759
- this._targetLinks.set(anchor.hash, anchor);
5584
+ this._targetLinks.set(decodeURI(anchor.hash), anchor);
5760
5585
  this._observableSections.set(anchor.hash, observableSection);
5761
5586
  }
5762
5587
  }
@@ -5824,7 +5649,7 @@
5824
5649
  * jQuery
5825
5650
  */
5826
5651
 
5827
- defineJQueryPlugin(ScrollSpy$1);
5652
+ defineJQueryPlugin$1(ScrollSpy$1);
5828
5653
 
5829
5654
  /**
5830
5655
  * --------------------------------------------------------------------------
@@ -5890,30 +5715,123 @@
5890
5715
 
5891
5716
  /**
5892
5717
  * --------------------------------------------------------------------------
5893
- * Bootstrap (v5.1.3): scrollspy.js
5718
+ * Bootstrap (v5.2.3): util/index.js
5894
5719
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5895
5720
  * --------------------------------------------------------------------------
5896
5721
  */
5897
5722
 
5723
+ const getSelector = element => {
5724
+ let selector = element.getAttribute('data-bs-target');
5725
+ if (!selector || selector === '#') {
5726
+ let hrefAttribute = element.getAttribute('href');
5898
5727
 
5899
- /**
5900
- * ------------------------------------------------------------------------
5901
- * Constants
5902
- * ------------------------------------------------------------------------
5903
- */
5904
-
5905
- const NAME$2 = 'scrollspy';
5906
- const DATA_KEY$2 = 'bs.scrollspy';
5907
- const EVENT_KEY$2 = `.${DATA_KEY$2}`;
5908
- const DATA_API_KEY = '.data-api';
5909
- const Default$1 = {
5728
+ // The only valid content that could double as a selector are IDs or classes,
5729
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
5730
+ // `document.querySelector` will rightfully complain it is invalid.
5731
+ // See https://github.com/twbs/bootstrap/issues/32273
5732
+ if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {
5733
+ return null;
5734
+ }
5735
+
5736
+ // Just in case some CMS puts out a full URL with the anchor appended
5737
+ if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
5738
+ hrefAttribute = `#${hrefAttribute.split('#')[1]}`;
5739
+ }
5740
+ selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;
5741
+ }
5742
+ return selector;
5743
+ };
5744
+ const getSelectorFromElement = element => {
5745
+ const selector = getSelector(element);
5746
+ if (selector) {
5747
+ return document.querySelector(selector) ? selector : null;
5748
+ }
5749
+ return null;
5750
+ };
5751
+ const isElement = object => {
5752
+ if (!object || typeof object !== 'object') {
5753
+ return false;
5754
+ }
5755
+ if (typeof object.jquery !== 'undefined') {
5756
+ object = object[0];
5757
+ }
5758
+ return typeof object.nodeType !== 'undefined';
5759
+ };
5760
+ const getElement = object => {
5761
+ // it's a jQuery object or a node element
5762
+ if (isElement(object)) {
5763
+ return object.jquery ? object[0] : object;
5764
+ }
5765
+ if (typeof object === 'string' && object.length > 0) {
5766
+ return document.querySelector(object);
5767
+ }
5768
+ return null;
5769
+ };
5770
+ const getjQuery = () => {
5771
+ if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
5772
+ return window.jQuery;
5773
+ }
5774
+ return null;
5775
+ };
5776
+ const DOMContentLoadedCallbacks = [];
5777
+ const onDOMContentLoaded = callback => {
5778
+ if (document.readyState === 'loading') {
5779
+ // add listener on the first call when the document is in loading state
5780
+ if (!DOMContentLoadedCallbacks.length) {
5781
+ document.addEventListener('DOMContentLoaded', () => {
5782
+ for (const callback of DOMContentLoadedCallbacks) {
5783
+ callback();
5784
+ }
5785
+ });
5786
+ }
5787
+ DOMContentLoadedCallbacks.push(callback);
5788
+ } else {
5789
+ callback();
5790
+ }
5791
+ };
5792
+ const defineJQueryPlugin = plugin => {
5793
+ onDOMContentLoaded(() => {
5794
+ const $ = getjQuery();
5795
+ /* istanbul ignore if */
5796
+ if ($) {
5797
+ const name = plugin.NAME;
5798
+ const JQUERY_NO_CONFLICT = $.fn[name];
5799
+ $.fn[name] = plugin.jQueryInterface;
5800
+ $.fn[name].Constructor = plugin;
5801
+ $.fn[name].noConflict = () => {
5802
+ $.fn[name] = JQUERY_NO_CONFLICT;
5803
+ return plugin.jQueryInterface;
5804
+ };
5805
+ }
5806
+ });
5807
+ };
5808
+
5809
+ /**
5810
+ * --------------------------------------------------------------------------
5811
+ * Bootstrap (v5.1.3): scrollspy.js
5812
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5813
+ * --------------------------------------------------------------------------
5814
+ */
5815
+
5816
+
5817
+ /**
5818
+ * ------------------------------------------------------------------------
5819
+ * Constants
5820
+ * ------------------------------------------------------------------------
5821
+ */
5822
+
5823
+ const NAME$3 = 'scrollspy';
5824
+ const DATA_KEY$3 = 'bs.scrollspy';
5825
+ const EVENT_KEY$3 = `.${DATA_KEY$3}`;
5826
+ const DATA_API_KEY$1 = '.data-api';
5827
+ const Default$2 = {
5910
5828
  offset: 10,
5911
5829
  method: 'auto',
5912
5830
  target: ''
5913
5831
  };
5914
- const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
5915
- const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;
5916
- const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
5832
+ const EVENT_ACTIVATE = `activate${EVENT_KEY$3}`;
5833
+ const EVENT_SCROLL = `scroll${EVENT_KEY$3}`;
5834
+ const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
5917
5835
  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
5918
5836
  const CLASS_NAME_ACTIVE$1 = 'active';
5919
5837
  const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
@@ -5950,10 +5868,10 @@
5950
5868
  // Getters
5951
5869
 
5952
5870
  static get Default() {
5953
- return Default$1;
5871
+ return Default$2;
5954
5872
  }
5955
5873
  static get NAME() {
5956
- return NAME$2;
5874
+ return NAME$3;
5957
5875
  }
5958
5876
 
5959
5877
  // Public
@@ -5982,7 +5900,7 @@
5982
5900
  });
5983
5901
  }
5984
5902
  dispose() {
5985
- EventHandler.off(this._scrollElement, EVENT_KEY$2);
5903
+ EventHandler.off(this._scrollElement, EVENT_KEY$3);
5986
5904
  super.dispose();
5987
5905
  }
5988
5906
 
@@ -5990,7 +5908,7 @@
5990
5908
 
5991
5909
  _getConfig(config) {
5992
5910
  config = {
5993
- ...Default$1,
5911
+ ...Default$2,
5994
5912
  ...Manipulator.getDataAttributes(this._element),
5995
5913
  ...(typeof config === 'object' && config ? config : {})
5996
5914
  };
@@ -6097,7 +6015,7 @@
6097
6015
 
6098
6016
  /**
6099
6017
  * --------------------------------------------------------------------------
6100
- * Bootstrap (v5.2.3): tab.js
6018
+ * Bootstrap tab.js
6101
6019
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6102
6020
  * --------------------------------------------------------------------------
6103
6021
  */
@@ -6107,31 +6025,33 @@
6107
6025
  * Constants
6108
6026
  */
6109
6027
 
6110
- const NAME$1 = 'tab';
6111
- const DATA_KEY$1 = 'bs.tab';
6112
- const EVENT_KEY$1 = `.${DATA_KEY$1}`;
6113
- const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
6114
- const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
6115
- const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
6116
- const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
6117
- const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
6118
- const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
6119
- const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
6028
+ const NAME$2 = 'tab';
6029
+ const DATA_KEY$2 = 'bs.tab';
6030
+ const EVENT_KEY$2 = `.${DATA_KEY$2}`;
6031
+ const EVENT_HIDE$1 = `hide${EVENT_KEY$2}`;
6032
+ const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$2}`;
6033
+ const EVENT_SHOW$1 = `show${EVENT_KEY$2}`;
6034
+ const EVENT_SHOWN$1 = `shown${EVENT_KEY$2}`;
6035
+ const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$2}`;
6036
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY$2}`;
6037
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}`;
6120
6038
  const ARROW_LEFT_KEY = 'ArrowLeft';
6121
6039
  const ARROW_RIGHT_KEY = 'ArrowRight';
6122
6040
  const ARROW_UP_KEY = 'ArrowUp';
6123
6041
  const ARROW_DOWN_KEY = 'ArrowDown';
6042
+ const HOME_KEY = 'Home';
6043
+ const END_KEY = 'End';
6124
6044
  const CLASS_NAME_ACTIVE = 'active';
6125
6045
  const CLASS_NAME_FADE$1 = 'fade';
6126
6046
  const CLASS_NAME_SHOW$1 = 'show';
6127
6047
  const CLASS_DROPDOWN = 'dropdown';
6128
6048
  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
6129
6049
  const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';
6130
- const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)';
6050
+ const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;
6131
6051
  const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
6132
6052
  const SELECTOR_OUTER = '.nav-item, .list-group-item';
6133
6053
  const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
6134
- const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // todo:v6: could be only `tab`
6054
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]'; // TODO: could only be `tab` in v6
6135
6055
  const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
6136
6056
  const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
6137
6057
 
@@ -6145,7 +6065,7 @@
6145
6065
  this._parent = this._element.closest(SELECTOR_TAB_PANEL);
6146
6066
  if (!this._parent) {
6147
6067
  return;
6148
- // todo: should Throw exception on v6
6068
+ // TODO: should throw exception in v6
6149
6069
  // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
6150
6070
  }
6151
6071
 
@@ -6156,7 +6076,7 @@
6156
6076
 
6157
6077
  // Getters
6158
6078
  static get NAME() {
6159
- return NAME$1;
6079
+ return NAME$2;
6160
6080
  }
6161
6081
 
6162
6082
  // Public
@@ -6188,7 +6108,7 @@
6188
6108
  return;
6189
6109
  }
6190
6110
  element.classList.add(CLASS_NAME_ACTIVE);
6191
- this._activate(getElementFromSelector(element)); // Search and activate/show the proper section
6111
+ this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section
6192
6112
 
6193
6113
  const complete = () => {
6194
6114
  if (element.getAttribute('role') !== 'tab') {
@@ -6210,7 +6130,7 @@
6210
6130
  }
6211
6131
  element.classList.remove(CLASS_NAME_ACTIVE);
6212
6132
  element.blur();
6213
- this._deactivate(getElementFromSelector(element)); // Search and deactivate the shown section too
6133
+ this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too
6214
6134
 
6215
6135
  const complete = () => {
6216
6136
  if (element.getAttribute('role') !== 'tab') {
@@ -6227,13 +6147,19 @@
6227
6147
  this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
6228
6148
  }
6229
6149
  _keydown(event) {
6230
- if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) {
6150
+ if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {
6231
6151
  return;
6232
6152
  }
6233
6153
  event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page
6234
6154
  event.preventDefault();
6235
- const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
6236
- const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true);
6155
+ const children = this._getChildren().filter(element => !isDisabled(element));
6156
+ let nextActiveElement;
6157
+ if ([HOME_KEY, END_KEY].includes(event.key)) {
6158
+ nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];
6159
+ } else {
6160
+ const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
6161
+ nextActiveElement = getNextActiveElement(children, event.target, isNext, true);
6162
+ }
6237
6163
  if (nextActiveElement) {
6238
6164
  nextActiveElement.focus({
6239
6165
  preventScroll: true
@@ -6271,13 +6197,13 @@
6271
6197
  this._setInitialAttributesOnTargetPanel(child);
6272
6198
  }
6273
6199
  _setInitialAttributesOnTargetPanel(child) {
6274
- const target = getElementFromSelector(child);
6200
+ const target = SelectorEngine.getElementFromSelector(child);
6275
6201
  if (!target) {
6276
6202
  return;
6277
6203
  }
6278
6204
  this._setAttributeIfNotExists(target, 'role', 'tabpanel');
6279
6205
  if (child.id) {
6280
- this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`);
6206
+ this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);
6281
6207
  }
6282
6208
  }
6283
6209
  _toggleDropDown(element, open) {
@@ -6333,7 +6259,7 @@
6333
6259
  * Data API implementation
6334
6260
  */
6335
6261
 
6336
- EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
6262
+ EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE, function (event) {
6337
6263
  if (['A', 'AREA'].includes(this.tagName)) {
6338
6264
  event.preventDefault();
6339
6265
  }
@@ -6355,11 +6281,11 @@
6355
6281
  * jQuery
6356
6282
  */
6357
6283
 
6358
- defineJQueryPlugin(Tab);
6284
+ defineJQueryPlugin$1(Tab);
6359
6285
 
6360
6286
  /**
6361
6287
  * --------------------------------------------------------------------------
6362
- * Bootstrap (v5.2.3): toast.js
6288
+ * Bootstrap toast.js
6363
6289
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6364
6290
  * --------------------------------------------------------------------------
6365
6291
  */
@@ -6369,17 +6295,17 @@
6369
6295
  * Constants
6370
6296
  */
6371
6297
 
6372
- const NAME = 'toast';
6373
- const DATA_KEY = 'bs.toast';
6374
- const EVENT_KEY = `.${DATA_KEY}`;
6375
- const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
6376
- const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
6377
- const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
6378
- const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
6379
- const EVENT_HIDE = `hide${EVENT_KEY}`;
6380
- const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
6381
- const EVENT_SHOW = `show${EVENT_KEY}`;
6382
- const EVENT_SHOWN = `shown${EVENT_KEY}`;
6298
+ const NAME$1 = 'toast';
6299
+ const DATA_KEY$1 = 'bs.toast';
6300
+ const EVENT_KEY$1 = `.${DATA_KEY$1}`;
6301
+ const EVENT_MOUSEOVER = `mouseover${EVENT_KEY$1}`;
6302
+ const EVENT_MOUSEOUT = `mouseout${EVENT_KEY$1}`;
6303
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY$1}`;
6304
+ const EVENT_FOCUSOUT = `focusout${EVENT_KEY$1}`;
6305
+ const EVENT_HIDE = `hide${EVENT_KEY$1}`;
6306
+ const EVENT_HIDDEN = `hidden${EVENT_KEY$1}`;
6307
+ const EVENT_SHOW = `show${EVENT_KEY$1}`;
6308
+ const EVENT_SHOWN = `shown${EVENT_KEY$1}`;
6383
6309
  const CLASS_NAME_FADE = 'fade';
6384
6310
  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
6385
6311
  const CLASS_NAME_SHOW = 'show';
@@ -6389,7 +6315,7 @@
6389
6315
  autohide: 'boolean',
6390
6316
  delay: 'number'
6391
6317
  };
6392
- const Default = {
6318
+ const Default$1 = {
6393
6319
  animation: true,
6394
6320
  autohide: true,
6395
6321
  delay: 5000
@@ -6410,13 +6336,13 @@
6410
6336
 
6411
6337
  // Getters
6412
6338
  static get Default() {
6413
- return Default;
6339
+ return Default$1;
6414
6340
  }
6415
6341
  static get DefaultType() {
6416
6342
  return DefaultType;
6417
6343
  }
6418
6344
  static get NAME() {
6419
- return NAME;
6345
+ return NAME$1;
6420
6346
  }
6421
6347
 
6422
6348
  // Public
@@ -6539,7 +6465,223 @@
6539
6465
  * jQuery
6540
6466
  */
6541
6467
 
6542
- defineJQueryPlugin(Toast);
6468
+ defineJQueryPlugin$1(Toast);
6469
+
6470
+ class AccordionToggle {
6471
+ static isInitialized = false;
6472
+ constructor(buttonElement) {
6473
+ this.buttonElement = buttonElement;
6474
+ this.targetAccordionId = buttonElement.getAttribute("data-target");
6475
+ this.action = buttonElement.getAttribute("data-action");
6476
+ this.accordionElement = SelectorEngine.findOne(`#${this.targetAccordionId}`);
6477
+ this.accordionItems = SelectorEngine.find(".accordion-collapse", this.accordionElement);
6478
+ this.addEventListeners();
6479
+ }
6480
+ addEventListeners() {
6481
+ EventHandler.on(this.buttonElement, "click", event => this.handleAccordionAction(event));
6482
+ }
6483
+ handleAccordionAction(event) {
6484
+ const item = event.target;
6485
+ const action = item.getAttribute('data-action');
6486
+ const accordionItems = this.accordionItems;
6487
+ accordionItems.forEach(accordionItem => {
6488
+ const collapseInstance = Collapse.getOrCreateInstance(accordionItem, {
6489
+ toggle: false
6490
+ });
6491
+ if (action === 'expand') {
6492
+ collapseInstance.show();
6493
+ } else if (action === 'collapse') {
6494
+ collapseInstance.hide();
6495
+ }
6496
+ });
6497
+ }
6498
+ static init() {
6499
+ if (AccordionToggle.isInitialized) {
6500
+ return;
6501
+ }
6502
+ const toggleButtons = SelectorEngine.find('[data-action][data-target]');
6503
+ toggleButtons.forEach(buttonElement => new AccordionToggle(buttonElement));
6504
+ AccordionToggle.isInitialized = true;
6505
+ }
6506
+ }
6507
+
6508
+ /**
6509
+ * --------------------------------------------------------------------------
6510
+ * Bootstrap (v5.1.3): gallery.js
6511
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6512
+ * --------------------------------------------------------------------------
6513
+ */
6514
+
6515
+
6516
+ /**
6517
+ * ------------------------------------------------------------------------
6518
+ * Constants
6519
+ * ------------------------------------------------------------------------
6520
+ */
6521
+
6522
+ const Default = {};
6523
+ const NAME = 'gallery';
6524
+ const DATA_KEY = 'bs.gallery';
6525
+ const EVENT_KEY = `.${DATA_KEY}`;
6526
+ const DATA_API_KEY = '.data-api';
6527
+ const CAROUSEL_SELECTOR = '.carousel';
6528
+ const CAROUSEL_PAGER_SELECTOR = '.carousel-pager span';
6529
+ const CAROUSEL_ACTIVE_SELECTOR = '.carousel-item.active';
6530
+ const CAROUSEL_ITEM_SELECTOR = '.carousel-item';
6531
+ const THUMBNAIL_SELECTOR = '.bcl-gallery__grid a, .bcl-gallery__mobile-view-more';
6532
+ const MODAL_SELECTOR = '.modal';
6533
+ const EVENT_MODAL_HIDE = 'hide.bs.modal';
6534
+ const CAROUSEL_EVENT = 'slide.bs.carousel';
6535
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
6536
+
6537
+ /**
6538
+ * ------------------------------------------------------------------------
6539
+ * Class Definition
6540
+ * ------------------------------------------------------------------------
6541
+ */
6542
+
6543
+ class Gallery extends BaseComponent {
6544
+ constructor(element, config) {
6545
+ super(element, config);
6546
+ /* eslint no-underscore-dangle: ["error", { "allow": ["_element"] }] */
6547
+ this.carousel = SelectorEngine.findOne(CAROUSEL_SELECTOR, this._element);
6548
+ this.carouselPager = SelectorEngine.findOne(CAROUSEL_PAGER_SELECTOR, this._element);
6549
+ this.carouselStartIndex = element.getAttribute('data-gallery-start');
6550
+ this.carouselActiveItem = SelectorEngine.find(CAROUSEL_ITEM_SELECTOR, this.carousel)[this.carouselStartIndex];
6551
+ this.carouselPager.textContent = Number(this.carouselStartIndex) + 1;
6552
+ this.modal = SelectorEngine.findOne(MODAL_SELECTOR, this._element);
6553
+ this.addEventListeners();
6554
+ this.carouselLazyLoad(this.carouselActiveItem);
6555
+ }
6556
+
6557
+ // Getters
6558
+ static get NAME() {
6559
+ return NAME;
6560
+ }
6561
+
6562
+ // Public
6563
+ setSlide(event) {
6564
+ const slideFrom = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
6565
+ const slideTo = event.relatedTarget;
6566
+ this.carouselLazyLoad(slideTo);
6567
+ this.carouselPager.textContent = event.to + 1;
6568
+ this.stopVideo(slideFrom);
6569
+ }
6570
+ stopSlide() {
6571
+ const currentSlide = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
6572
+ this.stopVideo(currentSlide);
6573
+ }
6574
+ stopVideo(slide) {
6575
+ const iframe = SelectorEngine.findOne('iframe', slide);
6576
+ const video = SelectorEngine.findOne('video', slide);
6577
+ if (iframe) {
6578
+ iframe.src = iframe.dataset.src;
6579
+ } else if (video) {
6580
+ video.pause();
6581
+ }
6582
+ }
6583
+
6584
+ // Private
6585
+ carouselLazyLoad(slide) {
6586
+ const media = SelectorEngine.findOne('[data-src]', slide);
6587
+ if (media && !media.src) {
6588
+ media.src = media.dataset.src;
6589
+ }
6590
+ }
6591
+ addEventListeners() {
6592
+ EventHandler.on(this.carousel, CAROUSEL_EVENT, event => this.setSlide(event));
6593
+ EventHandler.on(this.modal, EVENT_MODAL_HIDE, event => this.stopSlide(event));
6594
+ }
6595
+
6596
+ // Static
6597
+ static get Default() {
6598
+ return Default;
6599
+ }
6600
+ static jQueryInterface(config) {
6601
+ return this.each(function jInterface() {
6602
+ const data = Gallery.getOrCreateInstance(this);
6603
+ if (typeof config !== 'string') {
6604
+ return;
6605
+ }
6606
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
6607
+ throw new TypeError(`No method named "${config}"`);
6608
+ }
6609
+ data[config](this);
6610
+ });
6611
+ }
6612
+ }
6613
+
6614
+ /**
6615
+ * ------------------------------------------------------------------------
6616
+ * Data Api implementation
6617
+ * ------------------------------------------------------------------------
6618
+ */
6619
+
6620
+ EventHandler.on(document, EVENT_CLICK_DATA_API, THUMBNAIL_SELECTOR, event => {
6621
+ const gallery = event.target.closest('div.bcl-gallery');
6622
+ const firstSlide = event.target.parentNode.getAttribute('data-bs-slide-to');
6623
+ gallery.dataset.galleryStart = firstSlide;
6624
+ Gallery.getOrCreateInstance(gallery);
6625
+ });
6626
+
6627
+ /**
6628
+ * ------------------------------------------------------------------------
6629
+ * jQuery
6630
+ * ------------------------------------------------------------------------
6631
+ * add .gallery to jQuery only if jQuery is present
6632
+ */
6633
+
6634
+ defineJQueryPlugin$1(Gallery);
6635
+
6636
+ /**
6637
+ * AccessibleToggle enhances Bootstrap Modal and Offcanvas components by:
6638
+ * - Adding ARIA attributes for improved accessibility.
6639
+ * - Updating `aria-expanded` on trigger elements based on visibility.
6640
+ * Automatically initializes all modal and offcanvas triggers on the page.
6641
+ */
6642
+ class AccessibleToggle {
6643
+ constructor(triggerElement, type) {
6644
+ this.triggerElement = triggerElement;
6645
+ this.type = type;
6646
+ const target = triggerElement.getAttribute("data-bs-target") || triggerElement.getAttribute("href");
6647
+ if (!target || target === "#") {
6648
+ return;
6649
+ }
6650
+ this.targetElement = SelectorEngine.findOne(target);
6651
+ if (!this.targetElement) {
6652
+ return;
6653
+ }
6654
+ if (this.type === "modal") {
6655
+ this.instance = Modal.getOrCreateInstance(this.targetElement);
6656
+ } else if (this.type === "offcanvas") {
6657
+ this.instance = Offcanvas.getOrCreateInstance(this.targetElement);
6658
+ }
6659
+ this.addAriaAttributes();
6660
+ this.addEventListeners();
6661
+ }
6662
+ addAriaAttributes() {
6663
+ if (this.triggerElement) {
6664
+ this.triggerElement.setAttribute("aria-haspopup", "true");
6665
+ this.triggerElement.setAttribute("aria-expanded", "false");
6666
+ }
6667
+ }
6668
+ addEventListeners() {
6669
+ const showEvent = this.type === "modal" ? "show.bs.modal" : "show.bs.offcanvas";
6670
+ const hideEvent = this.type === "modal" ? "hide.bs.modal" : "hide.bs.offcanvas";
6671
+ EventHandler.on(this.targetElement, showEvent, () => {
6672
+ this.triggerElement.setAttribute("aria-expanded", "true");
6673
+ });
6674
+ EventHandler.on(this.targetElement, hideEvent, () => {
6675
+ this.triggerElement.setAttribute("aria-expanded", "false");
6676
+ });
6677
+ }
6678
+ static init(toggles) {
6679
+ toggles.forEach(toggle => {
6680
+ const triggerElements = SelectorEngine.find(toggle.selector);
6681
+ triggerElements.forEach(triggerElement => new AccessibleToggle(triggerElement, toggle.type));
6682
+ });
6683
+ }
6684
+ }
6543
6685
 
6544
6686
  /**
6545
6687
  * --------------------------------------------------------------------------
@@ -6554,16 +6696,17 @@
6554
6696
  Carousel,
6555
6697
  Collapse,
6556
6698
  Dropdown,
6557
- Gallery,
6558
6699
  Modal,
6559
- AccessibleToggle,
6560
6700
  Offcanvas,
6561
6701
  Popover,
6562
6702
  ScrollSpyV2: ScrollSpy$1,
6563
6703
  ScrollSpy,
6564
6704
  Tab,
6565
6705
  Toast,
6566
- Tooltip
6706
+ Tooltip,
6707
+ Gallery,
6708
+ AccessibleToggle,
6709
+ AccordionToggle
6567
6710
  };
6568
6711
 
6569
6712
  return index_umd;