'use client'; import { useState, useCallback, useRef, useEffect } from 'react'; interface BeforeAfterSliderProps { beforeSrc: string; afterSrc: string; beforeLabel?: string; afterLabel?: string; } export function BeforeAfterSlider({ beforeSrc, afterSrc, beforeLabel = 'Original', afterLabel = 'Retuschiert', }: BeforeAfterSliderProps) { const [sliderPos, setSliderPos] = useState(50); const [isDragging, setIsDragging] = useState(false); const containerRef = useRef(null); const handleMouseMove = useCallback( (e: MouseEvent) => { if (!isDragging || !containerRef.current) return; const rect = containerRef.current.getBoundingClientRect(); const x = e.clientX - rect.left; const percent = Math.max(0, Math.min(100, (x / rect.width) * 100)); setSliderPos(percent); }, [isDragging] ); const handleTouchMove = useCallback( (e: TouchEvent) => { if (!isDragging || !containerRef.current) return; const rect = containerRef.current.getBoundingClientRect(); const x = e.touches[0].clientX - rect.left; const percent = Math.max(0, Math.min(100, (x / rect.width) * 100)); setSliderPos(percent); }, [isDragging] ); useEffect(() => { if (isDragging) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', () => setIsDragging(false)); document.addEventListener('touchmove', handleTouchMove); document.addEventListener('touchend', () => setIsDragging(false)); return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('touchmove', handleTouchMove); }; } }, [isDragging, handleMouseMove, handleTouchMove]); const handleMouseDown = useCallback(() => { setIsDragging(true); }, []); const handleClick = useCallback( (e: React.MouseEvent) => { if (!containerRef.current) return; const rect = containerRef.current.getBoundingClientRect(); const x = e.clientX - rect.left; const percent = Math.max(0, Math.min(100, (x / rect.width) * 100)); setSliderPos(percent); }, [] ); return (
{/* After image (full, background) */} {afterLabel} {/* Before image (clipped to left of slider) */}
{beforeLabel}
{/* Labels */}
{beforeLabel}
{afterLabel}
{/* Slider handle */}
); }