import { ChevronLeftIcon, ChevronRightIcon } from "@radix-ui/react-icons"; import { useKeenSlider } from "keen-slider/react"; import { useState, type MouseEvent } from "react"; interface SliderProps { className?: React.ComponentProps<'div'>['className']; children?: React.ReactNode; } export default function Slider({ className, children }: SliderProps) { const [currentSlide, setCurrentSlide] = useState(0); const [loaded, setLoaded] = useState(false); const [sliderRef, instanceRef] = useKeenSlider({ initial: 0, slideChanged(slider) { setCurrentSlide(slider.track.details.rel); }, created() { setLoaded(true); }, }); const goPrev = (e: MouseEvent) => { e.stopPropagation(); if (currentSlide !== 0) { instanceRef.current?.prev(); } }; const goNext = (e: MouseEvent) => { e.stopPropagation(); if (instanceRef.current && currentSlide !== instanceRef.current.track.details.slides.length - 1) { instanceRef.current.next(); } }; return (
{children}
{loaded && instanceRef.current && ( <> )}
{loaded && instanceRef.current && (
{Array.from({ length: instanceRef.current.track.details.slides.length }, (_, idx) => ( ))}
)}
); } interface ArrowProps { disabled: boolean; left?: boolean; onClick: (e: MouseEvent) => void; } function Arrow({ disabled, left, onClick }: ArrowProps) { const Icon = left ? ChevronLeftIcon : ChevronRightIcon; const position = left ? '-left-10' : 'left-auto -right-10'; return ( ); }