if (!customElements.get(âmedia-galleryâ)) {
customElements.define(âmedia-galleryâ, class MediaGallery extends HTMLElement {
constructor() {
super();
this.elements = {
liveRegion: this.querySelector(â[id^=âGalleryStatusâ]â),
viewer: this.querySelector(â[id^=âGalleryViewerâ]â),
thumbnails: this.querySelector(â[id^=âGalleryThumbnailsâ]â)
}
this.mql = window.matchMedia(â(min-width: 750px)â);
if (!this.elements.thumbnails) return;
this.elements.viewer.addEventListener(âslideChangedâ, debounce(this.onSlideChanged.bind(this), 500));
this.elements.thumbnails.querySelectorAll(â[data-target]â).forEach((mediaToSwitch) => {
mediaToSwitch.querySelector(âbuttonâ).addEventListener(âclickâ, this.setActiveMedia.bind(this, mediaToSwitch.dataset.target, false));
});
if (this.dataset.desktopLayout !== âstackedâ && this.mql.matches) this.removeListSemantic();
}
onSlideChanged(event) {
const thumbnail = this.elements.thumbnails.querySelector([data-target="${ event.detail.currentElement.dataset.mediaId }"]);
this.setActiveThumbnail(thumbnail);
}
setActiveMedia(mediaId, prepend) {
const activeMedia = this.elements.viewer.querySelector([data-media-id="${ mediaId }"]);
this.elements.viewer.querySelectorAll(â[data-media-id]â).forEach((element) => {
element.classList.remove(âis-activeâ);
});
activeMedia.classList.add(âis-activeâ);
if (prepend) {
activeMedia.parentElement.prepend(activeMedia);
if (this.elements.thumbnails) {
const activeThumbnail = this.elements.thumbnails.querySelector([data-target="${ mediaId }"]);
activeThumbnail.parentElement.prepend(activeThumbnail);
}
if (this.elements.viewer.slider) this.elements.viewer.resetPages();
}
this.preventStickyHeader();
window.setTimeout(() => {
if (this.elements.thumbnails) {
activeMedia.parentElement.scrollTo({ left: activeMedia.offsetLeft });
}
if (!this.elements.thumbnails || this.dataset.desktopLayout === âstackedâ) {
activeMedia.scrollIntoView({behavior: âsmoothâ});
}
});
this.playActiveMedia(activeMedia);
if (!this.elements.thumbnails) return;
const activeThumbnail = this.elements.thumbnails.querySelector([data-target="${ mediaId }"]);
this.setActiveThumbnail(activeThumbnail);
this.announceLiveRegion(activeMedia, activeThumbnail.dataset.mediaPosition);
}
setActiveThumbnail(thumbnail) {
if (!this.elements.thumbnails || !thumbnail) return;
this.elements.thumbnails.querySelectorAll(âbuttonâ).forEach((element) => element.removeAttribute(âaria-currentâ));
thumbnail.querySelector(âbuttonâ).setAttribute(âaria-currentâ, true);
if (this.elements.thumbnails.isSlideVisible(thumbnail, 10)) return;
this.elements.thumbnails.slider.scrollTo({ left: thumbnail.offsetLeft });
}
announceLiveRegion(activeItem, position) {
const image = activeItem.querySelector(â.product__modal-openerâimage imgâ);
if (!image) return;
image.onload = () => {
this.elements.liveRegion.setAttribute(âaria-hiddenâ, false);
this.elements.liveRegion.innerHTML = window.accessibilityStrings.imageAvailable.replace(
â[index]â,
position
);
setTimeout(() => {
this.elements.liveRegion.setAttribute(âaria-hiddenâ, true);
}, 2000);
};
image.src=image.src;
}
playActiveMedia(activeItem) {
window.pauseAllMedia();
const deferredMedia = activeItem.querySelector(â.deferred-mediaâ);
if (deferredMedia) deferredMedia.loadContent(false);
}
preventStickyHeader() {
this.stickyHeader = this.stickyHeader || document.querySelector(âsticky-headerâ);
if (!this.stickyHeader) return;
this.stickyHeader.dispatchEvent(new Event(âpreventHeaderRevealâ));
}
removeListSemantic() {
if (!this.elements.viewer.slider) return;
this.elements.viewer.slider.setAttribute(âroleâ, âpresentationâ);
this.elements.viewer.sliderItems.forEach(slide => slide.setAttribute(âroleâ, âpresentationâ));
}
});
}