{"version":3,"file":"media-gallery-9dfe6104.js","sources":["../../../../src/scripts/modules/media-gallery.ts"],"sourcesContent":["import { Component } from '@verndale/core';\nimport Swiper, { Navigation, Keyboard } from 'swiper';\nimport 'swiper/css/bundle';\nimport figure from './figure';\nimport {\n  disableBodyScroll,\n  clearAllBodyScrollLocks,\n  BodyScrollOptions\n} from 'body-scroll-lock';\nimport { FocusTrap, createFocusTrap } from 'focus-trap';\nimport { ExtendedWindowType } from '../helpers/global-types';\n\nclass MediaGallery extends Component {\n  private gallerySwiper: Swiper | null = null;\n  private galleryItems: HTMLElement[] | undefined;\n  private resizeTimeout: NodeJS.Timeout | null | undefined;\n  private galleryIndex: number | undefined;\n  private galleryItemsLastIndex: number | undefined;\n  private videoFigure: figure | undefined;\n  private firstSlideFlag = true;\n  private focusTrap: FocusTrap | undefined;\n\n  constructor(el: HTMLElement) {\n    super(el);\n    this.videoFigure = new figure(this.dom.figureContainer as HTMLElement);\n    this.gallerySwiper = null;\n    this.initSwiper();\n    this.handleResize();\n    this.updateSwiper();\n    this.setPreviewThumbnails();\n  }\n\n  setupDefaults() {\n    this.dom = {\n      el: this.el,\n      swiper: this.el.querySelector<HTMLElement>(\n        '.media-gallery__swiper-container'\n      ),\n      modal: this.el.querySelector<HTMLElement>('#media-gallery__modal'),\n      modalImage: this.el.querySelector<HTMLElement>(\n        '.media-gallery__modal-image'\n      ),\n      modalCaption: this.el.querySelector<HTMLElement>(\n        '.media-gallery__modal-caption'\n      ),\n      nextArrow: this.el.querySelector<HTMLElement>('.swiper-button-next'),\n      prevArrow: this.el.querySelector<HTMLElement>('.swiper-button-prev'),\n      galleryItems: this.el.querySelectorAll('.gallery-item'),\n      galleryVideoItems: this.el.querySelectorAll(\n        '.media-gallery__video-item .figure__media-button'\n      ),\n      closeBtn: this.el.querySelector<HTMLElement>('.media-gallery__close'),\n      imagePreviewRow: this.el.querySelector<HTMLElement>(\n        '.media-gallery__image-preview-row'\n      ),\n      imagePreviews: this.el.querySelectorAll<HTMLElement>(\n        '.media-gallery__image-preview'\n      ),\n      figureContainer: this.el.querySelector<HTMLElement>(\n        '.figure__container--modal'\n      ),\n      swiperSlides: this.el.querySelectorAll<HTMLElement>('.swiper-slide')\n    };\n\n    this.setGalleryItems();\n  }\n\n  addListeners() {\n    //Show modal on gallery-item click\n    this.galleryItems?.forEach((item, index) => {\n      item.addEventListener('click', () => {\n        this.showItemInModal(item, index);\n      });\n    });\n\n    // Close modal on close button click\n    (this.dom.closeBtn as HTMLElement).addEventListener('click', () => {\n      this.handleCloseModal();\n    });\n\n    // Close modal when pressing ESC key\n    document.addEventListener('keydown', (event: KeyboardEvent) => {\n      if (event.key === 'Escape') {\n        this.handleCloseModal();\n      }\n    });\n\n    // Close modal on overlay click\n    if (this.dom.modal) {\n      (this.dom.modal as HTMLElement).addEventListener(\n        'click',\n        (event: MouseEvent) => {\n          if (event.target === this.dom.modal) {\n            this.handleCloseModal();\n          }\n        }\n      );\n    }\n\n    //Close the modal when the user clicks on .media-gallery__modal-content\n    const modalContent = this.el.querySelector(\n      '.media-gallery__modal-content'\n    ) as HTMLElement;\n    modalContent?.addEventListener('click', () => {\n      this.handleCloseModal();\n    });\n\n    // Image Preview Functionality\n    (this.dom.imagePreviews as NodeListOf<HTMLElement>).forEach(\n      (preview, index) => {\n        this.handlePreviewImage(preview, index);\n      }\n    );\n\n    // Handle next and prev arrow clicks\n    (this.dom.nextArrow as HTMLButtonElement)?.addEventListener(\n      'click',\n      this.handleNextArrowClick.bind(this)\n    );\n\n    (this.dom.prevArrow as HTMLButtonElement)?.addEventListener(\n      'click',\n      this.handlePrevArrowClick.bind(this)\n    );\n  }\n\n  initSwiper() {\n    Swiper.use([Navigation, Keyboard]);\n    this.setGalleryItems();\n    let desktopOffSetWidth = 0;\n    if (this.galleryItems) {\n      if (this.galleryItems.length < 6) {\n        desktopOffSetWidth = (this.dom.swiper as HTMLElement).offsetWidth * -1;\n      }\n      if (this.galleryItems.length == 6) {\n        desktopOffSetWidth = -20;\n      }\n\n      if (this.galleryItems.length >= 7) {\n        if (this.galleryItems.length % 2 == 0) {\n          desktopOffSetWidth =\n            ((this.galleryItems?.length - 4) / 2) *\n              ((this.dom.swiper as HTMLElement).offsetWidth / 4) *\n              -1 -\n            this.galleryItems?.length * 4;\n        } else {\n          desktopOffSetWidth =\n            ((this.galleryItems?.length - 3) / 2) *\n              ((this.dom.swiper as HTMLElement).offsetWidth / 4) *\n              -1 -\n            this.galleryItems?.length * 4;\n        }\n      }\n    }\n\n    const slides = this.dom.swiperSlides as NodeListOf<HTMLElement>;\n\n    const hideNotActiveSlides = () => {\n      slides.forEach(slide => {\n        const button = slide.querySelector('button') as HTMLButtonElement;\n\n        if (slide.classList.contains('swiper-slide-visible')) {\n          button.tabIndex = 0;\n        } else {\n          button.tabIndex = -1;\n        }\n      });\n    };\n\n    this.gallerySwiper = new Swiper(this.dom.swiper as HTMLElement, {\n      slidesPerView: 1,\n      spaceBetween: 8,\n      roundLengths: true,\n      navigation: {\n        nextEl: this.dom.nextArrow as HTMLElement,\n        prevEl: this.dom.prevArrow as HTMLElement\n      },\n      watchOverflow: true,\n      breakpoints: {\n        [768]: {\n          slidesPerView: 4,\n          slidesPerGroup: 1,\n          spaceBetween: 32,\n          grid: {\n            rows: 2\n          },\n          slidesOffsetAfter: desktopOffSetWidth,\n          watchSlidesProgress: true\n        }\n      },\n      keyboard: {\n        enabled: true,\n        onlyInViewport: true\n      },\n      on: {\n        afterInit: () => {\n          setTimeout(() => {\n            hideNotActiveSlides();\n          }, 250);\n        },\n        slideChangeTransitionEnd: hideNotActiveSlides\n      }\n    });\n  }\n\n  updateSwiper() {\n    if (this.gallerySwiper) {\n      this.gallerySwiper.destroy?.();\n\n      //then reinitialize the swiper gallery\n      this.initSwiper();\n    }\n    if (window.innerWidth >= 768) {\n      const nodeList = this.dom.galleryItems as NodeListOf<HTMLElement>;\n      const firstElement = nodeList[0] as HTMLElement;\n      const secondElement = nodeList[1] as HTMLElement;\n      const secondElementWidth = secondElement.clientWidth;\n      const firstElementDesiredWidth = secondElementWidth * 2 + 32;\n      const sliderElementDesiredHeight = secondElementWidth * 2 + 40;\n      const desiredSliderWidth = `${sliderElementDesiredHeight}px`;\n\n      //Get the parent element of the firstElement\n      const parentElement = firstElement.parentNode as HTMLElement;\n\n      //Get slider element\n      const sliderElement = parentElement.parentNode as HTMLElement;\n      sliderElement.style.height = desiredSliderWidth;\n\n      // change the parent node width to the FirstElementDesiredWidth\n      const desiredWidth = `${firstElementDesiredWidth}px`;\n\n      parentElement.style.width = desiredWidth;\n      parentElement.style.height = desiredWidth;\n    }\n  }\n\n  showItemInModal(item: HTMLElement, index: number) {\n    // if the this.el contains the class experience-editor then return\n    if (this.el.classList.contains('experience-editor')) {\n      return;\n    }\n    const modal = this.dom.modal as HTMLElement;\n    const modalImage = this.dom.modalImage as HTMLImageElement;\n    const modalCaption = this.dom.modalCaption as HTMLElement;\n    const videoModalBackdrop = modal.querySelector(\n      '.video-modal__backdrop'\n    ) as HTMLElement;\n    this.galleryIndex = index;\n    this.setGalleryItems();\n\n    document.body.classList.add('media-gallery__modal-opened');\n\n    if (this.galleryItems) {\n      this.galleryItemsLastIndex = this.galleryItems.length - 1;\n    }\n\n    if (modal) {\n      const options = {\n        reserveScrollBarGap: true,\n        allowTouchMove: (el: HTMLElement) => {\n          return el.closest('.media-gallery__modal') !== null;\n        }\n      } as BodyScrollOptions;\n\n      this.focusTrap = createFocusTrap(modal, {\n        clickOutsideDeactivates: true,\n        returnFocusOnDeactivate: true,\n        onActivate() {\n          disableBodyScroll(modal, options);\n        },\n        onDeactivate() {\n          clearAllBodyScrollLocks();\n        }\n      });\n\n      modal.classList.remove('media-gallery__modal-close');\n      modal.classList.add('media-gallery__modal-open');\n\n      this.focusTrap?.activate();\n\n      const parent = item.closest(\n        '.media-gallery__swiper-slide'\n      ) as HTMLElement;\n\n      const figure = parent.querySelector('.figure') as HTMLElement;\n\n      if (figure) {\n        // Is a video element\n        modalImage.classList.add('media-gallery__modal-image--disabled');\n        const trigger = figure;\n        videoModalBackdrop?.classList.remove(\n          'media-gallery__modal-video--disabled'\n        );\n        this.setVideoModalData(trigger);\n      } else {\n        // Is an image element\n        videoModalBackdrop?.classList.add(\n          'media-gallery__modal-video--disabled'\n        );\n        modalImage.classList.remove('media-gallery__modal-image--disabled');\n        const image = parent.querySelector('img') as HTMLImageElement;\n        modalImage.src = image.src;\n      }\n\n      const caption = parent.querySelector('.media-gallery__image-caption');\n\n      modalCaption.textContent = caption?.textContent ?? null;\n      (this.dom.nextArrow as HTMLElement).classList.remove(\n        'swiper-button-lock'\n      );\n      (this.dom.prevArrow as HTMLElement).classList.remove(\n        'swiper-button-lock'\n      );\n\n      if (index === 0) {\n        (this.dom.prevArrow as HTMLElement).classList.add(\n          'swiper-button-disabled'\n        );\n      } else {\n        (this.dom.prevArrow as HTMLElement).classList.remove(\n          'swiper-button-disabled'\n        );\n      }\n\n      //set focus to modal, element .media-gallery__modal-image\n      modalImage.focus();\n\n      //add the class .arrow-over-modal to the next and prev buttons\n      (this.dom.nextArrow as HTMLElement).classList.add('arrow-over-modal');\n      (this.dom.prevArrow as HTMLElement).classList.add('arrow-over-modal');\n    }\n\n    if (\n      (this.galleryIndex as number) === (this.galleryItemsLastIndex as number)\n    ) {\n      (this.dom.nextArrow as HTMLElement).classList.add(\n        'swiper-button-disabled'\n      );\n    } else {\n      (this.dom.nextArrow as HTMLElement).classList.remove(\n        'swiper-button-disabled'\n      );\n      (this.dom.nextArrow as HTMLElement).removeAttribute('disabled');\n      (this.dom.prevArrow as HTMLElement).removeAttribute('disabled');\n    }\n\n    (window as ExtendedWindowType).dataLayer.push({\n      event: 'media_gallery',\n      event_category: 'project profiles',\n      event_action: 'media gallery open',\n      event_label: '',\n      event_attributes: {\n        gallery_type: 'popover',\n        thumbnail_count: index + 1\n      }\n    });\n  }\n\n  setVideoModalData(trigger: HTMLElement | null) {\n    const videoId = trigger?.getAttribute('data-url');\n    if (trigger) {\n      const videoDataset = trigger?.dataset as DOMStringMap;\n      videoDataset.videoPlayerPlay = videoDataset.videoPlayerPlay?.replace(\n        '{videoName}',\n        'other'\n      );\n    }\n    this.videoFigure?.handleReplaceId(videoId as string);\n  }\n\n  setGalleryItems() {\n    const figureGalleryItems = Array.from(\n      this.dom.swiperSlides as NodeListOf<HTMLElement>\n    );\n\n    this.galleryItems = figureGalleryItems;\n    return this.galleryItems;\n  }\n\n  setNoActivePreview() {\n    const activePreview = this.el.querySelector(\n      '.media-gallery__image-preview.active'\n    ) as HTMLElement;\n    activePreview?.classList.remove('active');\n  }\n\n  setPreviewThumbnails() {\n    this.setGalleryItems();\n\n    const imagePreviewRow = this.dom.imagePreviewRow as HTMLElement;\n    if (this.galleryItems) {\n      this.galleryItems?.forEach((item, index) => {\n        const div = document.createElement('div');\n        const preview = document.createElement('img');\n        div.classList.add('media-gallery__image-preview');\n        div.setAttribute('data-index', index.toString());\n\n        if (item.classList.contains('figure__media-button')) {\n          // Is a video element\n          const videoThumbnail =\n            item?.previousElementSibling?.querySelector('img');\n          preview.src = (videoThumbnail as HTMLImageElement).src;\n          preview.alt = (videoThumbnail as HTMLImageElement).alt;\n          preview.loading = 'lazy';\n          preview.width = 65;\n          preview.height = 65;\n          div.classList.add('media-gallery__image-preview--video');\n          preview.setAttribute('data-index', index.toString());\n        } else {\n          // Is an image element\n          preview.src = (item as HTMLImageElement).querySelector('img')\n            ?.src as string;\n          preview.alt = (item as HTMLImageElement).querySelector('img')\n            ?.alt as string;\n          preview.loading = 'lazy';\n          preview.width = 65;\n          preview.height = 65;\n          preview.setAttribute('data-index', index.toString());\n        }\n\n        if (index === 0) {\n          //add the active class to the first preview\n          div.classList.add('active');\n        }\n\n        div.appendChild(preview);\n        imagePreviewRow.appendChild(div);\n      });\n    }\n\n    this.galleryItems?.forEach((_item, index) => {\n      const preview = imagePreviewRow.children[index] as HTMLElement;\n      this.handlePreviewImage(preview, index);\n    });\n  }\n\n  handleResize() {\n    window.addEventListener('resize', () => {\n      if (this.resizeTimeout) {\n        clearTimeout(this.resizeTimeout);\n      }\n\n      this.resizeTimeout = setTimeout(() => {\n        this.updateSwiper();\n      }, 300);\n    });\n  }\n\n  handlePreviewImage(preview: HTMLElement, index: number) {\n    preview.addEventListener('click', () => {\n      if (!preview.classList.contains('active')) {\n        const activePreview = this.el.querySelector(\n          '.media-gallery__image-preview.active'\n        ) as HTMLElement;\n        activePreview?.classList.remove('active');\n        preview.classList.add('active');\n        if (this.gallerySwiper) {\n          this.gallerySwiper.slideTo(index);\n        }\n      }\n    });\n  }\n\n  handleCloseModal() {\n    this.focusTrap?.deactivate();\n    this.pauseVideoInSlide(this.galleryIndex);\n    this.setGalleryItems();\n    if (this.galleryItems) {\n      this.galleryItemsLastIndex = this.galleryItems.length - 1;\n    }\n\n    if (this.dom.modal) {\n      (this.dom.modal as HTMLElement).classList.remove(\n        'media-gallery__modal-open'\n      );\n      (this.dom.modal as HTMLElement).classList.add(\n        'media-gallery__modal-close'\n      );\n    }\n\n    this.gallerySwiper?.enable();\n    this.updateSwiper();\n\n    const imagePreviews = this.el.querySelectorAll(\n      '.media-gallery__image-preview'\n    );\n    //remove the active class from all previews\n    imagePreviews.forEach(preview => {\n      preview.classList.remove('active');\n    });\n    //add the active class to the first preview\n    const firstPreview = imagePreviews[0] as HTMLElement;\n    firstPreview.classList.add('active');\n    this.scrollToActivePreview();\n    this.firstSlideFlag = true;\n\n    // Remove the 'media-gallery__modal-opened' class from the body to enable scrolling\n    document.body.classList.remove('media-gallery__modal-opened');\n\n    //remove the class .arrow-over-modal to the next and prev buttons\n    (this.dom.nextArrow as HTMLElement).classList.remove('arrow-over-modal');\n    (this.dom.prevArrow as HTMLElement).classList.remove('arrow-over-modal');\n\n    (window as ExtendedWindowType).dataLayer.push({\n      event: 'media_gallery',\n      event_category: 'project profiles',\n      event_action: 'media gallery close',\n      event_label: '',\n      event_attributes: {\n        gallery_type: 'popover',\n        thumbnail_count: (this.galleryIndex as number) + 1\n      }\n    });\n  }\n\n  handleNextArrowClick() {\n    const modal = this.dom.modal as HTMLElement;\n    this.setGalleryItems();\n    const currentSlideIndex = this.gallerySwiper?.activeIndex;\n\n    if (modal.classList.contains('media-gallery__modal-open')) {\n      if (this.gallerySwiper) {\n        if (this.galleryItems) {\n          const nextImage =\n            this.galleryItems?.[(this.galleryIndex as number) + 1];\n          if (nextImage) {\n            // Pause the video in the current active slide\n            this.pauseVideoInSlide(this.galleryIndex);\n\n            this.showItemInModal(nextImage, (this.galleryIndex as number) + 1);\n            this.gallerySwiper.disable();\n            (this.dom.nextArrow as HTMLElement).classList.remove(\n              'swiper-button-lock'\n            );\n            (this.dom.prevArrow as HTMLElement).classList.remove(\n              'swiper-button-lock'\n            );\n          } else {\n            this.handleCloseModal();\n          }\n        }\n      }\n\n      (window as ExtendedWindowType).dataLayer.push({\n        event: 'media_gallery',\n        event_category: 'project profiles',\n        event_action: 'media gallery arrow click',\n        event_label: 'next',\n        event_attributes: {\n          gallery_type: 'popover',\n          thumbnail_count: (this.galleryIndex as number) + 1\n        }\n      });\n    } else {\n      //if is tablet and above\n      if (window.innerWidth >= 768) {\n        //if firstTimeFlag is true then set it to false\n        if (this.firstSlideFlag) {\n          this.firstSlideFlag = false;\n          //swiper slide to next\n          this.gallerySwiper?.slideNext();\n        }\n      }\n\n      const imagePreviews = this.el.querySelectorAll(\n        '.media-gallery__image-preview'\n      );\n      const nextIndex = (currentSlideIndex as number) + 1;\n      imagePreviews.forEach(preview => {\n        if (preview.getAttribute('data-index') === nextIndex?.toString()) {\n          const activePreview = this.el.querySelector(\n            '.media-gallery__image-preview.active'\n          ) as HTMLElement;\n          activePreview?.classList.remove('active');\n          //add the active class to matched preview\n\n          preview.classList.add('active');\n          this.scrollToActivePreview();\n        }\n      });\n\n      (window as ExtendedWindowType).dataLayer.push({\n        event: 'media_gallery',\n        event_category: 'project profiles',\n        event_action: 'media gallery arrow click:next',\n        event_label: '',\n        event_attributes: {\n          gallery_type: 'embedded',\n          thumbnail_count: ''\n        }\n      });\n    }\n  }\n\n  handlePrevArrowClick() {\n    const modal = this.dom.modal as HTMLElement;\n    this.setGalleryItems();\n\n    if (modal.classList.contains('media-gallery__modal-open')) {\n      if (this.gallerySwiper) {\n        if (this.galleryItems) {\n          const prevImage =\n            this.galleryItems?.[(this.galleryIndex as number) - 1];\n          if (prevImage) {\n            // Pause the video in the current active slide\n            this.pauseVideoInSlide(this.galleryIndex);\n\n            this.showItemInModal(prevImage, (this.galleryIndex as number) - 1);\n            this.gallerySwiper.disable();\n            (this.dom.nextArrow as HTMLElement).classList.remove(\n              'swiper-button-lock'\n            );\n            (this.dom.prevArrow as HTMLElement).classList.remove(\n              'swiper-button-lock'\n            );\n          } else {\n            this.handleCloseModal();\n          }\n        }\n      }\n\n      (window as ExtendedWindowType).dataLayer.push({\n        event: 'media_gallery',\n        event_category: 'project profiles',\n        event_action: 'media gallery arrow click: previous',\n        event_label: '',\n        event_attributes: {\n          gallery_type: 'popover',\n          thumbnail_count: (this.galleryIndex as number) + 1\n        }\n      });\n    } else {\n      const imagePreviews = this.el.querySelectorAll(\n        '.media-gallery__image-preview'\n      );\n      const currentSlideIndex = this.gallerySwiper?.activeIndex;\n      const prevIndex = (currentSlideIndex as number) - 1;\n      imagePreviews.forEach(preview => {\n        if (preview.getAttribute('data-index') === prevIndex?.toString()) {\n          const activePreview = this.el.querySelector(\n            '.media-gallery__image-preview.active'\n          ) as HTMLElement;\n\n          activePreview?.classList.remove('active');\n\n          //add the active class to matched preview\n          preview.classList.add('active');\n          this.scrollToActivePreview();\n          this.firstSlideFlag = true;\n        }\n      });\n\n      if (window.innerWidth >= 768) {\n        if (currentSlideIndex === 2) {\n          this.firstSlideFlag = true;\n          this.gallerySwiper?.slidePrev();\n        }\n      }\n\n      (window as ExtendedWindowType).dataLayer.push({\n        event: 'media_gallery',\n        event_category: 'project profiles',\n        event_action: 'media gallery arrow click:previous',\n        event_label: '',\n        event_attributes: {\n          gallery_type: 'embedded',\n          thumbnail_count: ''\n        }\n      });\n    }\n  }\n\n  scrollToActivePreview() {\n    const activePreview = this.el.querySelector(\n      '.media-gallery__image-preview.active'\n    ) as HTMLElement;\n    const previewRow = this.el.querySelector(\n      '.media-gallery__image-preview-row'\n    ) as HTMLElement;\n    const activePreviewWidth = activePreview.clientWidth + 20;\n    const activePreviewIndex = activePreview.getAttribute('data-index');\n    const scrollAmount =\n      activePreviewWidth * (parseInt(activePreviewIndex as string) || 0);\n\n    previewRow.scrollTo({ left: scrollAmount, behavior: 'auto' });\n  }\n\n  pauseVideoInSlide(index: number | undefined) {\n    const slide = this.galleryItems?.[index as number];\n    const figure = slide?.querySelector('.figure') as HTMLElement;\n    if (figure) {\n      //it is a video\n      //pause the video\n      this.videoFigure?.handleExternalVideoPause();\n    }\n  }\n}\n\nexport default MediaGallery;\n"],"names":["MediaGallery","Component","el","__publicField","figure","_a","item","index","event","modalContent","preview","_b","_c","Swiper","Navigation","Keyboard","desktopOffSetWidth","_d","slides","hideNotActiveSlides","slide","button","nodeList","firstElement","secondElementWidth","firstElementDesiredWidth","desiredSliderWidth","parentElement","sliderElement","desiredWidth","modal","modalImage","modalCaption","videoModalBackdrop","options","createFocusTrap","disableBodyScroll","clearAllBodyScrollLocks","parent","trigger","image","caption","videoId","videoDataset","figureGalleryItems","activePreview","imagePreviewRow","div","videoThumbnail","_item","imagePreviews","currentSlideIndex","nextImage","nextIndex","prevImage","prevIndex","previewRow","activePreviewWidth","activePreviewIndex","scrollAmount"],"mappings":"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"}