diff --git a/src/app/layout/Header.tsx b/src/app/layout/Header.tsx
index 9e14c5f..8adbb6b 100644
--- a/src/app/layout/Header.tsx
+++ b/src/app/layout/Header.tsx
@@ -42,7 +42,7 @@ const TOP_NAV: TopNav[] = [
{ fa: 'نبض صنعت', en: 'Industry Pulse', to: '/pulse' },
{ fa: 'رسانه و رویداد', en: 'Media & Events', dropdown: 'media' },
{ fa: 'در یک نگاه', en: 'At a Glance', to: '/at-a-glance' },
- { fa: 'شبکه خبرگان', en: 'Expert Network', to: '#' },
+ { fa: 'شبکه خبرگان', en: 'Expert Network', to: '/experts' },
{ fa: 'درباره ما', en: 'About', to: '#' },
]
diff --git a/src/app/router.tsx b/src/app/router.tsx
index 68a36c1..6072f45 100644
--- a/src/app/router.tsx
+++ b/src/app/router.tsx
@@ -18,6 +18,7 @@ import Membership from '@/pages/Membership/Membership'
import Sustainability from '@/pages/Sustainability/Sustainability'
import Geopolitics from '@/pages/Geopolitics/Geopolitics'
import AtAGlance from '@/pages/AtAGlance/AtAGlance'
+import Experts from '@/pages/Experts/Experts'
export const router = createBrowserRouter([
{
@@ -42,6 +43,7 @@ export const router = createBrowserRouter([
{ path: 'geopolitics', element: },
{ path: 'membership', element: },
{ path: 'at-a-glance', element: },
+ { path: 'experts', element: },
],
},
])
diff --git a/src/pages/Experts/Experts.tsx b/src/pages/Experts/Experts.tsx
new file mode 100644
index 0000000..678e6bc
--- /dev/null
+++ b/src/pages/Experts/Experts.tsx
@@ -0,0 +1,508 @@
+import { useState, useEffect, useRef } from 'react'
+import { useLang } from '@/context/LangContext'
+import { motion, AnimatePresence } from 'framer-motion'
+import { Globe, Cpu, BarChart3, Leaf, Quote } from 'lucide-react'
+
+// --- Types ---
+interface Expert {
+ id: string
+ nameFa: string
+ nameEn: string
+ roleFa: string
+ roleEn: string
+ bioFa: string
+ bioEn: string
+ photo: string
+ telegram?: string
+ linkedin?: string
+ twitter?: string
+ website?: string
+}
+
+// --- Data ---
+const FEATURED_EXPERTS: Expert[] = [
+ {
+ id: 'saeed-zarandi',
+ nameFa: 'دکتر سعید زرندی',
+ nameEn: 'Dr. Saeed Zarandi',
+ roleFa: 'مدیرعامل و عضو هیئتمدیره شرکت سرمایهگذاری صنایع شیمیایی ایران و مشاور صنایع معدنی',
+ roleEn: 'CEO & Board Member of ICIIC, Senior Mining & Metallurgy Consultant',
+ bioFa: 'سعید زرندی یکی از مدیران ارشد صنعت و اقتصاد ایران است که با تحصیلات در حوزه مهندسی معدن و مدیریت دولتی، در سمتهای مختلفی از جمله معاون طرح و برنامه وزارت صنعت، معدن و تجارت و مدیرعامل هلدینگهای صنعتی و معدنی فعالیت داشته است. وی در بهمن ۱۴۰۳ بهعنوان عضو هیئتمدیره فولاد مبارکه منصوب شد.',
+ bioEn: 'Saeed Zarandi is a senior executive in Iran\'s industrial and economic sectors. With a background in mining engineering and public administration, he has served as Deputy Minister of Industry, Mine and Trade, and CEO of major industrial holdings. He was appointed to the board of Mobarakeh Steel in early 2025.',
+ photo: '/1.jpg',
+ telegram: 'https://t.me',
+ linkedin: 'https://linkedin.com',
+ twitter: 'https://x.com',
+ website: 'https://google.com'
+ },
+ {
+ id: 'fateme-ahmadi',
+ nameFa: 'دکتر فاطمه احمدی',
+ nameEn: 'Dr. Fatemeh Ahmadi',
+ roleFa: 'مدیر تحقیقات ریسک ژئوپلیتیک و عضو اتاق فکر توسعه پایدار',
+ roleEn: 'Geopolitical Risk Director & Member of Sustainable Development Think Tank',
+ bioFa: 'فاطمه احمدی فارغالتحصیل دکتری مدیریت ریسک از دانشگاه علم و صنعت ایران با بیش از ۱۵ سال تجربه پژوهشی در حوزه زنجیره تأمین صنایع معدنی و فلزی است. وی مشاور ارشد چندین طرح کربنزدایی در صنعت فولاد است.',
+ bioEn: 'Fatemeh Ahmadi holds a Ph.D. in Risk Management from Iran University of Science and Technology. She has over 15 years of research experience in mineral and metal supply chains and is a senior consultant on carbon border regulations.',
+ photo: '/2.jpg',
+ telegram: 'https://t.me',
+ linkedin: 'https://linkedin.com',
+ twitter: 'https://x.com'
+ },
+ {
+ id: 'hosein-karimi',
+ nameFa: 'دکتر حسین کریمی',
+ nameEn: 'Dr. Hossein Karimi',
+ roleFa: 'تحلیلگر ارشد بازار جهانی کامودیتی و عضو اتاق فکر صنعت فولاد',
+ roleEn: 'Senior Commodity Analyst & Member of Steel Industry Think Tank',
+ bioFa: 'حسین کریمی دکتری مهندسی مواد از دانشگاه صنعتی اصفهان دارد. حوزه تخصصی پژوهشهای وی متالورژی صنعتی و پیشبینی تقاضای بازارهای آسیایی است و بهطور مرتب در رسانههای بینالمللی تحلیل منتشر میکند.',
+ bioEn: 'Hossein Karimi received his Ph.D. in Materials Engineering from Isfahan University of Technology. His expertise covers industrial metallurgy and demand forecasting for Asian steel markets, frequently writing for global publications.',
+ photo: '/3.jpg',
+ linkedin: 'https://linkedin.com',
+ twitter: 'https://x.com',
+ website: 'https://google.com'
+ },
+ {
+ id: 'sara-rezaei',
+ nameFa: 'مهندس سارا رضایی',
+ nameEn: 'Ms. Sara Rezaei',
+ roleFa: 'پژوهشگر ارشد انرژی و پایداری و مدیر اتاق فکر فناوری و نوآوری',
+ roleEn: 'Senior Energy & Sustainability Researcher & Head of Technology Think Tank',
+ bioFa: 'سارا رضایی فارغالتحصیل کارشناسی ارشد مهندسی انرژی از دانشگاه صنعتی شریف است. پژوهشهای او در زمینه بهرهوری کوره قوس الکتریکی و کربنزدایی با هیدروژن، از مراجع علمی صنعت فولاد است.',
+ bioEn: 'Sara Rezaei holds an M.Sc. in Energy Engineering from Sharif University of Technology. Her research on EAF efficiency, green hydrogen, and carbon reduction roadmaps serves as a benchmark in local clean steel policymaking.',
+ photo: '/4.jpg',
+ telegram: 'https://t.me',
+ linkedin: 'https://linkedin.com'
+ },
+ {
+ id: 'ali-mohammadi',
+ nameFa: 'دکتر علی محمدی',
+ nameEn: 'Dr. Ali Mohammadi',
+ roleFa: 'مدیر ارشد اقتصاد صنعتی و دبیر علمی اتاق فکر اقتصادی',
+ roleEn: 'Industrial Economics Director & Scientific Secretary of Economic Think Tank',
+ bioFa: 'علی محمدی دکتری اقتصاد صنعتی از دانشگاه تهران دارد. وی پیش از این مشاور اقتصادی ایمیدرو بوده و بیش از ۵۰ گزارش تحلیلی در بازارهای فولاد و بازارهای مالی داخلی و جهانی منتشر کرده است.',
+ bioEn: 'Ali Mohammadi holds a Ph.D. in Industrial Economics from the University of Tehran. Previously an economic advisor to IMIDRO, he has authored over 50 reports on steel tariffs, macro trends, and financial commodities.',
+ photo: '/5.jpg',
+ telegram: 'https://t.me',
+ linkedin: 'https://linkedin.com',
+ twitter: 'https://x.com',
+ website: 'https://google.com'
+ }
+]
+
+const ROOM_EXPERTS = {
+ sustainability: [
+ { nameFa: 'دکتر فاطمه احمدی', nameEn: 'Dr. Fatemeh Ahmadi', roleFa: 'مدیر ریسک ژئوپلیتیک', roleEn: 'Geopolitical Risk Director', photo: '/2.jpg' },
+ { nameFa: 'مهندس سارا رضایی', nameEn: 'Ms. Sara Rezaei', roleFa: 'تحلیلگر پایداری و انرژی', roleEn: 'Energy & Sustainability Analyst', photo: '/4.jpg' },
+ { nameFa: 'دکتر مریم حسینی', nameEn: 'Dr. Maryam Hosseini', roleFa: 'پژوهشگر بازاریابی بینالملل', roleEn: 'International Marketing Scholar', photo: '/6.jpg' },
+ { nameFa: 'دکتر رضا عباسی', nameEn: 'Dr. Reza Abbasi', roleFa: 'مشاور محیطزیست صنعتی', roleEn: 'Industrial Environmental Advisor', photo: '/7.jpg' }
+ ],
+ steel: [
+ { nameFa: 'دکتر سعید زرندی', nameEn: 'Dr. Saeed Zarandi', roleFa: 'عضو هیئتمدیره فولاد مبارکه', roleEn: 'Board Member of MSC', photo: '/1.jpg' },
+ { nameFa: 'دکتر حسین کریمی', nameEn: 'Dr. Hossein Karimi', roleFa: 'تحلیلگر متالورژی و بازار', roleEn: 'Metallurgy & Market Analyst', photo: '/3.jpg' },
+ { nameFa: 'مهندس رضا توکلی', nameEn: 'Ms. Reza Tavakoli', roleFa: 'تحلیلگر بورس کالا و آتی', roleEn: 'Mercantile & Futures Analyst', photo: '/8.jpg' },
+ { nameFa: 'دکتر محمود صادقی', nameEn: 'Dr. Mahmoud Sadeghi', roleFa: 'مشاور فناوری کوره قوس', roleEn: 'EAF Steelmaking Consultant', photo: '/9.jpg' }
+ ],
+ economics: [
+ { nameFa: 'دکتر علی محمدی', nameEn: 'Dr. Ali Mohammadi', roleFa: 'مدیر ارشد اقتصاد صنعتی', roleEn: 'Industrial Economics Director', photo: '/5.jpg' },
+ { nameFa: 'مهندس رضا توکلی', nameEn: 'Ms. Reza Tavakoli', roleFa: 'تحلیلگر بازار کامودیتی', roleEn: 'Commodity Market Analyst', photo: '/8.jpg' },
+ { nameFa: 'دکتر حمید علوی', nameEn: 'Dr. Hamid Alavi', roleFa: 'اقتصاددان زنجیره تأمین', roleEn: 'Supply Chain Economist', photo: '/10.jpg' },
+ { nameFa: 'دکتر زهرا راد', nameEn: 'Dr. Zahra Rad', roleFa: 'تحلیلگر مالی سرمایهگذاری سبز', roleEn: 'Green Investment Financial Analyst', photo: '/11.jpg' }
+ ],
+ technology: [
+ { nameFa: 'مهندس سارا رضایی', nameEn: 'Ms. Sara Rezaei', roleFa: 'پژوهشگر فناوریهای نوین', roleEn: 'Emerging Technologies Researcher', photo: '/4.jpg' },
+ { nameFa: 'دکتر سعید زرندی', nameEn: 'Dr. Saeed Zarandi', roleFa: 'استراتژیست تحول صنعتی', roleEn: 'Industrial Transformation Strategist', photo: '/1.jpg' },
+ { nameFa: 'دکتر پیمان صالحی', nameEn: 'Dr. Peyman Salehi', roleFa: 'متخصص هوش مصنوعی صنعتی', roleEn: 'Industrial AI Specialist', photo: '/12.jpg' },
+ { nameFa: 'مهندس نیما راد', nameEn: 'Mr. Nima Rad', roleFa: 'تحلیلگر طرحهای هیدروژن سبز', roleEn: 'Green Hydrogen Analyst', photo: '/13.jpg' }
+ ]
+}
+
+// --- Icons SVG components ---
+const TelegramIcon = () => (
+
+)
+
+const LinkedinIcon = () => (
+
+)
+
+const TwitterIcon = () => (
+
+)
+
+const WebsiteIcon = () => (
+
+)
+
+// --- Local Translations ---
+const TR = {
+ fa: {
+ title: 'شبکه خبرگان',
+ subtitle: 'جمع اندیشمندان، استراتژیستها و نخبگان اتاقهای فکر اندیشکده فولاد آینده',
+ roomSustainability: 'خبرگان اتاق فکر توسعه پایدار',
+ roomSteel: 'خبرگان اتاق فکر صنعت فولاد',
+ roomEconomics: 'خبرگان اتاق فکر اقتصادی',
+ roomTechnology: 'خبرگان اتاق فکر فناوری و نوآوری'
+ },
+ en: {
+ title: 'Expert Network',
+ subtitle: 'A collective of researchers, strategists, and thinkers across our specialized rooms',
+ roomSustainability: 'Sustainable Development Think Tank Experts',
+ roomSteel: 'Steel Industry Think Tank Experts',
+ roomEconomics: 'Economic Think Tank Experts',
+ roomTechnology: 'Technology & Innovation Think Tank Experts'
+ }
+}
+
+// --- Main Page Component ---
+export default function Experts() {
+ const { lang } = useLang()
+ const isFa = lang === 'fa'
+ const t = TR[lang]
+
+ // Carousel Autoplay state
+ const [activeIndex, setActiveIndex] = useState(0)
+ const [isPaused, setIsPaused] = useState(false)
+ const autoPlayRef = useRef<(() => void) | null>(null)
+
+ const activeExpert = FEATURED_EXPERTS[activeIndex]
+
+ // Next slide function
+ const handleNext = () => {
+ setActiveIndex((prev) => (prev + 1) % FEATURED_EXPERTS.length)
+ }
+
+ // Set the slide changer reference
+ useEffect(() => {
+ autoPlayRef.current = handleNext
+ })
+
+ // Start/pause autoplay interval
+ useEffect(() => {
+ if (isPaused) return
+ const interval = setInterval(() => {
+ if (autoPlayRef.current) autoPlayRef.current()
+ }, 5000)
+ return () => clearInterval(interval)
+ }, [isPaused])
+
+ const renderSocialIcon = (expert: Expert) => (
+
+ {expert.telegram && (
+
+
+
+ )}
+ {expert.linkedin && (
+
+
+
+ )}
+ {expert.twitter && (
+
+
+
+ )}
+ {expert.website && (
+
+
+
+ )}
+
+ )
+
+ return (
+
+ {/* ─── Page Header ─── */}
+
+
+
+
+
+ EXPERT NETWORK
+
+
+ {t.title}
+
+
+ {t.subtitle}
+
+
+
+
+
+
+
+
+ {/* ─── Top Featured Carousel ─── */}
+
setIsPaused(true)}
+ onMouseLeave={() => setIsPaused(false)}
+ style={{
+ background: '#fff',
+ borderRadius: 20,
+ border: '1px solid rgba(7, 29, 73, 0.08)',
+ boxShadow: '0 12px 40px rgba(7, 29, 73, 0.04)',
+ overflow: 'hidden',
+ padding: '36px 40px',
+ display: 'flex',
+ flexDirection: 'column',
+ gap: 24,
+ marginBottom: 64
+ }}
+ className="max-md:p-5"
+ >
+ {/* Main Slide Split */}
+
+
+ {/* Left/Right Photo Column */}
+
+
+ {renderSocialIcon(activeExpert)}
+
+
+ {/* Right/Left Text Details */}
+
+
+
+
+
+
+
+
+ {isFa ? activeExpert.nameFa : activeExpert.nameEn}
+
+
+ {isFa ? activeExpert.roleFa : activeExpert.roleEn}
+
+
+ {isFa ? activeExpert.bioFa : activeExpert.bioEn}
+
+
+
+
+ {/* Avatars Row at the bottom */}
+
+ {FEATURED_EXPERTS.map((exp, idx) => {
+ const isActive = idx === activeIndex
+ return (
+
+ )
+ })}
+
+
+
+
+
+
+
+ {/* ─── Grid Rooms Categories ─── */}
+
+ {/* Room 1: Sustainable Development */}
+
+
+
+
{t.roomSustainability}
+
+
+ {ROOM_EXPERTS.sustainability.map((exp, index) => (
+ } />
+ ))}
+
+
+
+ {/* Room 2: Steel Industry */}
+
+
+
+
{t.roomSteel}
+
+
+ {ROOM_EXPERTS.steel.map((exp, index) => (
+ } />
+ ))}
+
+
+
+ {/* Room 3: Economics */}
+
+
+
+
{t.roomEconomics}
+
+
+ {ROOM_EXPERTS.economics.map((exp, index) => (
+ } />
+ ))}
+
+
+
+ {/* Room 4: Technology & Innovation */}
+
+
+
+
{t.roomTechnology}
+
+
+ {ROOM_EXPERTS.technology.map((exp, index) => (
+ } />
+ ))}
+
+
+
+
+
+ )
+}
+
+// --- Card Component ---
+function ExpertCard({ name, role, photo, icon }: { name: string; role: string; photo: string; icon: React.ReactNode }) {
+ const [hovered, setHovered] = useState(false)
+
+ return (
+ setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ style={{
+ borderRadius: 14,
+ overflow: 'hidden',
+ border: '1px solid rgba(7, 29, 73, 0.07)',
+ background: '#fff',
+ boxShadow: hovered ? '0 12px 30px rgba(7, 29, 73, 0.08)' : '0 4px 12px rgba(7, 29, 73, 0.02)',
+ transition: 'all 0.3s ease',
+ transform: hovered ? 'translateY(-4px)' : 'translateY(0)',
+ display: 'flex',
+ flexDirection: 'column'
+ }}
+ >
+ {/* Image with grayscale hover */}
+
+

+
+
+ {/* Gold details footer */}
+
+
+
+ {name}
+
+
+ {role}
+
+
+
+ {/* Themed Icon in bottom corner */}
+
+ {icon}
+
+
+
+ )
+}
diff --git a/src/pages/Home/sections/SpreadFeatures.tsx b/src/pages/Home/sections/SpreadFeatures.tsx
index ade4807..2edb18a 100644
--- a/src/pages/Home/sections/SpreadFeatures.tsx
+++ b/src/pages/Home/sections/SpreadFeatures.tsx
@@ -1,6 +1,7 @@
-import { useRef, useState } from 'react'
+import { useRef, useState, useEffect } from 'react'
import { motion, AnimatePresence, useScroll, useMotionValueEvent } from 'framer-motion'
import { useLang } from '@/context/LangContext'
+import { ArrowLeft, ArrowRight } from 'lucide-react'
const NAVY = '#032340'
const GOLD = '#CD9E53'
@@ -17,7 +18,7 @@ type Feat = {
/* Your 3 hero images. As you scroll, they replace each other in place with a fade. */
const FEATURES: Feat[] = [
{
- img: '/hero%201.webp', imgSide: 'right', imgPos: 'center 35%',
+ img: '/hero%201.webp', imgSide: 'right', imgPos: 'right 35%',
fa: {
kicker: 'اندیشکده فولاد آینده',
title: 'بینش راهبردی',
@@ -83,34 +84,111 @@ function FadeUp({ children, delay = 0 }: { children: React.ReactNode; delay?: nu
)
}
+const DomeIcon = () => (
+
+)
+
+const GearIcon = () => (
+
+)
+
+const ChartIcon = () => (
+
+)
+
/* the text column for the active slide */
-function TextPanel({ feat, lang }: { feat: Feat; lang: 'fa' | 'en' }) {
+function TextPanel({ index, feat, lang }: { index: number; feat: Feat; lang: 'fa' | 'en' }) {
const t = feat[lang]
+ const isSlide2 = index === 1
+ const textColor = isSlide2 ? NAVY : GOLD
+ const descColor = isSlide2 ? 'rgba(3, 35, 64, 0.72)' : 'rgba(255, 255, 255, 0.78)'
+
+ const renderIcon = () => {
+ if (index === 0) return
+ if (index === 1) return
+ return
+ }
+
+ const buttonText = lang === 'fa'
+ ? (index === 0 ? 'آشنایی با مأموریت ما' : index === 1 ? 'تحلیلهای فناوری' : 'داشبوردهای پایداری')
+ : (index === 0 ? 'Our Mission' : index === 1 ? 'Technology Analysis' : 'Sustainability Dashboards')
+
return (
-
+
-
-
{t.kicker}
-
+
+ {renderIcon()}
-
+
{t.title}
-
+
{t.desc}
-
-
- {t.stat}
- {t.statTail}
-
-
+
)
@@ -118,12 +196,13 @@ function TextPanel({ feat, lang }: { feat: Feat; lang: 'fa' | 'en' }) {
/* progress rail */
function Rail({ active, total }: { active: number; total: number }) {
+ const inactiveColor = active === 1 ? 'rgba(3, 35, 64, 0.22)' : 'rgba(255, 255, 255, 0.3)'
return (
{Array.from({ length: total }).map((_, i) => (
))}
@@ -135,6 +214,15 @@ export default function SpreadFeatures() {
const { lang } = useLang()
const containerRef = useRef
(null)
const [active, setActive] = useState(0)
+ const [isMobile, setIsMobile] = useState(false)
+
+ useEffect(() => {
+ const mq = window.matchMedia('(max-width: 767px)')
+ const update = () => setIsMobile(mq.matches)
+ update()
+ mq.addEventListener('change', update)
+ return () => mq.removeEventListener('change', update)
+ }, [])
const { scrollYProgress } = useScroll({ target: containerRef, offset: ['start start', 'end end'] })
useMotionValueEvent(scrollYProgress, 'change', (v) => {
@@ -143,15 +231,15 @@ export default function SpreadFeatures() {
})
return (
- /* 300vh tall → inner pins for the whole scroll; each ~third = one slide.
- Each full slide (image + text) is stacked and crossfaded, so the layout can
- alternate per slide (img 1 right · img 2 left · img 3 right) without jumping. */
-
+
{FEATURES.map((f, i) => {
const isActive = i === active
- const imgRight = f.imgSide === 'right'
+ const isTextOnLeft = i === 1
+ const leftBg = isTextOnLeft ? GOLD : '#efe9e1'
+ const rightBg = isTextOnLeft ? '#efe9e1' : NAVY
+
return (
- {/* TEXT */}
-
- {/* only the active slide's text animates in (re-keyed so it replays each time) */}
- {isActive && (
-
-
-
-
-
+ {/* LEFT PANEL */}
+
+ {isTextOnLeft ? (
+ isActive && (
+
+
+
+
+
+ )
+ ) : (
+
+
+
)}
- {/* IMAGE */}
-
-
-
-
+ {/* RIGHT PANEL */}
+
+ {isTextOnLeft ? (
+
+
+
+ ) : (
+ isActive && (
+
+
+
+
+
+ )
+ )}
)