Files
reui-blocks/blocks/projects1.tsx
T

107 lines
3.9 KiB
TypeScript

"use client";
import { motion } from "framer-motion";
import { Badge } from "@/components/ui/badge";
import { cn } from "@/lib/utils";
const projects1prop = [
{
title: "شکوفایی تجربه",
description:
"طراحی پروتوتایپ‌های پیشرفته رابط برای داشبوردها و محصولات مدرن.",
image:
"/block-media/shadcnblocks/block/photos/ali-moradi-qNic6LXHw-w-unsplash.jpg",
tag: "معماری رابط",
},
{
title: "طراحی رابط",
description:
"شکل‌دهی تجربه onboarding محصول از مسیر پروتوتایپ‌های سه‌بعدی و چیدمان مفهومی برای صفحات اصلی.",
image:
"/block-media/shadcnblocks/block/photos/israel-andrade-YI_9SivVt_s-unsplash.jpg",
tag: "معماری اطلاعات",
},
{
title: "چیدمان ماژولار",
description:
"کاوش الگوهای چیدمان فشرده و ماژولار برای داشبوردهای متراکم از داده.",
image:
"/block-media/shadcnblocks/block/photos/nastuh-abootalebi-eHD8Y1Znfpk-unsplash.jpg",
tag: "مفهوم طراحی",
},
{
title: "نماهای کلی محصول",
description:
"خلق چیدمان‌های رابط آرام و ظریف که کارایی را با هماهنگی بصری متعادل می‌کنند.",
image:
"/block-media/shadcnblocks/block/photos/simone-hutsch-lISGL8VWpPE-unsplash.jpg",
tag: "معماری فرانت‌اند",
},
{
title: "فرم + جریان",
description:
"بازتعریف چیدمان‌های باز داشبورد با گذارهای روان و استفاده بهینه از فضا.",
image:
"/block-media/shadcnblocks/block/photos/simone-hutsch-uR__S5GX8Io-unsplash.jpg",
tag: "داشبورد ادمین تمام‌صفحه",
},
];
interface Projects1Props {
className?: string;
}
const Projects1 = ({ className }: Projects1Props) => {
return (
<section dir="rtl" lang="fa" className={cn("py-32", className)}>
<div className="container">
<div className="mb-10 flex items-center justify-between border-b border-border pb-4 text-start">
<h2 className="text-2xl font-semibold sm:text-lg">برجسته‌های معماری فرانت‌اند</h2>
</div>
<div className="space-y-12">
{projects1prop.map((project, index) => (
<motion.div
key={index}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, ease: "easeOut" }}
className="flex flex-col-reverse gap-6 text-start md:grid md:grid-cols-2 md:pt-10"
>
<div className="flex flex-col justify-between">
<h3 className="mb-2 text-lg font-medium sm:text-4xl">
{project.title}
</h3>
<div>
<p className="mb-3 max-w-sm text-sm font-medium text-foreground">
{project.description}
</p>
<Badge variant="outline" className="px-3 py-2">
{project.tag}
</Badge>
</div>
</div>
<motion.div
className="aspect-[3/2] w-full overflow-hidden rounded-sm"
initial={{ y: -80, opacity: 0 }}
whileInView={{ y: 0, opacity: 1 }}
transition={{ duration: 0.8, ease: "easeOut" }}
viewport={{ once: true }}
>
<img
src={project.image}
alt={project.title}
className="h-full w-full rounded-sm object-cover"
/>
</motion.div>
</motion.div>
))}
</div>
</div>
</section>
);
};
export { Projects1 };