- اتصال کامل فرانت به API: همه محتوای سایت (پروژهها، مقالات، خدمات، برند و...) از بکاند خوانده میشود (SiteProvider + useSite) - فرم تماس و خبرنامه متصل به بکاند و تستشده در مرورگر - ساختار مونوریپو: frontend/ + backend/ - Dockerfile برای هر دو بخش + docker-compose (PostgreSQL + FastAPI + nginx) - nginx با پروکسی /api — بدون نیاز به CORS در حالت داکر - README کامل فارسی
42 lines
1.9 KiB
TypeScript
42 lines
1.9 KiB
TypeScript
import React from 'react'
|
|
import { Reveal } from '../Reveal'
|
|
import { ServiceIcon } from '../ServiceIcon'
|
|
import { useSite } from '../../api'
|
|
|
|
export function Services() {
|
|
const { services } = useSite()
|
|
return (
|
|
<section className="bg-ink py-24 lg:py-32" aria-labelledby="services-title">
|
|
<div className="mx-auto max-w-site px-6 lg:px-10">
|
|
<Reveal className="max-w-2xl text-right">
|
|
|
|
<h2 id="services-title" className="text-section font-bold text-ivory">
|
|
خدمات
|
|
</h2>
|
|
<p className="mt-5 text-base font-light leading-9 text-ivory/60">
|
|
از نخستین خط روی کاغذ تا تحویل کلید، مدیریت سرمایه و طراحی محوطه؛ همه مراحل در یک مجموعه و زیر یک نظام
|
|
کنترل کیفیت.
|
|
</p>
|
|
<div className="mt-6 h-px w-24 bg-copper/70" />
|
|
</Reveal>
|
|
|
|
<div className="mt-14 grid gap-5 sm:grid-cols-2 lg:grid-cols-4">
|
|
{services.map((service, i) => (
|
|
<Reveal key={service.title} delay={0.04 * i} className="h-full">
|
|
<article className="group flex h-full flex-col items-center border border-ivory/10 bg-char p-8 text-center transition-all duration-300 ease-out hover:-translate-y-2 hover:border-copper/40 hover:shadow-lift transform-gpu will-change-transform">
|
|
<ServiceIcon
|
|
name={service.icon}
|
|
className="h-12 w-12 text-copper/85 transition-colors duration-300 ease-out group-hover:text-copper"
|
|
/>
|
|
<h3 className="mt-6 text-lg font-bold text-ivory transition-colors duration-300 ease-out group-hover:text-copper">
|
|
{service.title}
|
|
</h3>
|
|
<p className="mt-3 text-sm font-light leading-8 text-ivory/55">{service.desc}</p>
|
|
</article>
|
|
</Reveal>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
)
|
|
} |