"use client"; import Autoplay from "embla-carousel-autoplay"; import { AnimatePresence, motion } from "framer-motion"; import React, { useCallback, useMemo } from "react"; import { Carousel, type CarouselApi, CarouselContent, CarouselItem, } from "@/components/ui/carousel"; import { useIsMobile } from "@/hooks/use-mobile"; import { cn } from "@/lib/utils"; interface Hero228Props { className?: string; } const TESTIMONIALS = [ { id: 1, image: "/block-media/shadcnblocks/block/lummi/person1.jpeg", name: "علی رضایی", }, { id: 2, image: "/block-media/shadcnblocks/block/lummi/person2.jpeg", name: "سارا محمدی", }, { id: 3, image: "/block-media/shadcnblocks/block/lummi/person3.jpeg", name: "رضا کریمی", }, { id: 4, image: "/block-media/shadcnblocks/block/lummi/person4.jpeg", name: "نرگس حسینی", }, { id: 5, image: "/block-media/shadcnblocks/block/lummi/person5.jpeg", name: "امیر نوری", }, { id: 6, image: "/block-media/shadcnblocks/block/lummi/bw3.jpeg", name: "الهام کاظمی", }, { id: 7, image: "/block-media/shadcnblocks/block/lummi/bw11.jpeg", name: "کیان موسوی", }, ] as const; const Hero228 = ({ className }: Hero228Props) => { const [api, setApi] = React.useState(); const [current, setCurrent] = React.useState(0); React.useEffect(() => { if (!api) return; api.on("select", () => { setCurrent(api.selectedScrollSnap()); }); }, [api]); const isMobile = useIsMobile(); const slideCount = isMobile ? TESTIMONIALS.length : TESTIMONIALS.length + 2; const activeName = TESTIMONIALS[current % TESTIMONIALS.length]?.name ?? TESTIMONIALS[0].name; const getImageSrc = useCallback((index: number) => { if (index === TESTIMONIALS.length) return TESTIMONIALS[0].image; if (index === TESTIMONIALS.length + 1) return TESTIMONIALS[1].image; if (index === TESTIMONIALS.length + 2) return TESTIMONIALS[2].image; return TESTIMONIALS[index]?.image ?? TESTIMONIALS[0].image; }, []); // RTL track: current is on the physical right, then center, then left const getRotation = useCallback( (index: number) => { if (index === current) { return "md:relative md:z-0 md:translate-x-40 md:scale-75 md:rotate-45"; } if (index === current + 1) { return "md:relative md:z-10 md:rotate-0"; } if (index === current + 2) { return "md:relative md:z-0 md:-translate-x-40 md:scale-75 md:-rotate-45"; } return ""; }, [current], ); const scrollbarBars = useMemo( () => [...Array(40)].map((_, item) => ( )), [], ); return (

همه ابزارهای لازم برای{" "} خلاق و توسعه سریع

صدها بلاک و کامپوننت آماده مبتنی بر رابط کاربری، استایل‌دهی مدرن و ری یو آی که مستقیماً در پروژه‌های شما قابل استفاده هستند.

{/* Override -ml-4 / pl-4 — they break RTL track sizing */} {Array.from({ length: slideCount }).map((_, index) => (
{activeName}
))}
{scrollbarBars}
{activeName}
{scrollbarBars}
); }; export { Hero228 };