Files
reui-blocks/blocks/industries4.tsx
T

199 lines
6.8 KiB
TypeScript

"use client";
import { AnimatePresence, motion } from "framer-motion";
import { CornerDownRight } from "lucide-react";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
interface Contractor {
id: string;
category: string;
title: string;
imageSrc: string;
imageAlt: string;
learnMoreUrl: string;
}
interface Industries4Props {
heading: string;
contractors: Contractor[];
className?: string;
}
const Industries4 = ({
className,
heading = "توانمندسازی صنایع انرژی تجدیدپذیر",
contractors = [
{
id: "mining-enterprises",
category: "برقابی",
title:
"تحول در تولید برقابی با مدیریت هوشمند سدها",
imageSrc:
"/block-media/shadcnblocks/block/industry/hydro.jpg",
imageAlt: "محل بهره‌برداری نیروگاه برقابی",
learnMoreUrl: "#",
},
{
id: "global-finance",
category: "بادی",
title:
"بیشینه‌سازی بهره‌وری مزرعه‌های بادی با بهینه‌سازی توربین مبتنی بر هوش مصنوعی",
imageSrc:
"/block-media/shadcnblocks/block/industry/wind.jpg",
imageAlt: "تولید انرژی بادی",
learnMoreUrl: "#",
},
{
id: "elite-fashion",
category: "خورشیدی",
title:
"گسترش زیرساخت خورشیدی با یکپارچه‌سازی پیشرفته شبکه فتوولتائیک",
imageSrc:
"/block-media/shadcnblocks/block/industry/solar.jpg",
imageAlt: "تولید انرژی خورشیدی",
learnMoreUrl: "#",
},
],
}: Industries4Props) => {
const [activeContractor, setActiveContractor] = useState(
contractors[0]?.id || "",
);
const handleContractorHover = (contractorId: string) => {
setActiveContractor(contractorId);
};
return (
<section dir="rtl" lang="fa" className={cn("py-16 md:py-24", className)}>
<div className="container">
{/* Heading */}
<div className="mb-12 text-start">
<h2 className="text-xl md:text-2xll lg:text-2xll">{heading}</h2>
</div>
{/* Mobile Contractor Showcase */}
<div className="space-y-6 lg:hidden">
{contractors.map((contractor) => (
<a
key={contractor.id}
href={contractor.learnMoreUrl}
className="block overflow-hidden rounded-lg border border-border"
>
{/* Image */}
<div className="relative aspect-video w-full">
<img
src={contractor.imageSrc}
alt={contractor.imageAlt}
className="h-full w-full object-cover"
/>
</div>
{/* Content */}
<div className="space-y-4 p-6 text-start">
<div className="flex items-center">
<span className="text-xl font-semibold">
{contractor.category}
</span>
</div>
<h3 className="text-lg leading-tight text-muted-foreground">
{contractor.title}
</h3>
<Button
variant="ghost"
size="sm"
className="p-0 text-sm font-medium text-primary hover:text-primary/80"
asChild
>
<a href={contractor.learnMoreUrl}>
<CornerDownRight className="ms-1 h-3 w-3 rtl:-scale-x-100" />
بیشتر بدانید
</a>
</Button>
</div>
</a>
))}
</div>
{/* Desktop Contractor Showcase */}
<div className="hidden h-128 overflow-hidden border border-border lg:flex">
{contractors.map((contractor) => (
<a
key={contractor.id}
href={contractor.learnMoreUrl}
className={`flex h-full cursor-pointer gap-6 overflow-hidden border-s border-border first:border-s-0 ${
activeContractor === contractor.id ? "flex-1" : "w-48"
}`}
onMouseEnter={() => handleContractorHover(contractor.id)}
>
<div className="flex h-full min-w-0 flex-col justify-between gap-8 p-6 text-start">
{/* Logo */}
<div className="flex h-14 w-32 items-center">
<span className="text-xl font-semibold">
{contractor.category}
</span>
</div>
<div className="flex flex-col justify-between gap-8">
{/* Expanded Content */}
<AnimatePresence>
{activeContractor === contractor.id && (
<motion.div
key={`content-${contractor.id}`}
className="space-y-4"
>
<h3 className="text-lg leading-tight text-muted-foreground">
{contractor.title}
</h3>
<Button
variant="ghost"
size="sm"
className="p-0 text-sm font-medium text-primary hover:text-primary/80"
asChild
>
<a href={contractor.learnMoreUrl}>
<CornerDownRight className="ms-1 h-3 w-3 rtl:-scale-x-100" />
بیشتر بدانید
</a>
</Button>
</motion.div>
)}
</AnimatePresence>
</div>
</div>
{/* Image */}
<AnimatePresence>
{activeContractor === contractor.id && (
<motion.div
key={contractor.id}
initial={{ opacity: 0, x: -20 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -20 }}
transition={{ duration: 0.4, ease: "easeOut" }}
className={`relative h-full min-w-0 ${
contractor.id === contractors[0]?.id
? "w-96 flex-shrink-0"
: "flex-1"
}`}
>
<img
src={contractor.imageSrc}
alt={contractor.imageAlt}
className="h-full w-full object-cover"
/>
</motion.div>
)}
</AnimatePresence>
</a>
))}
</div>
</div>
</section>
);
};
export { Industries4 };