diff --git a/src/components/about/omniyat-about.css b/src/components/about/omniyat-about.css
deleted file mode 100644
index 3559398..0000000
--- a/src/components/about/omniyat-about.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.oas-about{background:#fff;color:#111a3b;overflow-x:clip}.oas-about h1,.oas-about h2,.oas-about h3,.oas-about p{margin:0}.oas-shade{position:absolute;inset:0;background:linear-gradient(0deg,rgba(4,9,18,.58),rgba(4,9,18,.08) 60%)}
-.oas-hero{position:relative;height:150svh;min-height:900px;background:#111}.oas-hero-media{position:sticky;top:0;width:100%;height:100svh;overflow:hidden}.oas-hero video{display:block;width:100%;height:100%;object-fit:cover}.oas-hero-media>.oas-shade{position:absolute;inset:0}.oas-hero-title{position:absolute;z-index:2;top:40%;left:5%;right:5%;text-align:center;color:#fff}.oas-hero-title h1,.oas-hero-title h2{font-size:clamp(34px,4.6vw,67px);font-weight:300;line-height:1.35;color:#fff}.oas-hero-title h2{margin-top:5px}
-.oas-story{padding:145px 5vw 0}.oas-copy{max-width:1360px;margin:auto;text-align:center}.oas-copy>span,.oas-section-heading>span{display:block;color:#9a8568;font-size:12px;letter-spacing:.08em}.oas-copy h2{max-width:1100px;margin:42px auto 55px;font-size:clamp(30px,calc(5.5vw - 25px),54px);font-weight:300;line-height:1.25}.oas-copy>div{display:grid;gap:54px;max-width:1190px;margin:auto;color:#111a3b;font-size:clamp(16px,1.55vw,22px);line-height:2;text-align:center}.oas-copy>div p{max-width:1150px;margin-inline:auto}.oas-stats{display:grid;grid-template-columns:repeat(3,1fr);max-width:1060px;margin:150px auto 180px}.oas-stats div{display:flex;min-height:128px;flex-direction:column;justify-content:center;gap:10px;padding-inline:32px;border-inline-start:1px solid #c9cbd3}.oas-stats strong{font-size:clamp(50px,6vw,84px);font-weight:300;line-height:1}.oas-stats span{color:#777b85;font-size:14px}.oas-copy-secondary{padding-bottom:160px}.oas-copy-secondary>div{max-width:1100px}
-.oas-timeline{position:relative;height:100vh;height:100svh;min-height:650px;background:#111;overflow:hidden}.oas-timeline>.swiper{position:absolute;inset:0;height:auto}.oas-timeline .swiper-wrapper,.oas-timeline .swiper-slide,.oas-timeline article{height:100%}.oas-timeline article{position:relative;overflow:hidden;background:#111}.oas-timeline-media{position:absolute;z-index:0;inset:0;background-position:center;background-size:cover;background-repeat:no-repeat}.oas-timeline article>.oas-shade{z-index:1}.oas-timeline-caption{position:absolute;z-index:2;right:7%;bottom:12%;direction:rtl;color:#fff}.oas-timeline-caption small{font-size:12px}.oas-timeline-caption h3{max-width:700px;margin:12px 0 25px;font-size:clamp(37px,5vw,72px);font-weight:300;color:#fff}.oas-timeline-caption a{display:inline-block;border-bottom:1px solid #fff;padding-bottom:8px;color:#fff;font-size:13px}.oas-carousel-buttons{position:absolute;z-index:5;left:5%;bottom:8%;display:flex;gap:12px}.oas-carousel-buttons button{display:grid;width:48px;height:48px;place-items:center;border:1px solid rgba(255,255,255,.7);border-radius:50%;background:transparent;color:#fff;font-size:21px;cursor:pointer;transition:.3s}.oas-carousel-buttons button:hover{background:#fff;color:#111a3b}.oas-timeline-dots{position:absolute;z-index:5;right:7%;left:18%;bottom:6%;display:flex;direction:ltr}.oas-timeline-dots button{height:2px;flex:1;border:0;background:rgba(255,255,255,.35);padding:0;cursor:pointer}.oas-timeline-dots button.is-active{background:#fff}
-.oas-pillars{padding:150px 0;background:#f1efec}.oas-section-heading{width:min(1180px,90%);margin:0 auto 90px;text-align:center}.oas-section-heading h2{margin-top:25px;font-size:clamp(39px,5vw,70px);font-weight:300;line-height:1.25}.oas-section-heading p{max-width:760px;margin:28px auto 0;color:#676b75;line-height:2}.oas-pillar-carousel{position:relative;padding-left:2vw;padding-bottom:115px}.oas-pillar-carousel .swiper-slide{width:38vw;height:auto}.oas-pillar-carousel article{display:grid;height:19vw;grid-template-columns:1fr 1fr;background:#fff}.oas-pillar-image{position:relative;min-height:0;overflow:hidden}.oas-pillar-image img{object-fit:cover;transition:transform .8s}.oas-pillar-carousel article:hover img{transform:scale(1.035)}.oas-pillar-copy{display:flex;min-width:0;flex-direction:column;justify-content:space-between;padding:clamp(14px,1.8vw,44px) clamp(14px,1.5vw,36px);background:#fff;direction:rtl;text-align:right}.oas-pillar-carousel h3{margin:0;font-size:clamp(18px,1.65vw,36px);font-weight:300;line-height:1.35}.oas-pillar-carousel p{margin:0;color:#111a3b;font-size:clamp(11px,.9vw,16px);line-height:1.8}.oas-pillar-progress{position:absolute;z-index:4;right:38%;bottom:45px;width:23%;height:2px;background:#d0cfcc;overflow:hidden;direction:ltr}.oas-pillar-progress span{display:block;height:100%;background:#111a3b;transition:transform .7s cubic-bezier(.22,1,.36,1)}.oas-pillar-buttons{right:5vw;bottom:22px;left:auto;direction:ltr}.oas-pillar-buttons button{border:0;color:#111a3b;font-size:34px}.oas-pillar-buttons button:hover{background:transparent;color:#9a8568}.oas-statements{display:grid;grid-template-columns:1fr 1fr;gap:12vw;width:min(1060px,85%);margin:120px auto 0}.oas-statements p{font-size:clamp(20px,2.1vw,29px);font-weight:300;line-height:1.9}
-.oas-founder{padding:145px 0 0}.oas-founder-image{display:block;width:100%;height:min(58vw,760px);overflow:hidden}.oas-founder-image img{width:100%;height:100%;object-fit:cover}.oas-founder-copy{display:grid;grid-template-columns:.8fr 1.2fr;gap:10vw;width:min(1160px,90%);margin:90px auto 150px}.oas-founder-copy h3{font-size:clamp(30px,3vw,47px);font-weight:300}.oas-founder-copy span{display:block;margin-top:10px;color:#9a8568}.oas-founder-copy p{color:#575c6b;font-size:16px;line-height:2.1}
-.oas-enquire{position:relative;height:650px;margin:0 5vw 80px;overflow:hidden}.oas-enquire video{width:100%;height:100%;object-fit:cover}.oas-enquire-copy{position:absolute;z-index:2;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;color:#fff}.oas-enquire-copy span{font-size:12px}.oas-enquire-copy h2{margin:18px 0 5px;font-size:clamp(42px,5vw,72px);font-weight:300;color:#fff}.oas-enquire-copy p{margin-bottom:35px}.oas-enquire-copy a{min-width:220px;border:1px solid #fff;padding:13px 25px;color:#fff;transition:.3s}.oas-enquire-copy a:hover{background:#fff;color:#111a3b}
-.oas-reveal{opacity:0;transform:translateY(35px);transition:opacity .9s cubic-bezier(.22,1,.36,1),transform .9s cubic-bezier(.22,1,.36,1)}.oas-reveal.is-visible{opacity:1;transform:none}
-@media(max-width:700px){.oas-hero{height:120svh;min-height:720px}.oas-hero-title{top:36%}.oas-hero-title h1,.oas-hero-title h2{font-size:clamp(33px,9vw,50px)}.oas-story{padding:95px 22px 0}.oas-copy h2{margin:28px auto 38px;font-size:clamp(38px,10vw,52px)}.oas-copy>div{gap:32px;font-size:14px;line-height:2.15}.oas-stats{margin:90px 0 105px}.oas-stats div{min-height:95px;padding-inline:10px}.oas-stats strong{font-size:clamp(38px,11vw,56px)}.oas-stats span{font-size:10px}.oas-copy-secondary{padding-bottom:100px}.oas-timeline{height:78svh;min-height:570px}.oas-timeline-caption{right:25px;left:25px;bottom:18%}.oas-timeline-caption h3{font-size:36px}.oas-carousel-buttons{left:22px;bottom:5%}.oas-timeline-dots{right:22px;left:140px;bottom:8%}.oas-pillars{padding:100px 0}.oas-section-heading{margin-bottom:60px}.oas-section-heading h2{font-size:clamp(38px,10vw,54px)}.oas-section-heading p{font-size:14px}.oas-pillar-carousel{padding-left:18px;padding-bottom:100px}.oas-pillar-carousel .swiper-slide{width:88vw}.oas-pillar-carousel article{height:auto;min-height:0;grid-template-columns:1fr;aspect-ratio:auto}.oas-pillar-image{min-height:0;aspect-ratio:1}.oas-pillar-copy{min-height:260px;padding:30px 24px}.oas-pillar-carousel h3{font-size:24px}.oas-pillar-carousel p{font-size:14px}.oas-pillar-progress{right:150px;bottom:42px;width:calc(100% - 175px)}.oas-pillar-buttons{right:18px;bottom:19px;left:auto}.oas-statements{grid-template-columns:1fr;gap:55px;margin-top:80px}.oas-statements p{font-size:20px}.oas-founder{padding-top:100px}.oas-founder-image{height:125vw;max-height:680px}.oas-founder-copy{grid-template-columns:1fr;gap:35px;margin-block:65px 100px}.oas-founder-copy p{font-size:14px}.oas-enquire{height:560px;margin:0}.oas-enquire-copy{padding:25px}.oas-enquire-copy p{font-size:14px}}
-@media(prefers-reduced-motion:reduce){.oas-reveal{opacity:1;transform:none}.oas-pillar-image img{transition:none}}
diff --git a/src/components/about/raoofi-about.css b/src/components/about/raoofi-about.css
new file mode 100644
index 0000000..20f7b93
--- /dev/null
+++ b/src/components/about/raoofi-about.css
@@ -0,0 +1,10 @@
+.oas-about{background:#fff;color:#111a3b;overflow-x:clip}.oas-about h1,.oas-about h2,.oas-about h3,.oas-about p{margin:0}.oas-shade{position:absolute;inset:0;background:linear-gradient(0deg,rgba(4,9,18,.58),rgba(4,9,18,.08) 60%)}
+.oas-hero{position:relative;height:150svh;min-height:900px;background:#111}.oas-hero-media{position:sticky;top:0;width:100%;height:100svh;overflow:hidden}.oas-hero video{display:block;width:100%;height:100%;object-fit:cover}.oas-hero-media>.oas-shade{position:absolute;inset:0}.oas-hero-title{position:absolute;z-index:2;top:40%;left:5%;right:5%;text-align:center;color:#fff}.oas-hero-title h1,.oas-hero-title h2{font-size:clamp(30px,3.5vw,52px);font-weight:700;line-height:1.35;color:#fff}.oas-hero-title h2{margin-top:5px}
+.oas-story{padding:145px 5vw 0}.oas-copy{max-width:1360px;margin:auto;text-align:center}.oas-copy>span,.oas-section-heading>span{display:block;color:#9a8568;font-size:12px;letter-spacing:.08em}.oas-copy h2{max-width:900px;margin:38px auto 50px;font-size:clamp(28px,3vw,42px);font-weight:700;line-height:1.35}.oas-copy>div{display:grid;gap:54px;max-width:1190px;margin:auto;color:#111a3b;font-size:clamp(16px,1.55vw,22px);line-height:2;text-align:center}.oas-copy>div p{max-width:1150px;margin-inline:auto}.oas-stats{display:grid;grid-template-columns:repeat(3,1fr);max-width:1060px;margin:150px auto 180px}.oas-stats div{display:flex;min-height:128px;flex-direction:column;justify-content:center;gap:10px;padding-inline:32px;border-inline-start:1px solid #c9cbd3}.oas-stats strong{font-size:clamp(50px,6vw,84px);font-weight:700;line-height:1}.oas-stats span{color:#777b85;font-size:14px}.oas-copy-secondary{padding-bottom:160px}.oas-copy-secondary>div{max-width:1100px}
+.oas-timeline{position:relative;height:100vh;height:100svh;min-height:650px;background:#111;overflow:hidden}.oas-timeline>.swiper{position:absolute;inset:0;height:auto}.oas-timeline .swiper-wrapper,.oas-timeline .swiper-slide,.oas-timeline article{height:100%}.oas-timeline article{position:relative;overflow:hidden;background:#111}.oas-timeline-media{position:absolute;z-index:0;inset:0;background-position:center;background-size:cover;background-repeat:no-repeat}.oas-timeline article>.oas-shade{z-index:1}.oas-timeline-caption{position:absolute;z-index:2;right:7%;bottom:12%;direction:rtl;color:#fff}.oas-timeline-caption small{font-size:12px}.oas-timeline-caption h3{max-width:700px;margin:12px 0 25px;font-size:clamp(28px,3.5vw,46px);font-weight:700;color:#fff}.oas-timeline-caption a{display:inline-block;border-bottom:1px solid #fff;padding-bottom:8px;color:#fff;font-size:13px}.oas-carousel-buttons{position:absolute;z-index:5;left:5%;bottom:8%;display:flex;gap:12px}.oas-carousel-buttons button{display:grid;width:48px;height:48px;place-items:center;border:1px solid rgba(255,255,255,.7);border-radius:50%;background:transparent;color:#fff;font-size:21px;cursor:pointer;transition:.3s}.oas-carousel-buttons button:hover{background:#fff;color:#111a3b}.oas-timeline-dots{position:absolute;z-index:5;right:7%;left:18%;bottom:6%;display:flex;direction:ltr}.oas-timeline-dots button{height:2px;flex:1;border:0;background:rgba(255,255,255,.35);padding:0;cursor:pointer}.oas-timeline-dots button.is-active{background:#fff}
+.oas-pillars{padding:150px 0;background:#f1efec}.oas-section-heading{width:min(1180px,90%);margin:0 auto 90px;text-align:center}.oas-section-heading h2{margin-top:25px;font-size:clamp(28px,3vw,44px);font-weight:700;line-height:1.35}.oas-section-heading p{max-width:760px;margin:28px auto 0;color:#676b75;line-height:2}.oas-statements{display:grid;grid-template-columns:1fr 1fr;gap:12vw;width:min(1060px,85%);margin:120px auto 0}.oas-statements p{font-size:clamp(20px,2.1vw,29px);font-weight:300;line-height:1.9}
+.oas-founder{padding:145px 0 0}.oas-founder-image{display:block;width:100%;height:min(58vw,760px);overflow:hidden}.oas-founder-image img{width:100%;height:100%;object-fit:cover}.oas-founder-copy{display:grid;grid-template-columns:.8fr 1.2fr;gap:10vw;width:min(1160px,90%);margin:90px auto 150px}.oas-founder-copy h3{font-size:clamp(24px,2.4vw,36px);font-weight:700}.oas-founder-copy span{display:block;margin-top:10px;color:#9a8568}.oas-founder-copy p{color:#575c6b;font-size:16px;line-height:2.1}
+.oas-enquire{position:relative;height:650px;margin:0 5vw 80px;overflow:hidden}.oas-enquire video{width:100%;height:100%;object-fit:cover}.oas-enquire-copy{position:absolute;z-index:2;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;text-align:center;color:#fff}.oas-enquire-copy span{font-size:12px}.oas-enquire-copy h2{margin:18px 0 5px;font-size:clamp(30px,3.2vw,46px);font-weight:700;color:#fff}.oas-enquire-copy p{margin-bottom:35px}.oas-enquire-copy a{min-width:220px;border:1px solid #fff;padding:13px 25px;color:#fff;transition:.3s}.oas-enquire-copy a:hover{background:#fff;color:#111a3b}
+.oas-reveal{opacity:0;transform:translateY(35px);transition:opacity .9s cubic-bezier(.22,1,.36,1),transform .9s cubic-bezier(.22,1,.36,1)}.oas-reveal.is-visible{opacity:1;transform:none}
+@media(max-width:700px){.oas-hero{height:120svh;min-height:720px}.oas-hero-title{top:36%}.oas-hero-title h1,.oas-hero-title h2{font-size:clamp(28px,8vw,38px)}.oas-story{padding:95px 22px 0}.oas-copy h2{margin:28px auto 38px;font-size:clamp(28px,8vw,38px)}.oas-copy>div{gap:32px;font-size:14px;line-height:2.15}.oas-stats{margin:90px 0 105px}.oas-stats div{min-height:95px;padding-inline:10px}.oas-stats strong{font-size:clamp(38px,11vw,56px)}.oas-stats span{font-size:10px}.oas-copy-secondary{padding-bottom:100px}.oas-timeline{height:78svh;min-height:570px}.oas-timeline-caption{right:25px;left:25px;bottom:18%}.oas-timeline-caption h3{font-size:30px}.oas-carousel-buttons{left:22px;bottom:5%}.oas-timeline-dots{right:22px;left:140px;bottom:8%}.oas-pillars{padding:100px 0}.oas-section-heading{margin-bottom:60px}.oas-section-heading h2{font-size:clamp(28px,8vw,38px)}.oas-section-heading p{font-size:14px}.oas-statements{grid-template-columns:1fr;gap:55px;margin-top:80px}.oas-statements p{font-size:20px}.oas-founder{padding-top:100px}.oas-founder-image{height:125vw;max-height:680px}.oas-founder-copy{grid-template-columns:1fr;gap:35px;margin-block:65px 100px}.oas-founder-copy p{font-size:14px}.oas-enquire{height:560px;margin:0}.oas-enquire-copy{padding:25px}.oas-enquire-copy p{font-size:14px}}
+@media(prefers-reduced-motion:reduce){.oas-reveal{opacity:1;transform:none}}
diff --git a/src/components/atelier/RaoofiAtelier.tsx b/src/components/atelier/RaoofiAtelier.tsx
new file mode 100644
index 0000000..4e63e23
--- /dev/null
+++ b/src/components/atelier/RaoofiAtelier.tsx
@@ -0,0 +1,127 @@
+"use client";
+
+import Image from "next/image";
+import { useEffect, useRef, useState } from "react";
+import type { Swiper as SwiperInstance } from "swiper";
+import { Swiper, SwiperSlide } from "swiper/react";
+import "swiper/css";
+
+import "./raoofi-atelier.css";
+
+const media = (name: string) => `/raoofi-media/atelier/${name}`;
+
+const collection = [
+ { image: media("collection-1.webp"), title: "اقامتگاهی فراتر از تعریف", subtitle: "فضایی برای یک زندگی یگانه" },
+ { image: media("collection-2.webp"), title: "خانهای در اوج آسمان", subtitle: "روایتی شخصی از آرامش" },
+ { image: media("collection-3.webp"), title: "شاهکاری برای یک نفر", subtitle: "طراحیشده برای ماندن" },
+];
+
+export function RaoofiAtelier() {
+ const galleryRef = useRef
(null);
+ const [activeSlide, setActiveSlide] = useState(0);
+
+ useEffect(() => {
+ const observer = new IntersectionObserver(
+ (entries) => entries.forEach((entry) => entry.isIntersecting && entry.target.classList.add("is-visible")),
+ { threshold: 0.12 },
+ );
+ document.querySelectorAll(".atelier-reveal").forEach((element) => observer.observe(element));
+ return () => observer.disconnect();
+ }, []);
+
+ return (
+
+
+
+
+
+ آتلیه رئوفی
+ هنرِ خلق یک زندگی منحصربهفرد
+
+ کشف مجموعه
+ ⌄
+
+
+
+ آتلیه رئوفی
+ همکاری در بالاترین سطح
+
+
آتلیه رئوفی برای کسانی شکل گرفته است که معیارهای زندگی خود را تعریف میکنند و میخواهند چشمانداز شخصیشان در تمام جزئیات فضا دیده شود.
+
این مسیر با همراهی معماران، طراحان و استادکاران برجسته، کمیابترین ایدهها را به آثاری دقیق و ماندگار تبدیل میکند.
+
ریشه در هنر، مهندسی و ساخت سفارشی دارد؛ تعریفی امروزی از کیفیت که عمیقاً شخصی و همواره یگانه است.
+
+
+
+
+
+
+ خلق منحصربهفرد
+ آثاری که تنها یکبار ساخته میشوند
+
+
هر پروژه پاسخی اختصاصی به شیوه زندگی، خواستهها و رویاهای صاحب آن است؛ اثری که از تعریفهای معمول تجمل و شکوه فراتر میرود.
+
از معماری و طراحی داخلی تا انتخاب هنر، متریال و جزئیات نهایی، همهچیز برای شکلدادن به یک جهان کاملاً شخصی کنار هم قرار میگیرد.
+
نتیجه، مجموعهای محدود از فضاهای کمیاب است که مشابهی ندارند و با گذر زمان ارزشمندتر میشوند.
+
+
+
+
+
+
+
مسیر آتلیه رئوفی با یک چشمانداز روشن آغاز شد: جابهجایی معیارهای بازار از طریق پروژههایی که در طراحی، کیفیت ساخت و تجربه زندگی پیشگام هستند.
+
+
+
+
هر اثر تازه، استاندارد قبلی را پشت سر میگذارد. پیوستگی میان ایده، طراحی و اجرا باعث میشود هر خانه هویتی مستقل و کیفیتی تکرارنشدنی پیدا کند.
+
+
+
+
+
+ مجموعه آتلیه
+ فصلی تازه از یک زندگی استثنایی
+
+
+
{ galleryRef.current = swiper; setActiveSlide(swiper.realIndex); }}
+ onSlideChange={(swiper) => setActiveSlide(swiper.realIndex)}
+ >
+ {collection.map((item) => (
+
+
+
+
+ {item.subtitle}
{item.title}
+
+
+ ))}
+
+
+ {collection.map((item, index) =>
+
+
+
+
+
+
+
+
+ شوقِ جانبخشیدن به رویاها و چشماندازهای کسانی که آینده را میسازند، تعهد استوار آتلیه رئوفی را به تصور امر خارقالعاده و تبدیل آن به واقعیت شکل میدهد.
+ آثار منحصربهفرد و معیارساز آتلیه رئوفی، خانهها و پناهگاههایی برای اندیشمندان، رهبران و سازندگان فرداست؛ فضاهایی برای کسانی که جسارت متفاوتبودن دارند.
+
+
+ );
+}
diff --git a/src/components/atelier/raoofi-atelier.css b/src/components/atelier/raoofi-atelier.css
new file mode 100644
index 0000000..e6fe34f
--- /dev/null
+++ b/src/components/atelier/raoofi-atelier.css
@@ -0,0 +1,10 @@
+.atelier-page{overflow-x:clip;background:#f4f3f0;color:#10183b}.atelier-page h1,.atelier-page h2,.atelier-page h3,.atelier-page p{margin:0}.atelier-shade{position:absolute;inset:0;background:linear-gradient(0deg,rgba(5,8,15,.5),rgba(5,8,15,.04) 62%)}
+.atelier-hero{position:relative;height:100svh;min-height:650px;overflow:hidden;background:#111}.atelier-hero video{width:100%;height:100%;object-fit:cover}.atelier-hero__brand{position:absolute;z-index:2;top:49%;right:0;left:0;display:flex;align-items:center;flex-direction:column;padding:30px 20px;background:rgba(7,10,15,.58);backdrop-filter:blur(16px);color:#fff;text-align:center}.atelier-hero__brand strong{font-size:clamp(34px,4vw,58px);font-weight:700;line-height:1.35}.atelier-hero__brand span{margin-top:12px;font-size:13px;letter-spacing:.08em}.atelier-hero__link{position:absolute;z-index:2;top:112px;left:50%;transform:translateX(-50%);border-bottom:1px solid rgba(255,255,255,.75);padding-bottom:6px;color:#fff;font-size:12px}.atelier-scroll{position:absolute;z-index:2;bottom:22px;left:50%;color:#fff;font-size:32px;animation:atelier-bob 1.8s ease-in-out infinite}
+.atelier-intro{width:min(1040px,86%);margin:auto;padding:150px 0;text-align:center}.atelier-intro>span,.atelier-section-title>span{display:block;color:#9b8668;font-size:12px;letter-spacing:.08em}.atelier-intro h1,.atelier-intro h2,.atelier-section-title h2{margin:28px auto 45px;font-size:clamp(28px,3.2vw,46px);font-weight:700;line-height:1.45}.atelier-intro>div{display:grid;gap:34px;font-size:clamp(15px,1.25vw,19px);line-height:2}.atelier-intro--second{padding-top:165px}
+.atelier-wide-image{position:relative;height:min(68vw,850px);overflow:hidden;background:#ddd}.atelier-wide-image img,.atelier-editorial img{object-fit:cover}
+.atelier-editorial{padding:0 4vw 150px}.atelier-editorial__pair{display:grid;grid-template-columns:1fr 1fr;gap:3vw}.atelier-editorial__image{position:relative;height:46vw;max-height:720px;overflow:hidden}.atelier-editorial__copy{width:min(760px,86%);margin:90px auto;font-size:clamp(17px,1.7vw,24px);font-weight:500;line-height:2;text-align:center}.atelier-editorial__feature{display:grid;grid-template-columns:1.35fr .65fr;align-items:stretch;gap:0;background:#fff}.atelier-editorial__feature .atelier-editorial__image{height:48vw;max-height:760px}.atelier-editorial__feature .atelier-editorial__copy{display:flex;align-items:center;width:auto;margin:0;padding:8vw 5vw;font-size:clamp(16px,1.45vw,21px);text-align:right}
+.atelier-collection{padding:145px 0 0;background:#fff}.atelier-section-title{width:min(980px,88%);margin:0 auto 90px;text-align:center}.atelier-gallery{position:relative;height:min(72vw,850px);overflow:hidden;background:#111}.atelier-gallery .swiper,.atelier-gallery .swiper-wrapper,.atelier-gallery .swiper-slide,.atelier-gallery article{height:100%}.atelier-gallery article{position:relative}.atelier-gallery article>img{object-fit:cover}.atelier-gallery__caption{position:absolute;z-index:2;right:7%;bottom:13%;color:#fff}.atelier-gallery__caption small{font-size:13px}.atelier-gallery__caption h3{max-width:700px;margin-top:12px;color:#fff;font-size:clamp(28px,3.4vw,46px);font-weight:700}.atelier-gallery__progress{position:absolute;z-index:4;right:7%;bottom:6%;left:22%;display:flex;direction:ltr}.atelier-gallery__progress button{height:2px;flex:1;border:0;background:rgba(255,255,255,.35);padding:0}.atelier-gallery__progress button.is-active{background:#fff}.atelier-gallery__buttons{position:absolute;z-index:5;bottom:3%;left:5%;display:flex;gap:12px}.atelier-gallery__buttons button{display:grid;width:50px;height:50px;place-items:center;border:1px solid rgba(255,255,255,.75);border-radius:50%;background:transparent;color:#fff;font-size:21px;cursor:pointer}.atelier-gallery__buttons button:hover{background:#fff;color:#10183b}
+.atelier-manifesto{display:grid;gap:30px;width:min(820px,calc(100% - 40px));margin:auto;padding:105px 0 115px;color:#10183b;font-size:clamp(15px,1.15vw,18px);font-weight:500;line-height:1.9;text-align:center}
+.atelier-reveal{opacity:0;transform:translateY(34px);transition:opacity .9s cubic-bezier(.22,1,.36,1),transform .9s cubic-bezier(.22,1,.36,1)}.atelier-reveal.is-visible{opacity:1;transform:none}@keyframes atelier-bob{50%{transform:translateY(8px)}}
+@media(max-width:700px){.atelier-hero{min-height:620px}.atelier-hero__brand strong{font-size:34px}.atelier-hero__brand span{max-width:250px;font-size:11px}.atelier-hero__link{top:88px}.atelier-intro{width:calc(100% - 40px);padding:100px 0}.atelier-intro h1,.atelier-intro h2,.atelier-section-title h2{margin:24px auto 34px;font-size:clamp(28px,8vw,38px)}.atelier-intro>div{gap:26px;font-size:14px}.atelier-wide-image{height:120vw}.atelier-editorial{padding:0 18px 100px}.atelier-editorial__pair{grid-template-columns:1fr;gap:18px}.atelier-editorial__image{height:110vw}.atelier-editorial__pair>div:nth-child(2){height:80vw}.atelier-editorial__copy{margin:65px auto;font-size:17px}.atelier-editorial__feature{grid-template-columns:1fr}.atelier-editorial__feature .atelier-editorial__image{height:110vw}.atelier-editorial__feature .atelier-editorial__copy{padding:55px 25px}.atelier-collection{padding-top:100px}.atelier-section-title{margin-bottom:60px}.atelier-gallery{height:76svh;min-height:570px}.atelier-gallery__caption{right:24px;left:24px;bottom:18%}.atelier-gallery__caption h3{font-size:30px}.atelier-gallery__progress{right:22px;bottom:8%;left:140px}.atelier-gallery__buttons{bottom:5%;left:20px}.atelier-manifesto{gap:24px;padding:75px 0 85px;font-size:14px;line-height:2}}
+@media(prefers-reduced-motion:reduce){.atelier-reveal{opacity:1;transform:none}.atelier-scroll{animation:none}}
diff --git a/src/components/contact/ContactForm.tsx b/src/components/contact/ContactForm.tsx
index d5ac46f..79bce55 100644
--- a/src/components/contact/ContactForm.tsx
+++ b/src/components/contact/ContactForm.tsx
@@ -2,27 +2,39 @@
import { useState } from "react";
-import { contact, contactPage } from "@/data/site";
+import { contactPage } from "@/data/site";
type FormState = { name: string; phone: string; email: string; message: string };
type Errors = Partial>;
const EMPTY: FormState = { name: "", phone: "", email: "", message: "" };
-const IRAN_PHONE = /^0\d{10}$/;
+const IRAN_PHONE = /^(?:09\d{9}|\+989\d{9})$/;
const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
function toEnglishDigits(value: string) {
const persian = "۰۱۲۳۴۵۶۷۸۹";
- return value.replace(/[۰-۹]/g, (d) => String(persian.indexOf(d)));
+ const arabic = "٠١٢٣٤٥٦٧٨٩";
+ return value
+ .replace(/[۰-۹]/g, (digit) => String(persian.indexOf(digit)))
+ .replace(/[٠-٩]/g, (digit) => String(arabic.indexOf(digit)));
+}
+
+function normalizePhone(value: string) {
+ return toEnglishDigits(value).replace(/[\s()-]/g, "");
+}
+
+function toE164(value: string) {
+ const normalized = normalizePhone(value);
+ return normalized.startsWith("0") ? `+98${normalized.slice(1)}` : normalized;
}
function validate(form: FormState): Errors {
const errors: Errors = {};
if (!form.name.trim()) errors.name = "نام را وارد کنید.";
- const phone = toEnglishDigits(form.phone.trim());
+ const phone = normalizePhone(form.phone.trim());
if (!phone) errors.phone = "شماره تماس را وارد کنید.";
- else if (!IRAN_PHONE.test(phone)) errors.phone = "شماره تماس معتبر نیست (مثال: ۰۹۱۲۱۲۳۴۵۶۷).";
+ else if (!IRAN_PHONE.test(phone)) errors.phone = "شماره موبایل معتبر نیست (مثال: ۰۹۱۲۱۲۳۴۵۶۷).";
if (form.email.trim() && !EMAIL_PATTERN.test(form.email.trim())) {
errors.email = "ایمیل معتبر نیست.";
@@ -34,33 +46,56 @@ function validate(form: FormState): Errors {
}
const fieldClass =
- "w-full rounded-md border border-line bg-paper px-4 py-3 text-ink placeholder:text-muted/60 transition-colors duration-300 focus:border-gold focus:outline-none";
+ "w-full border-0 border-b border-line bg-transparent px-0 py-3 text-ink placeholder:text-muted/60 transition-colors duration-300 focus:border-gold focus:outline-none";
export function ContactForm() {
const [form, setForm] = useState(EMPTY);
const [errors, setErrors] = useState({});
- const [sent, setSent] = useState(false);
+ const [status, setStatus] = useState<{ kind: "success" | "error"; message: string } | null>(null);
+ const [isSubmitting, setIsSubmitting] = useState(false);
- const update = (field: keyof FormState) => (e: React.ChangeEvent) =>
- setForm((f) => ({ ...f, [field]: e.target.value }));
+ const update = (field: keyof FormState) => (e: React.ChangeEvent) => {
+ setForm((current) => ({ ...current, [field]: e.target.value }));
+ setErrors((current) => ({ ...current, [field]: undefined }));
+ setStatus(null);
+ };
- const handleSubmit = (e: React.FormEvent) => {
+ const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
const nextErrors = validate(form);
setErrors(nextErrors);
if (Object.keys(nextErrors).length > 0) return;
- // TODO: replace with POST /tenants/{domain}/contact-submissions once the
- // API is ready — for now this opens a pre-filled email as a real,
- // working fallback rather than faking a "sent" confirmation.
- const subject = encodeURIComponent(`پیام از سایت — ${form.name}`);
- const body = encodeURIComponent(
- `نام: ${form.name}\nتلفن: ${toEnglishDigits(form.phone)}${
- form.email ? `\nایمیل: ${form.email}` : ""
- }\n\nپیام:\n${form.message}`,
- );
- window.location.href = `mailto:${contact.email}?subject=${subject}&body=${body}`;
- setSent(true);
+ setIsSubmitting(true);
+ setStatus(null);
+
+ try {
+ const response = await fetch("/api/contact", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ name: form.name.trim(),
+ phone: toE164(form.phone),
+ email: form.email.trim(),
+ message: form.message.trim(),
+ }),
+ });
+ const result = (await response.json().catch(() => null)) as { message?: string } | null;
+
+ if (!response.ok) {
+ throw new Error(result?.message || "ارسال پیام انجام نشد. لطفاً دوباره تلاش کنید.");
+ }
+
+ setForm(EMPTY);
+ setStatus({ kind: "success", message: result?.message || "پیام شما با موفقیت ارسال شد." });
+ } catch (error) {
+ setStatus({
+ kind: "error",
+ message: error instanceof Error ? error.message : "ارسال پیام انجام نشد. لطفاً دوباره تلاش کنید.",
+ });
+ } finally {
+ setIsSubmitting(false);
+ }
};
return (
@@ -72,6 +107,9 @@ export function ContactForm() {
- {contactPage.form.submit}
+ {isSubmitting ? contactPage.form.submitting : contactPage.form.submit}
- {contactPage.form.fallbackNotice}
-
- {sent && (
-
- نرمافزار ایمیل شما باز شد — لطفاً پیام را از آنجا ارسال کنید.
+ {status && (
+
+ {status.message}
)}
diff --git a/src/components/omniyat/OmniyatHome.tsx b/src/components/home/RaoofiHome.tsx
similarity index 98%
rename from src/components/omniyat/OmniyatHome.tsx
rename to src/components/home/RaoofiHome.tsx
index 21f755f..6ad29a5 100644
--- a/src/components/omniyat/OmniyatHome.tsx
+++ b/src/components/home/RaoofiHome.tsx
@@ -9,9 +9,9 @@ import "swiper/css";
import logo from "@/assets/images/brand/logo.png";
import { contact } from "@/data/site";
-import "./omniyat-home.css";
+import "./raoofi-home.css";
-const asset = (name: string) => `/omniyat-reference/${name}`;
+const asset = (name: string) => `/raoofi-media/${name}`;
const stories: { title: string; image: string; href: string }[] = [
{ title: "گشایش فصل تازهای از زندگی در الیزیوم", image: asset("news-1.jpg"), href: "/news-and-blog" },
@@ -38,6 +38,7 @@ const menu = [
{ label: "صفحه اصلی", href: "/" },
{ label: "پروژهها", href: "/portfolios" },
{ label: "خدمات ما", href: "/our-services" },
+ { label: "آتلیه رئوفی", href: "/atelier" },
{ label: "داستان ما", href: "/aboutus" },
{ label: "اخبار", href: "/news-and-blog" },
{ label: "تماس با ما", href: "/contactus" },
@@ -47,7 +48,7 @@ function ArrowLink({ href, children }: { href: string; children: React.ReactNode
return {children}←;
}
-export function OmniyatHome() {
+export function RaoofiHome() {
const [menuOpen, setMenuOpen] = useState(false);
const [story, setStory] = useState(0);
const [scrolled, setScrolled] = useState(false);
diff --git a/src/components/omniyat/omniyat-home.css b/src/components/home/raoofi-home.css
similarity index 100%
rename from src/components/omniyat/omniyat-home.css
rename to src/components/home/raoofi-home.css
diff --git a/src/components/news/NewsArticleDetail.tsx b/src/components/news/NewsArticleDetail.tsx
index c0bef8e..244390b 100644
--- a/src/components/news/NewsArticleDetail.tsx
+++ b/src/components/news/NewsArticleDetail.tsx
@@ -47,13 +47,13 @@ export function NewsArticleDetail({
/>
{navItems.length > 1 && (
-