a
This commit is contained in:
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user