165 lines
5.6 KiB
TypeScript
165 lines
5.6 KiB
TypeScript
"use client";
|
||
|
||
import type { Variants } from "framer-motion";
|
||
import { motion } from "framer-motion";
|
||
|
||
import { Card } from "@/components/ui/card";
|
||
import {
|
||
Tooltip,
|
||
TooltipContent,
|
||
TooltipProvider,
|
||
TooltipTrigger,
|
||
} from "@/components/ui/tooltip";
|
||
import { cn } from "@/lib/utils";
|
||
|
||
const SERVICES = [
|
||
{
|
||
id: "01",
|
||
number: "۱",
|
||
title: "گزارشساز",
|
||
description:
|
||
"گزارش سفارشی را بدون SQL بسازید و سریع منتشر کنید.",
|
||
image: "/block-media/shadcnblocks/block/lummi/bw1.jpeg",
|
||
imageAlt: "گزارشساز",
|
||
},
|
||
{
|
||
id: "02",
|
||
number: "۲",
|
||
title: "Pivot تعاملی",
|
||
description:
|
||
"ابعاد مختلف را بچرخانید و الگوی پنهان را پیدا کنید.",
|
||
image: "/block-media/shadcnblocks/block/lummi/bw3.jpeg",
|
||
imageAlt: "تحلیل داده سازمان",
|
||
},
|
||
{
|
||
id: "03",
|
||
number: "۰۳",
|
||
title: "داشبورد مدیریتی",
|
||
description:
|
||
"نمای اجرایی برای تصمیمهای سریع طراحی کنید.",
|
||
image: "/block-media/shadcnblocks/block/lummi/bw11.jpeg",
|
||
imageAlt: "داشبورد هوش تجاری",
|
||
},
|
||
{
|
||
id: "04",
|
||
number: "۰۴",
|
||
title: "اتصال منبع",
|
||
description:
|
||
"داده پراکنده را در یک مدل واحد ساختاردهی کنید.",
|
||
image: "/block-media/shadcnblocks/block/lummi/bw5.jpeg",
|
||
imageAlt: "گزارشساز",
|
||
},
|
||
{
|
||
id: "05",
|
||
number: "۰۵",
|
||
title: "سطح دسترسی",
|
||
description:
|
||
"گزارش سفارشی را بدون SQL بسازید و سریع منتشر کنید.",
|
||
image: "/block-media/shadcnblocks/block/lummi/bw7.jpeg",
|
||
imageAlt: "تحلیل داده سازمان",
|
||
},
|
||
{
|
||
id: "06",
|
||
number: "۰۶",
|
||
title: "تحلیل پیشبین",
|
||
description:
|
||
"ابعاد مختلف را بچرخانید و الگوی پنهان را پیدا کنید.",
|
||
image: "/block-media/shadcnblocks/block/lummi/person5.jpeg",
|
||
imageAlt: "داشبورد هوش تجاری",
|
||
},
|
||
] as const;
|
||
|
||
const containerVariants = {
|
||
hidden: { opacity: 0 },
|
||
visible: {
|
||
opacity: 1,
|
||
transition: { staggerChildren: 0.1 },
|
||
},
|
||
};
|
||
|
||
const cardVariants: Variants = {
|
||
hidden: { opacity: 0, y: 30 },
|
||
visible: { opacity: 1, y: 0, transition: { duration: 0.6, ease: "easeOut" } },
|
||
};
|
||
|
||
interface Feature266Props {
|
||
className?: string;
|
||
}
|
||
|
||
const Feature266 = ({ className }: Feature266Props) => {
|
||
return (
|
||
<section dir="rtl" lang="fa" className={cn("py-32", className)}>
|
||
<div className="container">
|
||
<motion.div
|
||
className="mb-16 text-center"
|
||
initial={{ opacity: 0, y: -20 }}
|
||
animate={{ opacity: 1, y: 0 }}
|
||
transition={{ duration: 0.8, ease: "easeOut" }}
|
||
>
|
||
<p className="mb-4 text-sm tracking-widest text-muted-foreground">
|
||
داشبوردهای تعاملی به تیمها اجازه میدهد سؤال جدید بپرسند بدون اینکه هر بار به تیم داده وابسته باشند.
|
||
</p>
|
||
<h1 className="text-xl font-light tracking-wide text-balance md:text-2xll">
|
||
تصمیم استراتژیک را دادهمحور کنید
|
||
<br />
|
||
هر تیم داشبورد خودش را داشته باشد
|
||
</h1>
|
||
</motion.div>
|
||
|
||
<motion.div
|
||
className="grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-3"
|
||
variants={containerVariants}
|
||
initial="hidden"
|
||
animate="visible"
|
||
>
|
||
{SERVICES.map((service) => (
|
||
<motion.div
|
||
key={service.id}
|
||
variants={cardVariants}
|
||
className="group cursor-pointer"
|
||
>
|
||
<Card className="border-border/20 bg-card/5 p-8 backdrop-blur-sm transition-colors duration-300 hover:bg-card/10">
|
||
<p className="mb-8 text-xs tracking-widest text-muted-foreground">
|
||
{service.number}
|
||
</p>
|
||
|
||
<div className="relative mb-8 flex h-40 items-center justify-center">
|
||
<TooltipProvider delayDuration={0}>
|
||
<Tooltip>
|
||
<TooltipTrigger asChild>
|
||
<div className="h-32 w-24 overflow-hidden rounded-lg border border-border/30 bg-linear-to-br from-primary/30 to-secondary/30 shadow-lg">
|
||
<img
|
||
src={service.image}
|
||
alt={service.imageAlt}
|
||
className="size-full object-cover"
|
||
/>
|
||
</div>
|
||
</TooltipTrigger>
|
||
<TooltipContent side="top" align="center" className="p-2">
|
||
<img
|
||
src={service.image}
|
||
alt={`${service.imageAlt} بزرگ`}
|
||
className="h-60 w-40 rounded-md object-cover"
|
||
/>
|
||
</TooltipContent>
|
||
</Tooltip>
|
||
</TooltipProvider>
|
||
</div>
|
||
|
||
<h3 className="mb-2 text-center text-lg font-light tracking-wide text-balance transition-colors duration-300 group-hover:text-primary">
|
||
{service.title}
|
||
</h3>
|
||
<p className="text-center text-sm text-pretty text-muted-foreground transition-colors duration-300 group-hover:text-foreground/80">
|
||
{service.description}
|
||
</p>
|
||
</Card>
|
||
</motion.div>
|
||
))}
|
||
</motion.div>
|
||
</div>
|
||
</section>
|
||
);
|
||
};
|
||
|
||
export { Feature266 };
|