@openeuropa/bcl-theme-default 1.9.2 → 1.10.1

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/oe-bcl-ckeditor5.min.css +1 -1
  2. package/css/oe-bcl-ckeditor5.min.css.map +1 -1
  3. package/css/oe-bcl-default.css +896 -1
  4. package/css/oe-bcl-default.css.map +1 -1
  5. package/css/oe-bcl-default.min.css +1 -1
  6. package/css/oe-bcl-default.min.css.map +1 -1
  7. package/js/oe-bcl-default.bundle.js +107 -60
  8. package/js/oe-bcl-default.bundle.js.map +1 -1
  9. package/js/oe-bcl-default.bundle.min.js +1 -1
  10. package/js/oe-bcl-default.bundle.min.js.map +1 -1
  11. package/js/oe-bcl-default.esm.js +107 -60
  12. package/js/oe-bcl-default.esm.js.map +1 -1
  13. package/js/oe-bcl-default.esm.min.js +1 -1
  14. package/js/oe-bcl-default.esm.min.js.map +1 -1
  15. package/js/oe-bcl-default.umd.js +107 -60
  16. package/js/oe-bcl-default.umd.js.map +1 -1
  17. package/js/oe-bcl-default.umd.min.js +1 -1
  18. package/js/oe-bcl-default.umd.min.js.map +1 -1
  19. package/package.json +8 -7
  20. package/src/js/accessible-toggle/accessible-toggle.js +11 -3
  21. package/src/js/gallery/gallery.js +118 -62
  22. package/src/scss/_accordion.scss +4 -0
  23. package/src/scss/_multiselect-2.scss +1 -1
  24. package/src/scss/_multiselect.scss +21 -0
  25. package/src/scss/_timeline.scss +2 -0
  26. package/src/scss/base/_variables.scss +2 -3
  27. package/templates/bcl-accordion/accordion.html.twig +8 -3
  28. package/templates/bcl-dropdown/dropdown.html.twig +1 -1
  29. package/templates/bcl-file/file-translations.html.twig +2 -2
  30. package/templates/bcl-gallery/gallery-item.html.twig +1 -0
  31. package/templates/bcl-gallery/gallery.html.twig +2 -2
  32. package/templates/bcl-inpage-navigation/inpage-navigation.html.twig +4 -4
  33. package/templates/bcl-language-switcher/language-switcher.html.twig +2 -2
  34. package/templates/bcl-modal/modal.html.twig +2 -2
  35. package/templates/bcl-timeline/timeline.html.twig +2 -2
@@ -3369,7 +3369,7 @@
3369
3369
  const EVENT_SHOW$5 = `show${EVENT_KEY$8}`;
3370
3370
  const EVENT_SHOWN$5 = `shown${EVENT_KEY$8}`;
3371
3371
  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
3372
- const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$5}`;
3372
+ const EVENT_KEYDOWN_DATA_API$1 = `keydown${EVENT_KEY$8}${DATA_API_KEY$5}`;
3373
3373
  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$5}`;
3374
3374
  const CLASS_NAME_SHOW$6 = 'show';
3375
3375
  const CLASS_NAME_DROPUP = 'dropup';
@@ -3695,8 +3695,8 @@
3695
3695
  * Data API implementation
3696
3696
  */
3697
3697
 
3698
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
3699
- EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
3698
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API$1, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
3699
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API$1, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
3700
3700
  EventHandler.on(document, EVENT_CLICK_DATA_API$4, Dropdown.clearMenus);
3701
3701
  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
3702
3702
  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$3, function (event) {
@@ -6507,23 +6507,16 @@
6507
6507
 
6508
6508
  /**
6509
6509
  * --------------------------------------------------------------------------
6510
- * Bootstrap (v5.1.3): gallery.js
6510
+ * Bootstrap (v5.1.3): gallery.js (Refactored)
6511
6511
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
6512
6512
  * --------------------------------------------------------------------------
6513
6513
  */
6514
6514
 
6515
-
6516
- /**
6517
- * ------------------------------------------------------------------------
6518
- * Constants
6519
- * ------------------------------------------------------------------------
6520
- */
6521
-
6522
- const Default = {};
6523
6515
  const NAME = 'gallery';
6524
6516
  const DATA_KEY = 'bs.gallery';
6525
6517
  const EVENT_KEY = `.${DATA_KEY}`;
6526
6518
  const DATA_API_KEY = '.data-api';
6519
+ const Default = {};
6527
6520
  const CAROUSEL_SELECTOR = '.carousel';
6528
6521
  const CAROUSEL_PAGER_SELECTOR = '.carousel-pager span';
6529
6522
  const CAROUSEL_ACTIVE_SELECTOR = '.carousel-item.active';
@@ -6533,72 +6526,115 @@
6533
6526
  const EVENT_MODAL_HIDE = 'hide.bs.modal';
6534
6527
  const CAROUSEL_EVENT = 'slide.bs.carousel';
6535
6528
  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
6536
-
6537
- /**
6538
- * ------------------------------------------------------------------------
6539
- * Class Definition
6540
- * ------------------------------------------------------------------------
6541
- */
6542
-
6529
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
6543
6530
  class Gallery extends BaseComponent {
6544
6531
  constructor(element, config) {
6545
6532
  super(element, config);
6546
- /* eslint no-underscore-dangle: ["error", { "allow": ["_element"] }] */
6547
6533
  this.carousel = SelectorEngine.findOne(CAROUSEL_SELECTOR, this._element);
6548
6534
  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
6535
  this.modal = SelectorEngine.findOne(MODAL_SELECTOR, this._element);
6553
- this.addEventListeners();
6554
- this.carouselLazyLoad(this.carouselActiveItem);
6536
+ this.carouselStartIndex = element.getAttribute('data-gallery-start') || 0;
6537
+ const allCarouselItems = SelectorEngine.find(CAROUSEL_ITEM_SELECTOR, this.carousel);
6538
+ const startIndexNum = Math.max(0, Math.min(Number(this.carouselStartIndex), allCarouselItems.length - 1));
6539
+ this.carouselPager.textContent = startIndexNum + 1;
6540
+ this.carouselActiveItem = allCarouselItems[startIndexNum];
6541
+ this._carouselLazyLoad(this.carouselActiveItem);
6542
+ EventHandler.on(this.carousel, CAROUSEL_EVENT, event => this._handleCarouselSlide(event));
6543
+ EventHandler.on(this.modal, EVENT_MODAL_HIDE, () => this._stopSlide());
6555
6544
  }
6556
6545
 
6557
6546
  // Getters
6558
6547
  static get NAME() {
6559
6548
  return NAME;
6560
6549
  }
6550
+ static get Default() {
6551
+ return Default;
6552
+ }
6561
6553
 
6562
- // Public
6563
- setSlide(event) {
6564
- const slideFrom = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
6565
- const slideTo = event.relatedTarget;
6566
- this.carouselLazyLoad(slideTo);
6554
+ /**
6555
+ * Handle the carousel "slide.bs.carousel" event
6556
+ * @param {Event} event
6557
+ */
6558
+ _handleCarouselSlide(event) {
6559
+ const previousSlide = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
6560
+ const currentSlide = event.relatedTarget;
6561
+ this._carouselLazyLoad(currentSlide);
6567
6562
  this.carouselPager.textContent = event.to + 1;
6568
- this.stopVideo(slideFrom);
6563
+ this._stopVideo(previousSlide);
6569
6564
  }
6570
- stopSlide() {
6565
+
6566
+ /**
6567
+ * Stop the current carousel slide (when modal hides or component is disposed)
6568
+ */
6569
+ _stopSlide() {
6571
6570
  const currentSlide = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this.carousel);
6572
- this.stopVideo(currentSlide);
6571
+ this._stopVideo(currentSlide);
6573
6572
  }
6574
- stopVideo(slide) {
6573
+
6574
+ /**
6575
+ * Stop any video or iframe in the given slide
6576
+ * @param {HTMLElement} slide
6577
+ */
6578
+ _stopVideo(slide) {
6579
+ if (!slide) {
6580
+ return;
6581
+ }
6575
6582
  const iframe = SelectorEngine.findOne('iframe', slide);
6576
6583
  const video = SelectorEngine.findOne('video', slide);
6577
- if (iframe) {
6584
+ if (iframe && iframe.dataset.src) {
6578
6585
  iframe.src = iframe.dataset.src;
6579
6586
  } else if (video) {
6580
6587
  video.pause();
6581
6588
  }
6582
6589
  }
6583
6590
 
6584
- // Private
6585
- carouselLazyLoad(slide) {
6591
+ /**
6592
+ * Lazy load media (img, iframe, video, etc.) by copying data-src into src
6593
+ * @param {HTMLElement} slide
6594
+ */
6595
+ _carouselLazyLoad(slide) {
6596
+ if (!slide) {
6597
+ return;
6598
+ }
6586
6599
  const media = SelectorEngine.findOne('[data-src]', slide);
6587
6600
  if (media && !media.src) {
6588
6601
  media.src = media.dataset.src;
6589
6602
  }
6590
6603
  }
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
6604
 
6596
- // Static
6597
- static get Default() {
6598
- return Default;
6605
+ /**
6606
+ * Internal helper to open the modal and jump to a specific slide
6607
+ * @param {HTMLElement} gallery
6608
+ * @param {HTMLElement} targetLink
6609
+ */
6610
+ static _openModalAndShowSlide(gallery, targetLink) {
6611
+ if (!gallery || !targetLink) {
6612
+ return;
6613
+ }
6614
+ const firstSlide = Number(targetLink.getAttribute('data-bs-slide-to') || 0);
6615
+ gallery.dataset.galleryStart = firstSlide;
6616
+ const instance = Gallery.getOrCreateInstance(gallery);
6617
+ const overlay = SelectorEngine.findOne('.bcl-gallery__item-overlay', targetLink);
6618
+ if (overlay) {
6619
+ const modalId = overlay.getAttribute('data-bs-target');
6620
+ const modalElement = document.querySelector(modalId);
6621
+ if (modalElement) {
6622
+ const modal = bootstrap.Modal.getOrCreateInstance(modalElement);
6623
+ modal.show();
6624
+ }
6625
+ }
6626
+ setTimeout(() => {
6627
+ const carousel = SelectorEngine.findOne(CAROUSEL_SELECTOR, instance._element);
6628
+ const carouselInstance = bootstrap.Carousel.getOrCreateInstance(carousel);
6629
+ carouselInstance.to(firstSlide);
6630
+ const pager = SelectorEngine.findOne(CAROUSEL_PAGER_SELECTOR, instance._element);
6631
+ if (pager) {
6632
+ pager.textContent = firstSlide + 1;
6633
+ }
6634
+ }, 50);
6599
6635
  }
6600
6636
  static jQueryInterface(config) {
6601
- return this.each(function jInterface() {
6637
+ return this.each(function () {
6602
6638
  const data = Gallery.getOrCreateInstance(this);
6603
6639
  if (typeof config !== 'string') {
6604
6640
  return;
@@ -6613,24 +6649,28 @@
6613
6649
 
6614
6650
  /**
6615
6651
  * ------------------------------------------------------------------------
6616
- * Data Api implementation
6652
+ * Data API implementation
6617
6653
  * ------------------------------------------------------------------------
6618
6654
  */
6619
6655
 
6656
+ const isEnterOrSpace = event => {
6657
+ return event.key === 'Enter' || event.key === ' ';
6658
+ };
6620
6659
  EventHandler.on(document, EVENT_CLICK_DATA_API, THUMBNAIL_SELECTOR, event => {
6660
+ event.preventDefault();
6661
+ const targetLink = event.target.closest('a');
6621
6662
  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);
6663
+ Gallery._openModalAndShowSlide(gallery, targetLink);
6664
+ });
6665
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, THUMBNAIL_SELECTOR, event => {
6666
+ if (!isEnterOrSpace(event)) {
6667
+ return;
6668
+ }
6669
+ event.preventDefault();
6670
+ const targetLink = event.target.closest('a');
6671
+ const gallery = event.target.closest('div.bcl-gallery');
6672
+ Gallery._openModalAndShowSlide(gallery, targetLink);
6625
6673
  });
6626
-
6627
- /**
6628
- * ------------------------------------------------------------------------
6629
- * jQuery
6630
- * ------------------------------------------------------------------------
6631
- * add .gallery to jQuery only if jQuery is present
6632
- */
6633
-
6634
6674
  defineJQueryPlugin$1(Gallery);
6635
6675
 
6636
6676
  /**
@@ -6660,9 +6700,16 @@
6660
6700
  this.addEventListeners();
6661
6701
  }
6662
6702
  addAriaAttributes() {
6663
- if (this.triggerElement) {
6664
- this.triggerElement.setAttribute("aria-haspopup", "true");
6665
- this.triggerElement.setAttribute("aria-expanded", "false");
6703
+ if (this.type === 'modal') {
6704
+ if (this.triggerElement) {
6705
+ this.triggerElement.setAttribute('aria-haspopup', 'dialog');
6706
+ }
6707
+ }
6708
+ if (this.type === 'offcanvas') {
6709
+ if (this.triggerElement) {
6710
+ this.triggerElement.setAttribute('aria-haspopup', 'dialog');
6711
+ this.triggerElement.setAttribute('aria-expanded', 'false');
6712
+ }
6666
6713
  }
6667
6714
  }
6668
6715
  addEventListeners() {