carousel.js

8.92 KB
12/10/2025 04:47
JS
carousel.js
/**
 * Carousel Plugin - ปลั๊กอินสำหรับสไลด์โชว์รูปภาพ
 */
(function(global) {
  'use strict';

  /**
   * คลาส CarouselPlugin
   * ปลั๊กอินสำหรับสไลด์โชว์รูปภาพ
   */
  class CarouselPlugin {
    constructor(editor) {
      this.editor = editor;
      this.name = 'carousel';
      this.title = 'Carousel';
      this.icon = 'slideshow';
      this.description = 'สไลด์โชว์รูปภาพ';
    }

    /**
     * เริ่มต้นปลั๊กอิน
     */
    init() {
      if (this.editor.config.debug) {
        console.log('CarouselPlugin เริ่มต้นแล้ว');
      }
    }

    /**
     * รับเทมเพลตของปลั๊กอิน
     */
    getTemplate() {
      return `
                <section class="editor-component carousel" data-component="carousel">
                    <div class="container">
                        <div class="carousel-container">
                            <div class="carousel-slides">
                                <div class="carousel-slide active">
                                    <img src="https://picsum.photos/seed/slide1/800/400.jpg" alt="สไลด์ 1">
                                    <div class="carousel-caption">
                                        <h3 data-editable="true">สไลด์ที่ 1</h3>
                                        <p data-editable="true">คำอธิบายสไลด์ที่ 1</p>
                                    </div>
                                </div>
                                <div class="carousel-slide">
                                    <img src="https://picsum.photos/seed/slide2/800/400.jpg" alt="สไลด์ 2">
                                    <div class="carousel-caption">
                                        <h3 data-editable="true">สไลด์ที่ 2</h3>
                                        <p data-editable="true">คำอธิบายสไลด์ที่ 2</p>
                                    </div>
                                </div>
                                <div class="carousel-slide">
                                    <img src="https://picsum.photos/seed/slide3/800/400.jpg" alt="สไลด์ 3">
                                    <div class="carousel-caption">
                                        <h3 data-editable="true">สไลด์ที่ 3</h3>
                                        <p data-editable="true">คำอธิบายสไลด์ที่ 3</p>
                                    </div>
                                </div>
                            </div>
                            <div class="carousel-controls">
                                <button class="carousel-prev" aria-label="Previous slide">
                                    <i class="material-icons">chevron_left</i>
                                </button>
                                <button class="carousel-next" aria-label="Next slide">
                                    <i class="material-icons">chevron_right</i>
                                </button>
                            </div>
                            <div class="carousel-indicators">
                                <button class="carousel-indicator active" aria-label="Go to slide 1"></button>
                                <button class="carousel-indicator" aria-label="Go to slide 2"></button>
                                <button class="carousel-indicator" aria-label="Go to slide 3"></button>
                            </div>
                        </div>
                    </div>
                </section>
            `;
    }

    /**
     * รับ CSS ของปลั๊กอิน
     */
    getCSS() {
      return `
                .carousel {
                    padding: 40px 0;
                }

                .carousel .container {
                    max-width: 1200px;
                    margin: 0 auto;
                    padding: 0 20px;
                }

                .carousel-container {
                    position: relative;
                    overflow: hidden;
                    border-radius: 8px;
                    box-shadow: 0 4px 12px rgba(0,0,0,0.1);
                }

                .carousel-slides {
                    display: flex;
                    transition: transform 0.5s ease;
                }

                .carousel-slide {
                    min-width: 100%;
                    position: relative;
                }

                .carousel-slide img {
                    width: 100%;
                    height: auto;
                    display: block;
                }

                .carousel-caption {
                    position: absolute;
                    bottom: 0;
                    left: 0;
                    right: 0;
                    background-color: rgba(0,0,0,0.7);
                    color: white;
                    padding: 20px;
                }

                .carousel-caption h3 {
                    margin: 0 0 10px 0;
                    font-size: 24px;
                }

                .carousel-caption p {
                    margin: 0;
                    font-size: 16px;
                }

                .carousel-controls {
                    position: absolute;
                    top: 50%;
                    transform: translateY(-50%);
                    width: 100%;
                    display: flex;
                    justify-content: space-between;
                    padding: 0 20px;
                    pointer-events: none;
                }

                .carousel-controls button {
                    background-color: rgba(255,255,255,0.7);
                    border: none;
                    width: 50px;
                    height: 50px;
                    border-radius: 50%;
                    display: flex;
                    align-items: center;
                    justify-content: center;
                    cursor: pointer;
                    pointer-events: all;
                    transition: background-color 0.2s;
                }

                .carousel-controls button:hover {
                    background-color: rgba(255,255,255,0.9);
                }

                .carousel-controls button i {
                    font-size: 24px;
                    color: #333;
                }

                .carousel-indicators {
                    position: absolute;
                    bottom: 20px;
                    left: 50%;
                    transform: translateX(-50%);
                    display: flex;
                    gap: 10px;
                }

                .carousel-indicator {
                    width: 12px;
                    height: 12px;
                    border-radius: 50%;
                    background-color: rgba(255,255,255,0.5);
                    border: none;
                    cursor: pointer;
                    transition: background-color 0.2s;
                }

                .carousel-indicator.active {
                    background-color: white;
                }

                @media (max-width: 768px) {
                    .carousel-caption h3 {
                        font-size: 20px;
                    }

                    .carousel-caption p {
                        font-size: 14px;
                    }

                    .carousel-controls button {
                        width: 40px;
                        height: 40px;
                    }

                    .carousel-controls button i {
                        font-size: 20px;
                    }
                }
            `;
    }

    /**
     * รับการตั้งค่าของปลั๊กอิน
     */
    getSettings() {
      return {
        autoplay: {
          type: 'checkbox',
          label: 'เล่นอัตโนมัติ',
          default: true
        },
        interval: {
          type: 'number',
          label: 'ระยะเวลา (วินาที)',
          min: 1000,
          max: 10000,
          default: 5000
        },
        showControls: {
          type: 'checkbox',
          label: 'แสดงปุ่มควบคุม',
          default: true
        },
        showIndicators: {
          type: 'checkbox',
          label: 'แสดงตัวบ่งชี้',
          default: true
        },
        animation: {
          type: 'select',
          label: 'แอนิเมชัน',
          options: [
            {value: 'slide', text: 'Slide'},
            {value: 'fade', text: 'Fade'},
            {value: 'scale', text: 'Scale'}
          ],
          default: 'slide'
        }
      };
    }
  }

  // เปิดเผยคลาส CarouselPlugin ทั่วโลก
  global.CarouselPlugin = CarouselPlugin;

})(typeof window !== 'undefined' ? window : this);