Files
reui-blocks/blocks/services21.tsx
T

142 lines
5.5 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 { motion } from "framer-motion";
import { ArrowUpRight } from "lucide-react";
import React, { useEffect, useRef, useState } from "react";
import { BorderButton } from "@/components/shadcnblocks/border-button";
import { cn } from "@/lib/utils";
// Custom hook to get previous value
const usePrevious = <T,>(value: T): T | undefined => {
const [prev, setPrev] = useState<T | undefined>(undefined);
const ref = useRef(value);
useEffect(() => {
setPrev(ref.current);
ref.current = value;
}, [value]);
return prev;
};
interface Services21Props {
className?: string;
}
const Services21 = ({ className }: Services21Props) => {
const services = [
{
id: "{۱}",
title: "کشف و ممیزی",
image: "/block-media/shadcnblocks/block/guri4/img11.png",
description:
"قیف، داده و فرآیند فعلی را بررسی می‌کنیم تا گلوگاه‌های جذب، تبدیل و نگهداشت مشخص شوند و اولویت‌ها بر اساس اثر درآمد انتخاب گردند.",
},
{
id: "{۲}",
title: "طراحی سیستم رشد",
image: "/block-media/shadcnblocks/block/guri3/img25.jpeg",
description:
"نقشه کانال، سامانه مدیریت ارتباط با مشتری، اتوماسیون و KPIها را طراحی می‌کنیم تا تیم‌ها روی یک منبع حقیقت کار کنند و بودجه به کانال‌های پربازده برود.",
},
{
id: "{۰۳}",
title: "پیاده‌سازی عملیاتی",
image: "/block-media/shadcnblocks/block/guri4/img10.png",
description:
"ابزارها، جریان‌ها و داشبوردها را مستقر می‌کنیم. فروش و بازاریابی با داده تمیز و فرآیند شفاف وارد اجرا می‌شوند.",
},
{
id: "{۰۴}",
title: "فعال‌سازی تیم",
image: "/block-media/shadcnblocks/block/guri4/img9.png",
description:
"آموزش، راهنمای فروش و دارایی‌های فروش را تحویل می‌دهیم تا پذیرش سیستم بالا بماند و عملکرد از فرد به کل تیم منتقل شود.",
},
{
id: "{۰۵}",
title: "بهینه‌سازی مستمر",
image: "/block-media/shadcnblocks/block/guri3/img25.jpeg",
description:
"هزینه جذب، نرخ تبدیل و نگهداشت را پایش می‌کنیم و با آزمایش ساختاریافته، سیستم رشد را فصل به فصل بهتر می‌کنیم.",
},
];
const [active, setActive] = useState<number>(0);
const previousActive = usePrevious(active);
return (
<section dir="rtl" lang="fa" className={cn("py-32", className)}>
<div className="container">
<div className="flex w-full flex-col justify-between lg:flex-row lg:gap-20">
<div className="top-10 h-fit w-full space-y-7 py-8 lg:sticky lg:max-w-xs">
<div className="relative h-90 overflow-hidden">
{previousActive !== undefined && (
<div className="absolute top-0 h-full w-full">
<img
src={services[previousActive].image}
className="h-full w-full object-cover"
alt={services[previousActive].title}
/>
</div>
)}
<motion.div
initial={{ clipPath: "inset(0% 0% 0% 100%)" }}
animate={{ clipPath: "inset(0% 0% 0% 0%)" }}
key={active}
transition={{
type: "spring",
stiffness: 150,
damping: 20,
}}
className="h-full w-full"
>
<img
src={services[active].image}
className="h-full w-full object-cover"
alt={services[active].title}
/>
</motion.div>
</div>
<p className="font-semibold tracking-tight text-foreground/20">
{services[active].title}
</p>
<p className="text-base text-foreground/50">
{services[active].description}
</p>
</div>
<div className="relative w-full xl:ps-20">
<ul>
{services.map((service, index) => (
<li
key={index}
onMouseEnter={() => setActive(index)}
className={cn(
"cursor-pointer border-b border-foreground/20 py-8 text-2xll font-semibold tracking-tight lg:text-2xll",
)}
>
<div
className={index === active ? "opacity-100" : "opacity-20"}
>
<span>{service.title}</span>
<sup className="align-super text-sm text-red-500 lg:text-3xl">
{service.id}
</sup>
</div>
</li>
))}
</ul>
<BorderButton className="group mt-10 gap-2 border-red-100 bg-red-500/10 text-red-500">
شروع کنید
<ArrowUpRight className="size-4 transition-transform duration-300 rtl:rotate-180 group-hover:rotate-45 rtl:group-hover:-rotate-[135deg]" />
</BorderButton>
</div>
</div>
</div>
</section>
);
};
export { Services21 };