document.addEventListener("DOMContentLoaded", () => { //#region Initialize all carousels on page ----------------------------------------------------- // Find all carousel containers const carouselContainers = document.querySelectorAll('.carousel-component'); carouselContainers.forEach((container) => { initializeCarousel(container); }); function initializeCarousel(container) { const componentElement = container.querySelector('[data-component="component"]'); if (!componentElement) { console.error('Carousel: [data-component="component"] element not found in container'); return; } const dataVariable = componentElement.dataset.srcVariable; if (!dataVariable) { console.error('Carousel: No data-src-variable attribute found'); return; } if (!window[dataVariable]) { console.error('Carousel: Data variable not found:', dataVariable); return; } const data = window[dataVariable]; if (!data.length) { console.warn('Carousel: No data found in', dataVariable); return; } //#endregion //#region Replier ----------------------------------------------------- class Replier { constructor(data) { this.data = data; } } //#endregion //#region Service ----------------------------------------------------- class Service { constructor(replier, container) { this.replier = replier; this.container = container; this.selectors; } initializeGlobalVariables() { this.items = this.selectors.carouselElement.querySelectorAll(".wrapper"); this.itemWidth = this.selectors.carouselElement.querySelector(".wrapper").offsetWidth; this.itemsWidth = Array.from(this.items).reduce((acc, item) => acc + item.offsetWidth, 0); this.onScreenComponentWidth = this.selectors.carouselElement.offsetWidth; this.maxComponentWidth = (this.itemsWidth - this.onScreenComponentWidth) + 8; this.currentPosition = 0; } triggerSelectors(componentElement) { this.selectors = { headerContentElement: componentElement.querySelector( '[data-component="header-content"]' ), indicatorsElement: componentElement.querySelector( '[data-component="indicators"]' ), headerButtonsElement: componentElement.querySelector( '[data-component="header-buttons"]' ), carouselElement: componentElement.querySelector( '[data-component="body-carousel"]' ) }; }; insertComponentSkeleton() { const componentElement = this.container.querySelector('[data-component="component"]'); componentElement.insertAdjacentHTML("afterbegin", this.getSkeletonHtml()); return componentElement; }; insertComponentContent(skeleton, selectors) { data.forEach((item, index) => { if (window.innerWidth < 768) { this.insertMobileIndicators(selectors.indicatorsElement, index); } selectors.carouselElement.insertAdjacentHTML( "beforeend", this.getContentCard(item, index) ); }); this.initializeGlobalVariables(); if (screen.width > 979.9 && data.length > 2) { this.insertDesktopButtons(skeleton, selectors, this.itemWidth); } }; insertMobileIndicators(indicatorsElement, index) { indicatorsElement.insertAdjacentHTML( "beforeend", this.getMobileIndicator(index) ); }; insertDesktopButtons(skeleton, selectors) { selectors.headerButtonsElement.insertAdjacentHTML("afterbegin", this.getDesktopButtons()); const prevButton = skeleton.querySelector( '[data-component="button-prev"]' ); const nextButton = skeleton.querySelector( '[data-component="button-next"]' ); prevButton.addEventListener("click", () => { service.updateDesktopCardPosition(this.currentPosition - this.itemWidth); }); nextButton.addEventListener("click", () => { service.updateDesktopCardPosition(this.currentPosition + this.itemWidth); }); }; getSkeletonHtml() { return `