This commit is contained in:
2026-09-16 08:47:12 +03:30
parent 16cba4492a
commit 116864c838
18 changed files with 859 additions and 605 deletions
+85
View File
@@ -0,0 +1,85 @@
'use client';
import React from 'react';
import { motion } from 'framer-motion';
import { CheckCircle2 } from 'lucide-react';
// ۱. تعریف Type برای داده‌های ورودی کامپوننت
// این همان اینترفیس ServiceItem از فایل اصلی شماست
export interface ServiceItem {
id: string;
title: string;
subtitle: string;
icon: React.ElementType;
color: string;
description: string;
capabilities: string[];
techStack: string[];
}
// ۲. تعریف Props کامپوننت کارت
interface ServiceCardProps {
service: ServiceItem;
index: number; // برای تأخیر انیمیشن
}
const ServiceCard: React.FC<ServiceCardProps> = ({ service, index }) => {
const Icon = service.icon;
return (
<motion.div
initial={{ opacity: 0, y: 15 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.35, delay: index * 0.08 }}
className="group relative flex flex-col justify-between p-6 rounded-2xl bg-gray-900/30 border border-gray-800/80 hover:border-indigo-500/30 hover:bg-gray-900/50 transition-all duration-300"
>
{/* Header Card */}
<div>
<div className="flex items-center justify-between mb-5">
<div className={`w-11 h-11 rounded-xl border flex items-center justify-center transition-transform group-hover:scale-105 ${service.color}`}>
<Icon className="w-5 h-5" />
</div>
<span className="font-mono text-[11px] text-gray-500 font-bold tracking-wider">
{service.id}
</span>
</div>
<h3 className="text-base font-bold text-white group-hover:text-indigo-200 transition-colors mb-1">
{service.title}
</h3>
<p className="text-[11px] font-mono text-gray-500 mb-3 uppercase tracking-wide">
{service.subtitle}
</p>
<p className="text-xs text-gray-400 leading-relaxed mb-5 text-justify">
{service.description}
</p>
{/* Capabilities List */}
<div className="space-y-2 mb-6 pt-4 border-t border-gray-800/60">
<span className="text-[11px] font-mono text-gray-400 font-semibold block">قابلیت‌های کلیدی:</span>
{service.capabilities.map((cap, i) => (
<div key={i} className="flex items-start gap-2 text-xs text-gray-300">
<CheckCircle2 className="w-3.5 h-3.5 text-indigo-400 shrink-0 mt-0.5" />
<span>{cap}</span>
</div>
))}
</div>
</div>
{/* Tech Stack Footer */}
<div className="pt-4 border-t border-gray-800/60 flex flex-wrap gap-1.5">
{service.techStack.map((tech) => (
<span
key={tech}
className="text-[10px] font-mono px-2.5 py-1 rounded bg-gray-950 border border-gray-800 text-gray-400 group-hover:border-gray-700 transition-colors"
>
{tech}
</span>
))}
</div>
</motion.div>
);
};
export default ServiceCard;
+20
View File
@@ -0,0 +1,20 @@
'use client';
import React from 'react';
import ServiceCard, { type ServiceItem } from './ServiceCard'; // ایمپورت کامپوننت کارت و تایپ آن
interface ServicesGridProps {
services: ServiceItem[];
}
const ServicesGrid: React.FC<ServicesGridProps> = ({ services }) => {
return (
<section className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{services.map((service, index) => (
<ServiceCard key={service.id} service={service} index={index} />
))}
</section>
);
};
export default ServicesGrid;
+46 -49
View File
@@ -2,13 +2,31 @@
import React from "react";
import { motion } from "framer-motion";
import { ExternalLink, LucideIcon } from "lucide-react";
// تنظیمات انیمیشن نرم برای Framer Motion
const customEase: [number, number, number, number] = [0.16, 1, 0.3, 1];
export default function CtaBanner() {
// اینترفیس پراپ‌ها
interface CallToActionProps {
title?: string;
description?: string;
buttonText?: string;
buttonLink?: string;
Icon?: LucideIcon;
}
export default function CallToAction({
title = "آماده پیاده‌سازی و توسعه سیستم‌های پیچیده",
description = "اگر نیاز به مشاوره معماری نرم‌افزار، مقیاس‌پذیری سرویس‌ها یا پیاده‌سازی ماژول‌های اینترانت و سازمانی دارید، در ارتباط باشید.",
buttonText = "شروع همکاری فنی",
buttonLink = "mailto:contact@example.com",
Icon = ExternalLink,
}: CallToActionProps) {
return (
// بخش اصلی با کنترلر موس و افکت Spotlight بدون تغییر باقی می‌ماند
<section
className="relative py-28 md:py-36 px-4 md:px-8 bg-gray-950 overflow-hidden flex items-center justify-center"
className="relative py-20 px-6 bg-gray-950 overflow-hidden flex items-center justify-center"
onMouseMove={(e) => {
const { currentTarget, clientX, clientY } = e;
const { left, top } = currentTarget.getBoundingClientRect();
@@ -16,63 +34,42 @@ export default function CtaBanner() {
currentTarget.style.setProperty("--mouse-y", `${clientY - top}px`);
}}
>
{/* ========================================================
پس‌زمینه کاملاً منطبق با سکشن Projects
======================================================== */}
{/* افکت Spotlight */}
{/* افکت‌های پس‌زمینه (Spotlight و Grid) بدون تغییر */}
<div className="pointer-events-none absolute -inset-px opacity-50 before:absolute before:inset-0 before:bg-[radial-gradient(800px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(255,255,255,0.06),transparent_40%)]" />
{/* پترن گرید ۲۴ پیکسلی خاکستری */}
<div className="pointer-events-none absolute inset-0 bg-[linear-gradient(to_right,#80808012_1px,transparent_1px),linear-gradient(to_bottom,#80808012_1px,transparent_1px)] bg-[size:24px_24px]" />
<div className="relative z-10 max-w-4xl w-full mx-auto">
<div className="relative z-10 max-w-5xl w-full mx-auto">
{/* کارت اصلی با انیمیشن و استایل رنگ جدید */}
<motion.div
initial={{ opacity: 0, y: 25, scale: 0.98 }}
whileInView={{ opacity: 1, y: 0, scale: 1 }}
viewport={{ once: true, margin: "-50px" }}
transition={{ duration: 0.8, ease: customEase }}
className="group relative rounded-3xl bg-neutral-900/50 border border-white/10 overflow-hidden backdrop-blur-md p-8 md:p-16 flex flex-col items-center text-center transition-colors hover:bg-neutral-900/70"
// تغییرات اصلی در این خط اعمال شده است
className="relative rounded-2xl border border-gray-800 bg-gradient-to-b from-gray-900/80 to-gray-950 p-8 md:p-12 text-center overflow-hidden shadow-2xl"
>
{/* هاله محو نوری پشت متن */}
<div className="pointer-events-none absolute -top-24 left-1/2 -translate-x-1/2 w-96 h-48 bg-white/[0.04] rounded-full blur-3xl" />
{/* تیتر اصلی با گرادیانت هماهنگ با متون Projects */}
<motion.h2
initial={{ opacity: 0, y: 15 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.7, delay: 0.1, ease: customEase }}
className="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight leading-[1.25] text-white max-w-2xl mb-8"
>
آماده خلق یک{" "}
<span className="text-neutral-500">شاهکار دیجیتال</span> هستید؟
</motion.h2>
{/* دکمه اکشن */}
<motion.div
initial={{ opacity: 0, y: 12 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.7, delay: 0.2, ease: customEase }}
>
<button className="relative group/btn inline-flex items-center justify-center gap-3 px-8 py-4 rounded-full font-semibold text-gray-950 text-base md:text-lg bg-white hover:bg-neutral-200 active:scale-[0.98] transition-all duration-300 shadow-[0_0_25px_rgba(255,255,255,0.15)] hover:shadow-[0_0_35px_rgba(255,255,255,0.25)]">
<span className="tracking-tight">شروع همکاری</span>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
strokeWidth={2.2}
stroke="currentColor"
className="w-5 h-5 transition-transform duration-300 group-hover/btn:-translate-x-1.5"
{/* افکت نوری جدید جایگزین شده است */}
<div className="absolute top-0 right-0 w-64 h-64 bg-indigo-500/10 rounded-full blur-3xl pointer-events-none" />
{/* محتوای داخلی */}
<div className="relative z-10 max-w-2xl mx-auto space-y-4">
<h3 className="text-2xl md:text-3xl font-bold text-white">
{title}
</h3>
{/* استایل متن توضیحات به‌روز شد */}
<p className="text-xs md:text-sm text-gray-400 leading-relaxed">
{description}
</p>
<div className="pt-2">
<a
href={buttonLink}
className="inline-flex items-center gap-2 px-6 py-2.5 rounded-lg bg-indigo-600 hover:bg-indigo-500 text-white text-xs font-semibold shadow-lg shadow-indigo-600/30 transition-all hover:scale-105"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
d="M10.5 19.5L3 12m0 0l7.5-7.5M3 12h18"
/>
</svg>
</button>
</motion.div>
<span>{buttonText}</span>
{Icon && <Icon className="w-3.5 h-3.5" />}
</a>
</div>
</div>
</motion.div>
</div>
</section>
+44
View File
@@ -0,0 +1,44 @@
import React from "react";
import { ExternalLink, LucideIcon } from "lucide-react";
// تعریف تایپ‌ها برای انعطاف‌پذیری کامپوننت (پراپ‌های اختیاری)
interface CallToActionProps {
title?: string;
description?: string;
buttonText?: string;
buttonLink?: string;
Icon?: LucideIcon;
}
export default function Sectionbanner({
title = "آماده پیاده‌سازی و توسعه سیستم‌های پیچیده",
description = "اگر نیاز به مشاوره معماری نرم‌افزار، مقیاس‌پذیری سرویس‌ها یا پیاده‌سازی ماژول‌های اینترانت و سازمانی دارید، در ارتباط باشید.",
buttonText = "شروع همکاری فنی",
buttonLink = "mailto:contact@example.com",
Icon = ExternalLink,
}: CallToActionProps) {
return (
<section className="relative px-6 pb-20">
<div className="mx-auto max-w-5xl rounded-2xl border border-gray-800 bg-gradient-to-b from-gray-900/80 to-gray-950 p-8 md:p-12 text-center relative overflow-hidden shadow-2xl">
<div className="absolute top-0 right-0 w-64 h-64 bg-indigo-500/10 rounded-full blur-3xl pointer-events-none" />
<div className="relative z-10 max-w-2xl mx-auto space-y-4">
<h3 className="text-2xl md:text-3xl font-bold text-white">
{title}
</h3>
<p className="text-xs md:text-sm text-gray-400 leading-relaxed">
{description}
</p>
<div className="pt-2">
<a
href={buttonLink}
className="inline-flex items-center gap-2 px-6 py-2.5 rounded-lg bg-indigo-600 hover:bg-indigo-500 text-white text-xs font-semibold shadow-lg shadow-indigo-600/30 transition-all hover:scale-105"
>
<span>{buttonText}</span>
{Icon && <Icon className="w-3.5 h-3.5" />}
</a>
</div>
</div>
</div>
</section>
);
}
+6 -2
View File
@@ -2,6 +2,7 @@
import { useRef } from "react";
import { motion, Variants, useScroll, useTransform } from "framer-motion";
import Link from "next/link";
// تعریف Variants با انیمیشن‌های نرم‌تر و روان‌تر
const containerVariants: Variants = {
@@ -104,12 +105,15 @@ export default function Hero() {
variants={itemVariants}
className="mt-8 flex justify-center gap-4"
>
<button className="px-6 py-2 rounded-md bg-blue-600 text-white font-medium hover:bg-blue-700 transition-colors">
<Link href="/contact"> <button className="px-6 py-2 rounded-md bg-blue-600 text-white font-medium hover:bg-blue-700 transition-colors">
شروع همکاری
</button>
</Link>
<Link href="/project">
<button className="px-6 py-2 rounded-md border border-neutral-700 text-neutral-300 font-medium hover:bg-neutral-800 transition-colors">
مشاهده نمونه کارها
پروژه ها
</button>
</Link>
</motion.div>
</motion.div>
</section>
+306 -98
View File
@@ -1,134 +1,342 @@
"use client";
import { motion } from "framer-motion";
import Image from "next/image";
import { useState } from "react";
import { motion, AnimatePresence } from "framer-motion";
import {
Landmark,
Banknote,
BarChart3,
ShieldCheck,
Workflow,
BadgeCheck,
Terminal,
ArrowLeft,
} from "lucide-react";
// دیتای تستی پروژه‌ها (می‌توانید با دیتای واقعی جایگزین کنید)
const projects = [
type ProjectStatus = "در حال بهره‌برداری" | "در حال توسعه" | "فاز آزمایشی";
interface Project {
id: string;
title: string;
domain: string;
status: ProjectStatus;
description: string;
stack: string[];
metrics: { label: string; value: string }[];
hasDetails: boolean;
Icon: typeof Landmark;
image: string;
}
const customEase: [number, number, number, number] = [0.16, 1, 0.3, 1];
const projects: Project[] = [
{
id: 1,
title: "سیستم مدیریت مالی فراز",
category: "نرم‌افزار سازمانی",
description: "یک پلتفرم یکپارچه برای مدیریت منابع مالی سازمان‌ها با داشبوردهای تحلیلی در لحظه.",
image: "/project-1.jpg", // این عکس‌ها را در پوشه public قرار دهید
color: "from-blue-500/20 to-purple-500/20",
id: "core-banking-report",
title: "دستیار آموزشی و معلم هوشمند",
domain: "آموزشی / سازمانی",
status: "در حال بهره‌برداری",
description:
"این سیستم به جای ارائه پاسخ‌های عمومی، تمامی کتب درسی را در پایگاه دانش خود بلعیده و پردازش کرده است. نتیجه؟ یک معلم خصوصی بی‌نقص که ۲۴ ساعته در دسترس است، دقیقا بر اساس متن کتاب درسی آموزش می‌دهد، امتحان می‌گیرد، تصحیح می‌کند و با دانش‌آموز به صورت صوتی صحبت می‌کند.",
stack: ["Next.js", "TTS", "RAG", "Voice-Enabled Learning", "Speech-to-Text"],
metrics: [
{ label: "زمان تولید گزارش شبانه", value: "۴ دقیقه" },
{ label: "حجم پردازش روزانه", value: "۲.۱ میلیون رکورد" },
],
hasDetails: true,
Icon: Landmark,
image: "/image/student2.png",
},
{
id: 2,
title: "اپلیکیشن سلامت‌جو",
category: "اپلیکیشن موبایل",
description: "سیستم نوبت‌دهی و پایش سلامت بیماران با قابلیت یکپارچه‌سازی با گجت‌های پوشیدنی.",
image: "/project-2.jpg",
color: "from-emerald-500/20 to-teal-500/20",
id: "treasury-dashboard",
title: "دستیار هوشمند فروش و پشتیبانی",
domain: "سازمانی / مالی",
status: "در حال بهره‌برداری",
description:
"راهکاری نوین برای کسب‌وکارهای آنلاین است که شکاف میان کاربر و محتوای سایت شما را پر می‌کند. این سیستم با خزش (Crawling) و ایندکس‌گذاری هوشمند تمامی صفحات وب‌سایت شما، به یک متخصصِ تمام‌عیار تبدیل می‌شود که تمامی محصولات، خدمات، قیمت‌ها و مستندات شما را می‌شناسد.",
stack: ["Next.js", "TypeScript", "NestJS", "Redis", "SQL Server"],
metrics: [
{ label: "کاربر همزمان", value: "۳۵۰+" },
{ label: "Uptime سه‌ماهه", value: "۹۹.۹۵٪" },
],
hasDetails: true,
Icon: Banknote,
image: "/image/payai.png",
},
{
id: 3,
title: "پلتفرم فروشگاهی نوین‌شاپ",
category: "تجارت الکترونیک",
description: "فروشگاه‌ساز ابری با معماری میکروسرویس و قابلیت مقیاس‌پذیری بالا برای ترافیک‌های سنگین.",
image: "/project-3.jpg",
color: "from-orange-500/20 to-red-500/20",
id: "fraud-detection",
title: "مرکز تماس هوشمند",
domain: "بانکی / پشتیبانی",
status: "در حال توسعه",
description:
"«مرکز تماس هوشمند» فراتر از یک سیستم ضبط مکالمه است. این پلتفرم با استفاده از فناوری‌های پیشرفته Speech-to-Text (STT) و LLM، تمامی تماس‌های ورودی و خروجی مرکز تماس شما را تحلیل کرده و شاخص‌های کلیدی عملکرد (KPI) را به صورت خودکار استخراج می‌کند.",
stack: ["Python", "FastAPI", "PostgreSQL", "Kafka", "Docker"],
metrics: [
{ label: "زمان امتیازدهی هر تراکنش", value: "< ۴۰ میلی‌ثانیه" },
{ label: "هشدارهای نادرست", value: "کاهش ۳۱٪" },
],
hasDetails: true,
Icon: ShieldCheck,
image: "/image/aicall2.png",
},
{
id: 4,
title: "اتوماسیون اداری هوشمند",
category: "هوش مصنوعی",
description: "سامانه اتوماسیون مبتنی بر هوش مصنوعی برای دسته‌بندی خودکار نامه‌ها و ارجاعات.",
image: "/project-4.jpg",
color: "from-indigo-500/20 to-blue-500/20",
id: "bpm-automation",
title: "اپلیکیشن ورزشی نئوفیت",
domain: "ورزشی / آموزشی",
status: "در حال بهره‌برداری",
description:
"دستیار هوشمند شما برای رسیدن به تناسب اندام ایده‌آل است. این اپلیکیشن با تحلیل دقیق ویژگی‌های جسمانی، سبک زندگی و شرایط محیطی، برنامه تمرینی کاملاً اختصاصی برای شما تدوین می‌کند. با نیوفیت، می‌توانید زمان و مکان تمرین را به سادگی تعیین کنید.",
stack: ["Next.js", "Node.js", "PostgreSQL", "RabbitMQ"],
metrics: [
{ label: "فرایند فعال", value: "۱۲ فرایند" },
{ label: "کاهش زمان تأییدیه", value: "۴۵٪" },
],
hasDetails: true,
Icon: Workflow,
image: "/image/neo.png",
},
];
// منحنی انیمیشن لوکس (همان که در Hero استفاده کردیم)
const customEase: [number, number, number, number] = [0.16, 1, 0.3, 1];
/** کامپوننت تصویر پروژه */
function ProjectImage({ project, index }: { project: Project; index: number }) {
return (
<div
className="relative h-40 md:h-44 overflow-hidden border-b border-white/5 bg-neutral-950/60 group"
aria-hidden="true"
>
<img
src={project.image}
alt={project.title}
className="w-full h-full object-cover opacity-60 transition-transform duration-700 group-hover:scale-105 group-hover:opacity-80"
/>
<div className="absolute inset-0 bg-gradient-to-t from-neutral-900/90 via-neutral-900/20 to-transparent" />
</div>
);
}
function StatusBadge({ status }: { status: ProjectStatus }) {
const tone =
status === "در حال بهره‌برداری"
? "border-emerald-400/25 bg-emerald-400/10 text-emerald-300"
: status === "در حال توسعه"
? "border-indigo-400/25 bg-indigo-400/10 text-indigo-300"
: "border-amber-400/25 bg-amber-400/10 text-amber-300";
return (
<span
className={`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px] font-medium ${tone}`}
>
{status === "در حال بهره‌برداری" && (
<BadgeCheck className="h-3 w-3" aria-hidden="true" />
)}
{status}
</span>
);
}
export default function Projects() {
const [activeId, setActiveId] = useState<string>(projects[0].id);
const activeProject =
projects.find((p) => p.id === activeId) ?? projects[0];
const activeIndex = projects.findIndex((p) => p.id === activeProject.id);
return (
<section
className="relative min-h-screen py-32 flex flex-col items-center justify-center overflow-hidden bg-gray-950"
onMouseMove={(e) => {
const { currentTarget, clientX, clientY } = e;
const { left, top } = currentTarget.getBoundingClientRect();
currentTarget.style.setProperty("--mouse-x", `${clientX - left}px`);
currentTarget.style.setProperty("--mouse-y", `${clientY - top}px`);
}}
id="projects"
className="relative py-24 md:py-32 bg-gray-950"
aria-labelledby="projects-heading"
>
{/* افکت Spotlight و Grid (دقیقا مشابه Hero) */}
<div className="pointer-events-none absolute -inset-px opacity-50 before:absolute before:inset-0 before:bg-[radial-gradient(800px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(255,255,255,0.06),transparent_40%)]" />
<div className="pointer-events-none absolute inset-0 bg-[linear-gradient(to_right,#80808012_1px,transparent_1px),linear-gradient(to_bottom,#80808012_1px,transparent_1px)] bg-[size:24px_24px]" />
<div className="pointer-events-none absolute inset-0 bg-[linear-gradient(to_right,#80808010_1px,transparent_1px),linear-gradient(to_bottom,#80808010_1px,transparent_1px)] bg-[size:24px_24px]" />
<div className="z-10 w-full max-w-7xl mx-auto px-4 md:px-8">
{/* هدر بخش پروژه‌ها */}
<div className="mb-20 md:mb-32">
<div className="relative z-10 w-full max-w-7xl mx-auto px-4 md:px-8">
{/* هدر سکشن */}
<div className="mb-12 md:mb-16">
<motion.h2
id="projects-heading"
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ duration: 1, ease: customEase }}
className="text-4xl md:text-6xl font-bold tracking-tight text-white mb-6"
viewport={{ once: true, margin: "-80px" }}
transition={{ duration: 0.9, delay: 0.05, ease: customEase }}
className="text-2xl md:text-4xl font-bold tracking-tight text-white mb-5"
>
خلق تجربه‌های <span className="text-neutral-500">ماندگار.</span>
خلق ارزش از مسیر فناوری <span className="text-indigo-400"></span>
</motion.h2>
<motion.p
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{ duration: 1, delay: 0.1, ease: customEase }}
className="text-lg md:text-xl text-neutral-400 max-w-2xl"
viewport={{ once: true, margin: "-80px" }}
transition={{ duration: 0.9, delay: 0.1, ease: customEase }}
className="text-base md:text-lg text-neutral-400 max-w-2xl leading-relaxed"
>
برخی از پروژه‌های منتخب ما که با تمرکز بر کارایی، زیبایی و معماری قدرتمند توسعه یافته‌اند.
نگاهی به محصولاتی که مسیر رشد کسب‌وکارها را هموار کردند
</motion.p>
</div>
{/* گرید پروژه‌ها */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 md:gap-8">
{projects.map((project, index) => (
<motion.div
key={project.id}
initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-100px" }}
transition={{
duration: 1.2,
delay: index * 0.15, // انیمیشن آبشاری برای کارت‌ها
ease: customEase,
}}
className="group relative rounded-3xl bg-neutral-900/50 border border-white/5 overflow-hidden backdrop-blur-sm transition-colors hover:bg-neutral-900/80"
>
{/* بخش تصویر (بالای کارت) */}
<div className={`relative h-64 md:h-80 w-full overflow-hidden bg-gradient-to-br ${project.color}`}>
{/*
نکته: برای استفاده از Image در Next.js، کامنت زیر را بردارید و عکس‌ها را در فولدر public بگذارید.
در اینجا موقتاً از یک گرادیانت به عنوان جایگزین عکس استفاده شده است تا خطا نگیرید.
*/}
{/* <Image
src={project.image}
alt={project.title}
fill
className="object-cover object-center transition-transform duration-700 group-hover:scale-105"
/> */}
{/* یک المان تزئینی به جای عکس واقعی (موقتی) */}
<div className="absolute inset-0 flex items-center justify-center text-white/20 font-bold text-3xl transition-transform duration-700 group-hover:scale-105">
تصویر پروژه
</div>
</div>
{/* ── نمای Master-Detail ── */}
<motion.div
initial={{ opacity: 0, y: 32 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-80px" }}
transition={{ duration: 0.9, ease: customEase }}
className="grid grid-cols-1 lg:grid-cols-[320px_1fr] gap-5 md:gap-6 items-stretch"
role="tablist"
aria-label="فهرست پروژه‌ها"
>
{/* ── Master: فهرست پروژه‌ها ── */}
<div
className="flex flex-col rounded-2xl border border-white/10 bg-neutral-900/50 overflow-hidden"
dir="rtl"
>
<div className="flex items-center gap-2 border-b border-white/5 bg-neutral-950/60 px-4 py-3">
<Terminal className="h-4 w-4 text-indigo-400" aria-hidden="true" />
<span
className="font-mono text-[11px] text-neutral-400 tracking-wider"
dir="ltr"
>
پروژه‌ها
</span>
</div>
{/* بخش محتوا (پایین کارت) */}
<div className="p-8">
<div className="text-xs font-semibold tracking-wider text-neutral-500 mb-3 uppercase">
{project.category}
</div>
<h3 className="text-2xl font-bold text-neutral-100 mb-3 group-hover:text-white transition-colors">
{project.title}
</h3>
<p className="text-neutral-400 leading-relaxed text-sm md:text-base">
{project.description}
</p>
<ul className="flex flex-col p-2 gap-1.5">
{projects.map((project, index) => {
const isActive = project.id === activeProject.id;
return (
<li key={project.id}>
<button
type="button"
role="tab"
id={`project-tab-${project.id}`}
aria-selected={isActive}
aria-controls={`project-panel-${project.id}`}
onClick={() => setActiveId(project.id)}
className={`group w-full text-right rounded-xl border px-3.5 py-3.5 transition-all duration-300 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[lab(44.0605%_29.0279_-86.0352_/_0.6)] focus-visible:ring-offset-2 focus-visible:ring-offset-gray-950 ${
isActive
? "border-[lab(44.0605%_29.0279_-86.0352_/_0.4)] bg-[lab(44.0605%_29.0279_-86.0352_/_0.1)]"
: "border-transparent hover:border-white/10 hover:bg-neutral-950/50"
}`}
>
<div className="flex items-center gap-3">
<span
className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border font-mono text-[10px] transition-colors ${
isActive
? "border-[lab(44.0605%_29.0279_-86.0352_/_0.4)] bg-[lab(44.0605%_29.0279_-86.0352_/_0.15)] text-[lab(44.0605%_29.0279_-86.0352)]"
: "border-white/10 bg-neutral-950/60 text-neutral-500 group-hover:text-neutral-300"
}`}
dir="ltr"
>
{String(index + 1).padStart(2, "0")}
</span>
<div className="min-w-0 flex-1">
<div
className={`truncate text-sm font-semibold transition-colors ${
isActive
? "text-white"
: "text-neutral-200 group-hover:text-white"
}`}
>
{project.title}
</div>
</motion.div>
))}
</div>
<div className="mt-0.5 truncate font-mono text-[10px] uppercase tracking-wider text-neutral-500">
{project.domain}
</div>
</div>
<span
aria-hidden="true"
className={`h-1.5 w-1.5 shrink-0 rounded-full transition-all ${
isActive
? "bg-[lab(44.0605%_29.0279_-86.0352)] shadow-[0_0_8px_2px_lab(44.0605%_29.0279_-86.0352_/_0.5)]"
: "bg-white/15"
}`}
/>
</div>
</button>
</li>
);
})}
</ul>
<div className="mt-auto border-t border-white/5 bg-neutral-950/60 px-4 py-3">
<span className="font-mono text-[10px] text-neutral-600" dir="ltr">
ژرفا نوآوری داده و آینده
</span>
</div>
</div>
{/* ── Detail: پنل پیش‌نمایش ── */}
<div
role="tabpanel"
id={`project-panel-${activeProject.id}`}
aria-labelledby={`project-tab-${activeProject.id}`}
className="min-w-0"
>
<AnimatePresence mode="wait">
<motion.article
key={activeProject.id}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -16 }}
transition={{ duration: 0.45, ease: customEase }}
className="group relative flex flex-col h-full rounded-2xl border border-white/10 bg-neutral-900/50 overflow-hidden"
>
<ProjectImage project={activeProject} index={activeIndex} />
<div className="flex flex-col flex-1 p-6 md:p-7">
<div className="flex flex-wrap items-center justify-between gap-2 mb-4">
<span className="font-mono text-[11px] uppercase tracking-wider text-neutral-500">
{activeProject.domain}
</span>
<StatusBadge status={activeProject.status} />
</div>
<h3 className="text-lg md:text-xl font-bold text-neutral-100 mb-2.5 transition-colors group-hover:text-white">
{activeProject.title}
</h3>
<p className="text-sm text-neutral-400 leading-relaxed mb-5">
{activeProject.description}
</p>
<ul
className="flex flex-wrap gap-1.5 mb-5"
aria-label="استک فنی پروژه"
>
{activeProject.stack.map((tech) => (
<li
key={tech}
dir="ltr"
className="rounded-md border border-white/10 bg-neutral-950/60 px-2 py-1 font-mono text-[11px] text-neutral-300"
>
{tech}
</li>
))}
</ul>
<dl className="mt-auto grid grid-cols-2 gap-3 mb-5">
{activeProject.metrics.map((m) => (
<div
key={m.label}
className="rounded-lg border border-white/5 bg-neutral-950/40 px-3 py-2.5"
>
<dt className="text-[11px] text-neutral-500 leading-snug">
{m.label}
</dt>
<dd
className="mt-1 text-sm font-semibold text-indigo-300"
dir="auto"
>
{m.value}
</dd>
</div>
))}
</dl>
{/* دکمه جزئیات پروژه به صورت همیشگی برای همه موارد */}
</div>
</motion.article>
</AnimatePresence>
</div>
</motion.div>
</div>
</section>
);
@@ -2,312 +2,254 @@
import React from "react";
import { motion, useMotionTemplate, useMotionValue } from "framer-motion";
import {
Server,
Terminal,
Database,
ShieldCheck,
Cpu,
Layers,
ArrowUpLeft,
Zap,
Lock
import {
Server,
Terminal,
Database,
ShieldCheck,
Cpu,
Layers,
ArrowUpLeft,
Zap,
Lock
} from "lucide-react";
// ==========================================
// 1. کامپوننت کارت با افکت ردیابی نور موس
// ==========================================
interface SpotlightCardProps {
children: React.ReactNode;
className?: string;
children: React.ReactNode;
className?: string;
}
function SpotlightCard({ children, className = "" }: SpotlightCardProps) {
const mouseX = useMotionValue(0);
const mouseY = useMotionValue(0);
const mouseX = useMotionValue(0);
const mouseY = useMotionValue(0);
function handleMouseMove({ currentTarget, clientX, clientY }: React.MouseEvent) {
const { left, top } = currentTarget.getBoundingClientRect();
mouseX.set(clientX - left);
mouseY.set(clientY - top);
}
function handleMouseMove({ currentTarget, clientX, clientY }: React.MouseEvent) {
const { left, top } = currentTarget.getBoundingClientRect();
mouseX.set(clientX - left);
mouseY.set(clientY - top);
}
return (
<div
onMouseMove={handleMouseMove}
className={`group relative overflow-hidden rounded-2xl border border-white/10 bg-neutral-900/50 p-6 md:p-8 backdrop-blur-xl transition-all duration-300 hover:border-white/20 hover:shadow-2xl hover:shadow-black/40 ${className}`}
>
{/* بازتاب نور داخلی موس در سطح هر کارت */}
<motion.div
className="pointer-events-none absolute -inset-px rounded-2xl opacity-0 transition-opacity duration-300 group-hover:opacity-100"
style={{
background: useMotionTemplate`
radial-gradient(
450px circle at ${mouseX}px ${mouseY}px,
rgba(255, 255, 255, 0.06),
transparent 80%
)
`,
}}
/>
<div className="relative z-10 flex h-full flex-col justify-between">
{children}
</div>
</div>
);
return (
<div
onMouseMove={handleMouseMove}
className={`group relative overflow-hidden rounded-2xl border border-white/10 bg-neutral-900/50 p-6 md:p-8 backdrop-blur-xl transition-all duration-300 hover:border-blue-600 hover:shadow-2xl hover:shadow-black/40 hover:scale-[1.02] ${className}`}
>
<motion.div
className="pointer-events-none absolute -inset-px rounded-2xl opacity-0 transition-opacity duration-300 group-hover:opacity-100"
style={{
background: useMotionTemplate`
radial-gradient(
450px circle at ${mouseX}px ${mouseY}px,
rgba(59, 130, 246, 0.1),
transparent 80%
)
`,
}}
/>
<div className="relative z-10 flex h-full flex-col justify-between">
{children}
</div>
</div>
);
}
// ==========================================
// 2. بخش اصلی Bento Grid خدمات
// ==========================================
export function ServicesBentoGrid() {
return (
<section
className="relative overflow-hidden py-24 md:py-32 bg-gray-950 text-white"
onMouseMove={(e) => {
const { currentTarget, clientX, clientY } = e;
const { left, top } = currentTarget.getBoundingClientRect();
currentTarget.style.setProperty("--mouse-x", `${clientX - left}px`);
currentTarget.style.setProperty("--mouse-y", `${clientY - top}px`);
}}
>
{/* ۱. الگوی گرید پس‌زمینه کاملاً یکدست و بدون سایه/محوشدگی بالا و پایین */}
<div
className="pointer-events-none absolute inset-0 opacity-70"
style={{
backgroundImage: `linear-gradient(to right, #80808012 1px, transparent 1px), linear-gradient(to bottom, #80808012 1px, transparent 1px)`,
backgroundSize: "24px 24px",
}}
/>
return (
<section
className="relative overflow-hidden bg-gray-950 py-24 text-white md:py-32"
onMouseMove={(e) => {
const { currentTarget, clientX, clientY } = e;
const { left, top } = currentTarget.getBoundingClientRect();
currentTarget.style.setProperty("--mouse-x", `${clientX - left}px`);
currentTarget.style.setProperty("--mouse-y", `${clientY - top}px`);
}}
>
{/* Grid background */}
<div
className="pointer-events-none absolute inset-0 opacity-70"
style={{
backgroundImage: `linear-gradient(to right, #80808012 1px, transparent 1px), linear-gradient(to bottom, #80808012 1px, transparent 1px)`,
backgroundSize: "24px 24px",
}}
/>
{/* Mouse light background */}
<div
className="pointer-events-none absolute inset-0 opacity-60 transition-opacity duration-300"
style={{
background: `radial-gradient(750px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(255, 255, 255, 0.04), transparent 40%)`,
}}
/>
{/* ۲. افکت نوری موس (Global Spotlight) در سطح سکشن */}
<div
className="pointer-events-none absolute inset-0 transition-opacity duration-300 opacity-60"
style={{
background: `radial-gradient(750px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(255, 255, 255, 0.04), transparent 40%)`,
}}
/>
{/* ۳. محتوای گرید */}
<div className="container relative z-10 mx-auto max-w-7xl px-4 md:px-6">
{/* Section Header */}
<div className="flex flex-col items-start md:items-end justify-between gap-6 pb-16 md:flex-row border-b border-white/10">
<div className="max-w-2xl space-y-3">
<div className="inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/[0.04] px-3.5 py-1 text-xs font-mono text-neutral-300 backdrop-blur-md">
<Zap className="h-3.5 w-3.5 text-amber-400" />
<span>CAPABILITIES & ARCHITECTURE</span>
</div>
<h2 className="text-3xl font-extrabold tracking-tight md:text-4xl lg:text-5xl text-white">
توسعه زیرساخت و معماری مقیاس‌پذیر
</h2>
<p className="text-sm md:text-base text-neutral-400 leading-relaxed font-light">
طراحی، استقرار و بهینه‌سازی سرویس‌های توزیع‌شده سازمانی با حداکثر پایداری و امنیت تراکنش‌ها.
</p>
</div>
<div className="flex items-center gap-3 text-xs font-mono text-neutral-400 bg-neutral-900/70 px-4 py-2 rounded-xl border border-white/10 backdrop-blur-md">
<span className="flex h-2 w-2 rounded-full bg-emerald-500 animate-pulse" />
<span>SYSTEM STATUS: OPERATIONAL</span>
</div>
</div>
{/* Bento Grid (6 Cards) */}
<div className="mt-12 grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
{/* Card 1: Distributed Core Systems */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl bg-blue-500/10 text-blue-400 border border-blue-500/20 shadow-inner">
<Server className="h-5 w-5" />
<div className="container relative z-10 mx-auto max-w-7xl px-4 md:px-6">
{/* بخش عنوان که به وسط چین منتقل شده است */}
<div className="flex flex-col items-center justify-center gap-8 pb-16 text-center">
<div className="flex flex-col items-center gap-3">
<span className="inline-block rounded-full bg-blue-600/10 px-3 py-1 text-sm font-semibold text-blue-400">
خدمات تخصصی
</span>
<h2 className="text-3xl font-bold tracking-tight md:text-5xl lg:text-6xl">
معماری نرم‌افزار مدرن
</h2>
</div>
<p className="max-w-3xl text-lg text-neutral-400 md:text-xl">
ارائه راهکارهای جامع بک‌اند، از طراحی میکروسرویس‌ها و پیاده‌سازی CI/CD تا ساخت سیستم‌های هوشمند و مقیاس‌پذیر.
</p>
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-white" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">سامانه‌های توزیع‌شده و Core</h3>
<p className="mt-2 text-xs md:text-sm text-neutral-400 leading-relaxed">
معماری میکروسرویس با پرفورمنس بالا، مدیریت همزمانی (Concurrency) و پردازش بی‌درنگ داده‌ها.
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3.5 font-mono text-xs">
<div className="flex items-center justify-between text-neutral-400 pb-2 border-b border-white/5">
<span>TPS / Throughput</span>
<span className="text-emerald-400 font-semibold">12,450 req/s</span>
</div>
<div className="mt-2 flex items-center justify-between text-[11px] text-neutral-400">
<span>Avg Latency:</span>
<span className="text-neutral-200">~8.2ms</span>
</div>
</div>
{/* گرید اصلی کارت‌ها */}
<div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
{/* Card 1 */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl border border-blue-600/20 bg-blue-600/10 text-blue-500 shadow-inner">
<Zap className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-blue-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">معماری و توسعه Back-End</h3>
<p className="mt-2 text-xs leading-relaxed text-neutral-400 md:text-sm">
طراحی و پیاده‌سازی سیستم‌های مقیاس‌پذیر و ماژولار با PHP (Laravel) و Python (FastAPI/Django).
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3 font-mono text-xs space-y-2">
<div className="flex items-center justify-between">
<span className="text-neutral-400">API Latency:</span>
<span className="font-semibold text-emerald-400">{"<40ms"}</span>
</div>
<div className="flex items-center justify-between">
<span className="text-neutral-400">Uptime:</span>
<span className="font-semibold text-emerald-400">{"99.99%"}</span>
</div>
</div>
</SpotlightCard>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Go", "Laravel 11", "FastAPI", "gRPC"].map((tag) => (
<span key={tag} className="rounded-md bg-white/[0.05] border border-white/5 px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 2 */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl border border-blue-600/20 bg-blue-600/10 text-blue-500 shadow-inner">
<Terminal className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-blue-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">DevOps و زیرساخت ابری</h3>
<p className="mt-2 text-xs leading-relaxed text-neutral-400 md:text-sm">
استقرار و مدیریت کانتینرها، اتوماسیون فرآیند CI/CD و انتشار بدون وقفه عملیاتی (Zero-Downtime).
</p>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Docker", "CI/CD", "Kubernetes", "Linux"].map((tag) => (
<span key={tag} className="rounded-md border border-white/5 bg-white/[0.05] px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 2: DevOps & Cloud Infrastructure */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl bg-cyan-500/10 text-cyan-400 border border-cyan-500/20 shadow-inner">
<Terminal className="h-5 w-5" />
{/* Card 3 */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl border border-blue-600/20 bg-blue-600/10 text-blue-500 shadow-inner">
<Database className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-blue-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">مهندسی داده و Event-Driven</h3>
<p className="mt-2 text-xs leading-relaxed text-neutral-400 md:text-sm">
پیاده‌سازی پایگاه‌های داده رابطه‌ای و NoSQL، کشینگ هوشمند و معماری پیام‌محور نامتقارن.
</p>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["PostgreSQL", "Redis", "Kafka", "RabbitMQ"].map((tag) => (
<span key={tag} className="rounded-md border border-white/5 bg-white/[0.05] px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 4 */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl border border-blue-600/20 bg-blue-600/10 text-blue-500 shadow-inner">
<Cpu className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-blue-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">جستجوی معنایی و هوش مصنوعی</h3>
<p className="mt-2 text-xs leading-relaxed text-neutral-400 md:text-sm">
استخراج اطلاعات، تعبیه‌سازی وکتورها و بازیابی فوق‌سریع در پایگاه‌های داده معنایی.
</p>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Qdrant", "RAG", "Embeddings", "FastAPI"].map((tag) => (
<span key={tag} className="rounded-md border border-white/5 bg-white/[0.05] px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 5 */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl border border-blue-600/20 bg-blue-600/10 text-blue-500 shadow-inner">
<Layers className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-blue-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">پرتال‌های سازمانی و کارتابل</h3>
<p className="mt-2 text-xs leading-relaxed text-neutral-400 md:text-sm">
طراحی پنل‌های مدیریت فرآیندها (BPMS)، فرم‌سازهای پویا و ماژول‌های سازمانی یکپارچه.
</p>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Filament 3", "Next.js", "TypeScript", "Tailwind"].map((tag) => (
<span key={tag} className="rounded-md border border-white/5 bg-white/[0.05] px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 6 */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl border border-blue-600/20 bg-blue-600/10 text-blue-500 shadow-inner">
<ShieldCheck className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-blue-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">امنیت، هویت و دسترسی</h3>
<p className="mt-2 text-xs leading-relaxed text-neutral-400 md:text-sm">
پیاده‌سازی احراز هویت متمرکز (SSO)، پروتکل‌های OAuth2/OpenID و سیستم‌های RBAC پیشرفته.
</p>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["OAuth2", "SSO", "RBAC", "JWT"].map((tag) => (
<span key={tag} className="rounded-md border border-white/5 bg-white/[0.05] px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-cyan-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">اتوماسیون زیرساخت و CI/CD</h3>
<p className="mt-2 text-xs md:text-sm text-neutral-400 leading-relaxed">
استقرار پیوسته، کانتینرسازی و مانیتورینگ سلامت سرویس‌ها بدون وقفه عملیاتی (Zero-Downtime).
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3 font-mono text-[11px] space-y-1">
<div className="text-emerald-400 flex items-center justify-between">
<span>Deployment Status:</span>
<span>Automated</span>
</div>
<div className="text-neutral-400 flex items-center justify-between text-[10px]">
<span>Pipeline Stage:</span>
<span>Success (CI/CD)</span>
</div>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Docker", "CI/CD", "Kubernetes", "Linux"].map((tag) => (
<span key={tag} className="rounded-md bg-white/[0.05] border border-white/5 px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 3: Data Engineering & Messaging */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl bg-purple-500/10 text-purple-400 border border-purple-500/20 shadow-inner">
<Database className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-purple-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">مهندسی داده و Event-Driven</h3>
<p className="mt-2 text-xs md:text-sm text-neutral-400 leading-relaxed">
پیاده‌سازی پایگاه‌های داده رابطه‌ای و NoSQL، کشینگ هوشمند و معماری پیام‌محور نامتقارن.
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3 font-mono text-xs flex justify-between items-center">
<span className="text-neutral-400">Queue Ingestion:</span>
<span className="text-purple-400 font-semibold">Kafka / RabbitMQ</span>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["PostgreSQL", "Redis", "Kafka", "RabbitMQ"].map((tag) => (
<span key={tag} className="rounded-md bg-white/[0.05] border border-white/5 px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 4: AI & Vector Databases */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl bg-amber-500/10 text-amber-400 border border-amber-500/20 shadow-inner">
<Cpu className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-amber-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">جستجوی معنایی و هوش مصنوعی</h3>
<p className="mt-2 text-xs md:text-sm text-neutral-400 leading-relaxed">
استخراج اطلاعات، تعبیه‌سازی وکتورها و بازیابی فوق‌سریع در پایگاه‌های داده معنایی.
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3 font-mono text-xs flex justify-between items-center">
<span className="text-neutral-400">Vector Dimension:</span>
<span className="text-amber-400 font-semibold">1536d (HNSW)</span>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Qdrant", "RAG", "Embeddings", "FastAPI"].map((tag) => (
<span key={tag} className="rounded-md bg-white/[0.05] border border-white/5 px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 5: Enterprise Portals & Workflows */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl bg-emerald-500/10 text-emerald-400 border border-emerald-500/20 shadow-inner">
<Layers className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-emerald-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">پرتال‌های سازمانی و کارتابل</h3>
<p className="mt-2 text-xs md:text-sm text-neutral-400 leading-relaxed">
طراحی پنل‌های مدیریت فرآیندها (BPMS)، فرم‌سازهای پویا و ماژول‌های سازمانی یکپارچه.
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3 font-mono text-xs flex justify-between items-center">
<span className="text-neutral-400">Workflow Engine:</span>
<span className="text-emerald-400 font-semibold">Active State</span>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["Filament 3", "Next.js", "TypeScript", "Tailwind"].map((tag) => (
<span key={tag} className="rounded-md bg-white/[0.05] border border-white/5 px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
{/* Card 6: Enterprise Security & Auth */}
<SpotlightCard>
<div>
<div className="flex items-center justify-between">
<div className="flex h-11 w-11 items-center justify-center rounded-xl bg-rose-500/10 text-rose-400 border border-rose-500/20 shadow-inner">
<ShieldCheck className="h-5 w-5" />
</div>
<ArrowUpLeft className="h-5 w-5 text-neutral-500 transition-transform group-hover:-translate-x-1 group-hover:-translate-y-1 group-hover:text-rose-400" />
</div>
<h3 className="mt-5 text-lg font-bold text-white">امنیت، هویت و دسترسی سازمانی</h3>
<p className="mt-2 text-xs md:text-sm text-neutral-400 leading-relaxed">
پیاده‌سازی احراز هویت متمرکز (SSO)، پروتکل‌های OAuth2/OpenID و سیستم‌های RBAC پیشرفته.
</p>
</div>
<div className="mt-6 rounded-xl border border-white/5 bg-neutral-950/60 p-3 font-mono text-xs flex justify-between items-center">
<span className="text-neutral-400 flex items-center gap-1.5">
<Lock className="h-3 w-3 text-rose-400" />
Audit Logging:
</span>
<span className="text-rose-400 font-semibold">Encrypted (AES-256)</span>
</div>
<div className="mt-6 flex flex-wrap gap-1.5">
{["OAuth2", "SSO", "RBAC", "JWT"].map((tag) => (
<span key={tag} className="rounded-md bg-white/[0.05] border border-white/5 px-2 py-0.5 font-mono text-[11px] text-neutral-300">
{tag}
</span>
))}
</div>
</SpotlightCard>
</div>
</div>
</section>
);
</section>
);
}
export default ServicesBentoGrid;
+2 -2
View File
@@ -126,8 +126,8 @@ export function Footer() {
{/* نوار پایینی */}
<div className="pt-8 border-t border-gray-900/80 flex flex-col sm:flex-row items-center justify-between gap-4 text-xs text-gray-500">
<div className="flex items-center gap-2">
<span>© {new Date().getFullYear()}</span>
<span>•</span>
<span></span>
<span>طراحی و توسعه برای دسترس‌پذیری بالا و مقیاس‌پذیری</span>
</div>
+3 -3
View File
@@ -45,11 +45,11 @@ export default function Header() {
<div className="max-w-6xl mx-auto px-6 flex items-center justify-between">
{/* لوگو */}
<Link href="/" className="relative z-50 flex items-center gap-2">
<div className="w-8 h-8 rounded-lg bg-gradient-to-tr from-blue-600 to-blue-400 flex items-center justify-center">
{/* <div className="w-8 h-8 rounded-lg bg-gradient-to-tr from-blue-600 to-blue-400 flex items-center justify-center">
<span className="text-white font-bold text-lg">Z</span>
</div>
</div>*/}
<span className="text-neutral-50 font-medium tracking-wide">
ژرفا نوآوری داده
ژرفانوآوری داده و آینده
</span>
</Link>