Files
reui-blocks/blocks/project10.tsx
T

238 lines
9.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use client";
import type { Variants } from "framer-motion";
import { motion } from "framer-motion";
import { ArrowUpRight } from "lucide-react";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
interface Project10Props {
className?: string;
}
const Project10 = ({ className }: Project10Props) => {
const images = [
{
src: "/block-media/shadcnblocks/block/lummi/bw1.jpeg",
alt: "موکاپ طراحی محصول",
},
{
src: "/block-media/shadcnblocks/block/lummi/bw2.jpeg",
alt: "معماری فرانت‌اند",
},
{
src: "/block-media/shadcnblocks/block/lummi/bw3.jpeg",
alt: "نمای محصول",
},
{
src: "/block-media/shadcnblocks/block/lummi/bw4.jpeg",
alt: "طراحی رابط دیجیتال",
},
{
src: "/block-media/shadcnblocks/block/lummi/bw5.jpeg",
alt: "بصری صفحه فرود بازاریابی",
},
];
const containerVariants: Variants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.2,
delayChildren: 0.1,
},
},
};
const itemVariants: Variants = {
hidden: { opacity: 0, y: 20 },
visible: {
opacity: 1,
y: 0,
transition: {
duration: 0.6,
ease: "easeOut",
},
},
};
const imageVariants: Variants = {
hidden: { opacity: 0, scale: 0.95 },
visible: {
opacity: 1,
scale: 1,
transition: {
duration: 0.8,
ease: "easeOut",
},
},
};
return (
<section dir="rtl" lang="fa" className={cn("py-32", className)}>
<motion.div
className="container"
variants={containerVariants}
initial="hidden"
animate="visible"
>
<motion.header
className="mb-12 flex flex-col gap-6 text-start lg:flex-row lg:items-start lg:justify-between"
variants={itemVariants}
>
<div className="flex-1">
<h1 className="mb-4 text-4xl font-bold sm:text-5xl lg:text-6xl">اتوماسیون بازاریابی</h1>
<p className="max-w-md text-base leading-relaxed text-muted-foreground sm:text-lg">پشت هر رابط ساده، معماری منظمی از کامپوننت‌ها و توکن‌های طراحی نهفته است.</p>
</div>
<div className="flex flex-col gap-4 sm:flex-row lg:flex-col lg:items-end lg:gap-6">
<Button
variant="outline"
size="sm"
className="w-fit gap-2 border-muted-foreground/20 bg-transparent hover:bg-muted/10"
>
مشاهده مطالعه موردی
<ArrowUpRight className="h-4 w-4 rtl:rotate-180" />
</Button>
<div className="flex gap-8 sm:gap-12">
<div className="text-sm">
<p className="mb-1 text-muted-foreground">حوزه</p>
<p className="font-medium">طراحی</p>
</div>
<div className="text-sm">
<p className="mb-1 text-muted-foreground">رسانه</p>
<p className="font-medium">نمایش دیزاین سیستم</p>
</div>
</div>
</div>
</motion.header>
<motion.div
className="mb-16 overflow-hidden rounded-2xl bg-muted/20"
variants={imageVariants}
>
<img
src="/block-media/shadcnblocks/block/lummi/bw14.jpeg"
alt="تصویر شاخص پروژه"
className="h-auto w-full object-cover"
/>
</motion.div>
<div className="mb-20 space-y-12 text-start lg:space-y-16">
<motion.section variants={itemVariants}>
<div className="grid items-start gap-8 border-b border-border pb-8 lg:grid-cols-2 lg:gap-12 lg:pb-12">
<div>
<span className="text-4xl font-light text-muted-foreground sm:text-5xl lg:text-6xl">
۱
</span>
<h2 className="mt-4 text-2xl font-bold sm:text-3xl">الهام.</h2>
</div>
<div className="space-y-4">
<p className="leading-relaxed text-muted-foreground">طراحی محصول از تجربه‌های همیشه در حال تغییر کاربر، نیازهای تازه و تنوع بسترها الهام می‌گیرد. هر تعامل منحصربه‌فرد است و فرصت‌های بی‌پایانی برای بهبود تجربه فراهم می‌آورد.</p>
<p className="leading-relaxed text-muted-foreground">از صفحه ورود تا داشبورد نهایی، هر نما بخشی از یک تجربه کاربری پیوسته است.</p>
</div>
</div>
</motion.section>
<motion.section variants={itemVariants}>
<div className="grid items-start gap-8 border-b border-border pb-8 lg:grid-cols-2 lg:gap-12 lg:pb-12">
<div>
<span className="text-4xl font-light text-muted-foreground sm:text-5xl lg:text-6xl">
۲
</span>
<h2 className="mt-4 text-2xl font-bold sm:text-3xl">
چالش کسب‌وکار‌ها.
</h2>
</div>
<div className="space-y-4">
<p className="leading-relaxed text-muted-foreground">رسیدن به رابط ایده‌آل اغلب به تکرار صبورانه، تست با کاربر و توجه دقیق به جزئیات نیاز دارد. انعطاف‌پذیری، احترام به دسترس‌پذیری و دیدی دقیق لازم است.</p>
<p className="leading-relaxed text-muted-foreground">غیرقابل‌پیش‌بینی بودن رفتار کاربر، هر طراحی را به چالش کسب‌وکاری ارزشمند تبدیل می‌کند.</p>
</div>
</div>
</motion.section>
<motion.section variants={itemVariants}>
<div className="grid items-start gap-8 border-b border-border pb-8 lg:grid-cols-2 lg:gap-12 lg:pb-12">
<div>
<span className="text-4xl font-light text-muted-foreground sm:text-5xl lg:text-6xl">
۳
</span>
<h2 className="mt-4 text-2xl font-bold sm:text-3xl">پاداش.</h2>
</div>
<div className="space-y-4">
<p className="leading-relaxed text-muted-foreground">پاداش ساخت با بلاک‌های آماده در سرعت و کیفیت آن است؛ هر کامپوننت قابل‌استفاده مجدد، زمان توسعه را کوتاه‌تر و تجربه را یکدست‌تر می‌کند.</p>
<p className="leading-relaxed text-muted-foreground">زیبایی محصولات دیجیتال را از دریچه طراحی ثبت می‌کند؛ از صفحه فرود تا داشبورد.</p>
</div>
</div>
</motion.section>
</div>
<motion.section className="space-y-4" variants={itemVariants}>
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
{images.slice(0, 2).map((image, index) => (
<motion.div
key={index}
className="overflow-hidden rounded-xl bg-muted/20"
variants={imageVariants}
>
<img
src={image.src || "/placeholder.svg"}
alt={image.alt}
className="h-64 w-full object-cover transition-transform duration-500 hover:scale-105 sm:h-80 lg:h-96"
/>
</motion.div>
))}
</div>
<div className="relative overflow-hidden rounded-xl">
<motion.div
className="flex gap-4"
animate={{
x: [0, 400, 800, 0],
}}
transition={{
duration: 12,
repeat: Number.POSITIVE_INFINITY,
ease: "linear",
}}
>
{images.slice(2, 5).map((image, index) => (
<motion.div
key={index}
className="w-80 flex-shrink-0 overflow-hidden rounded-xl bg-muted/20 sm:w-96"
variants={imageVariants}
>
<img
src={image.src || "/placeholder.svg"}
alt={image.alt}
className="h-48 w-full object-cover sm:h-64"
/>
</motion.div>
))}
{images.slice(2, 5).map((image, index) => (
<motion.div
key={`duplicate-${index}`}
className="w-80 flex-shrink-0 overflow-hidden rounded-xl bg-muted/20 sm:w-96"
variants={imageVariants}
>
<img
src={image.src || "/placeholder.svg"}
alt={image.alt}
className="h-48 w-full object-cover sm:h-64"
/>
</motion.div>
))}
</motion.div>
</div>
</motion.section>
</motion.div>
</section>
);
};
export { Project10 };