Skip to content

Instantly share code, notes, and snippets.

@Arifursdev
Last active December 3, 2025 18:06
Show Gist options
  • Select an option

  • Save Arifursdev/1dc8ba0da88c7bf599528e1019489631 to your computer and use it in GitHub Desktop.

Select an option

Save Arifursdev/1dc8ba0da88c7bf599528e1019489631 to your computer and use it in GitHub Desktop.
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/flickity.min.css">
<script src="https://unpkg.com/[email protected]/dist/flickity.pkgd.min.js"></script>

<abc-featured-columns>
    <div class="blocks" data-abc-featured-columns="carousel">
      
      
        <div class="col">
            <div class="item">
                <div class="text">
                    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. At ad impedit rerum quos nobis laudantium! Rerum, error totam voluptas qui voluptatum obcaecati fugiat voluptate, corporis, eligendi animi aspernatur commodi explicabo rem omnis eaque incidunt illum doloribus debitis. At minima nulla quod consectetur repellendus mollitia accusantium, necessitatibus neque nesciunt debitis vel.</p>
                </div>
            </div>
        </div>
      
      
        <div class="col">
            <div class="item">
                <div class="text">
                    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. At ad impedit rerum quos nobis laudantium! Rerum, error totam voluptas qui voluptatum obcaecati fugiat voluptate, corporis, eligendi animi aspernatur commodi explicabo rem omnis eaque incidunt illum doloribus debitis. At minima nulla quod consectetur repellendus mollitia accusantium, necessitatibus neque nesciunt debitis vel.</p>
                </div>
            </div>
        </div>
      
      
        <div class="col">
            <div class="item">
                <div class="text">
                    <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. At ad impedit rerum quos nobis laudantium! Rerum, error totam voluptas qui voluptatum obcaecati fugiat voluptate, corporis, eligendi animi aspernatur commodi explicabo rem omnis eaque incidunt illum doloribus debitis. At minima nulla quod consectetur repellendus mollitia accusantium, necessitatibus neque nesciunt debitis veldfgdf.</p>
                </div>
            </div>
        </div>
      
      
    </div>
</abc-featured-columns>
.blocks {
  --blocks-per-row: 3;
  --blocks-gap: 15px;
}

.blocks:not(.flickity-enabled) {
  display: flex;
  overflow: hidden;
}

.col {
  --total-margin: calc(var(--blocks-gap) * (var(--blocks-per-row) - 1));
  --size: calc((100% - var(--total-margin)) / var(--blocks-per-row));
  flex: 0 0 var(--size);
  width: var(--size);
  margin-right: var(--blocks-gap);
}


.item {
  background: green;
  color: #fff;
  padding: 20px;
}
if (!customElements.get('abc-featured-columns')) {
    customElements.define('abc-featured-columns', class abcFeaturedColumns extends HTMLElement {
        constructor() {
            super();

            this.carouselEl = this.querySelector('[data-abc-featured-columns="carousel"]');
        }
        
        getlCellAlign() {
            return window.innerWidth < 992 ? 'center' : 'left';
        }

        getInitialIndex () {
            return window.innerWidth < 992 ? 1 : 0;
        }
        
        initCarousel(){
            let settings = {
                cellAlign: this.getlCellAlign(),
                contain: false,
                wrapAround: true,
                prevNextButtons: false,
                pageDots: false,
                initialIndex: this.getInitialIndex(),
                adaptiveHeight: false,
                on: {
                    ready: () => {
                        this.carouselEl.classList.add('adev--flickity-ready');
                    },
                    settle: () => {
                        this.carouselEl.classList.add('adev--flickity-ready');
                        this.carouselEl.classList.remove('adev--flickity-moving');
                    },
                    dragStart: () => {
                        this.carouselEl.classList.add('adev--flickity-moving');
                    },
                    dragEnd: () => {
                        this.carouselEl.classList.remove('adev--flickity-moving');
                    },
                    change: () => {
                        this.querySelectorAll('adev-video-tag').forEach((videoTag) => {
                            videoTag.pause();
                        });
                    },
                    select: () => {
                        this.querySelectorAll('adev-video-tag').forEach((videoTag) => {
                            videoTag.pause();
                        });
                    }
                }
            };

            this.carouselInstance = new Flickity(this.carouselEl, settings);

            window.matchMedia('(min-width: 992px)').addEventListener('change', () => this.onResize());

            this.initArrows();
            this.initDots();
        }

        onResize() {
            if (this.carouselInstance && this.carouselEl) {
                this.carouselEl.classList.remove('adev--flickity-ready');
                this.carouselInstance.options.cellAlign = this.getlCellAlign();
                this.carouselInstance.options.initialIndex = this.getInitialIndex();
                this.carouselInstance.resize();
            }
        }

        initArrows() {
            const prevButton = this.querySelector('[data-adev-review-carousel-block="prev"]');
            const nextButton = this.querySelector('[data-adev-review-carousel-block="next"]');
            
            if (prevButton && nextButton) {
                prevButton.addEventListener('click', () => {
                    this.carouselInstance.previous();
                });
                nextButton.addEventListener('click', () => {
                    this.carouselInstance.next();
                });
            }
        }

        initDots() {
            const dotsContainer = this.querySelector('[data-adev-review-carousel-block="dots"]');
            if (!dotsContainer) return;

            const dots = dotsContainer.querySelectorAll('[data-adev-review-carousel-block="dot"]');
            dots.forEach(dot => {
                dot.addEventListener('click', e => {
                    e.preventDefault();
                    const index = parseInt(dot.getAttribute('data-index'), 10);
                    this.carouselInstance.select(index);
                });
            });

            this.carouselInstance.on('change', index => {
                const dots = dotsContainer.querySelectorAll('[data-adev-review-carousel-block="dot"]');
                dots.forEach(dot => dot.classList.remove('is--active'));
                const activeDot = dotsContainer.querySelector(`[data-adev-review-carousel-block="dot"][data-index="${index}"]`);
                if (activeDot) {
                    activeDot.classList.add('is--active');
                }
            });
        }

        destroyCarousel(){
            if(this.carouselInstance){
                this.carouselInstance.destroy();
                window.matchMedia('(min-width: 992px)').removeEventListener('change', () => this.onResize());
            }
        }

        connectedCallback() {
            this.initCarousel();
        }

        disconnectedCallback() {
            this.destroyCarousel();
        }

    });
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment