'use client'; import React, { useState, useEffect, useCallback } from 'react'; import { cn } from '../../lib/utils'; import { ChevronLeft, ChevronRight } from 'lucide-react'; export interface Slide { id: string; title?: string; subtitle?: string; description?: string; image?: string; ctaText?: string; ctaLink?: string; } export interface SliderProps { slides: Slide[]; autoplay?: boolean; autoplayInterval?: number; showControls?: boolean; showIndicators?: boolean; variant?: 'default' | 'fullscreen' | 'compact'; className?: string; } /** * Slider Component * Responsive carousel for WPBakery nectar_slider/nectar_carousel patterns * Supports autoplay, manual controls, and multiple variants */ export const Slider: React.FC = ({ slides, autoplay = false, autoplayInterval = 5000, showControls = true, showIndicators = true, variant = 'default', className = '' }) => { const [currentIndex, setCurrentIndex] = useState(0); const [isTransitioning, setIsTransitioning] = useState(false); // Handle autoplay useEffect(() => { if (!autoplay || slides.length <= 1) return; const interval = setInterval(() => { nextSlide(); }, autoplayInterval); return () => clearInterval(interval); }, [autoplay, autoplayInterval, currentIndex, slides.length]); const nextSlide = useCallback(() => { if (isTransitioning || slides.length <= 1) return; setIsTransitioning(true); setCurrentIndex((prev) => (prev + 1) % slides.length); setTimeout(() => setIsTransitioning(false), 300); }, [slides.length, isTransitioning]); const prevSlide = useCallback(() => { if (isTransitioning || slides.length <= 1) return; setIsTransitioning(true); setCurrentIndex((prev) => (prev - 1 + slides.length) % slides.length); setTimeout(() => setIsTransitioning(false), 300); }, [slides.length, isTransitioning]); const goToSlide = useCallback((index: number) => { if (isTransitioning || slides.length <= 1) return; setIsTransitioning(true); setCurrentIndex(index); setTimeout(() => setIsTransitioning(false), 300); }, [slides.length, isTransitioning]); // Variant-specific styles const variantStyles = { default: 'rounded-xl overflow-hidden shadow-lg', fullscreen: 'w-full h-full rounded-none', compact: 'rounded-lg overflow-hidden shadow-md' }; const heightStyles = { default: 'h-96 md:h-[500px]', fullscreen: 'h-screen', compact: 'h-64 md:h-80' }; return (
{/* Slides Container */}
{slides.map((slide, index) => (
{/* Background Image */} {slide.image && (
{/* Overlay for better text readability */}
)} {/* Content */}
{slide.subtitle && (

{slide.subtitle}

)} {slide.title && (

{slide.title}

)} {slide.description && (

{slide.description}

)} {slide.ctaText && slide.ctaLink && ( {slide.ctaText} )}
))}
{/* Navigation Controls */} {showControls && slides.length > 1 && ( <> )} {/* Indicators */} {showIndicators && slides.length > 1 && (
{slides.map((_, index) => (
)} {/* Slide Counter (optional, for accessibility) */}
{currentIndex + 1} / {slides.length}
); }; // Helper function to convert WPBakery slider HTML to Slide array export function parseWpSlider(content: string): Slide[] { // This would parse nectar_slider or similar WPBakery slider patterns // For now, returns empty array - can be enhanced based on actual WP content return []; } export default Slider;