Merge remote-tracking branch 'space/main'

This commit is contained in:
alireza 2026-05-31 08:16:01 +03:30
commit 38956bf77a
10 changed files with 32 additions and 45 deletions

View File

@ -4,13 +4,13 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="اندیشکده فولاد ایران — مرکز مستقل تحلیل راهبردی و سیاست‌گذاری صنعت فولاد" />
<meta name="description" content="اندیشکده فولاد آینده — مرکز مستقل تحلیل راهبردی و سیاست‌گذاری صنعت فولاد" />
<!-- Vazir font preloads (critical weights) -->
<link rel="preload" href="/fonts/Vazir-Regular.woff2" as="font" type="font/woff2" crossorigin />
<link rel="preload" href="/fonts/Vazir-Bold.woff2" as="font" type="font/woff2" crossorigin />
<title>اندیشکده فولاد ایران — تحلیل راهبردی صنعت فولاد</title>
<title>اندیشکده فولاد آینده — تحلیل راهبردی صنعت فولاد</title>
</head>
<body>
<div id="root"></div>

View File

@ -106,7 +106,7 @@ export function Footer() {
lineHeight: 1.2, marginBottom: 4,
}}
>
اندیشکده فولاد ایران
اندیشکده فولاد آینده
</div>
<div
style={{
@ -115,7 +115,7 @@ export function Footer() {
marginBottom: 20, direction: 'ltr', textAlign: 'right',
}}
>
IRAN STEEL POLICY INSTITUTE
FUTURE STEEL POLICY INSTITUTE
</div>
<p style={{ fontSize: 13, lineHeight: 1.75, color: 'rgba(255,255,255,0.5)', marginBottom: 20, maxWidth: 300 }}>
مرکز مستقل تحلیل راهبردی و سیاستگذاری صنعت فولاد و فلزات کشور
@ -183,7 +183,7 @@ export function Footer() {
}}
className="max-w-7xl mx-auto w-full px-12 max-md:px-5"
>
<span>© ۱۴۰۳ اندیشکده فولاد ایران تمام حقوق محفوظ است</span>
<span>© ۱۴۰۳ اندیشکده فولاد آینده تمام حقوق محفوظ است</span>
<div style={{ display: 'flex', gap: 18 }}>
{['حریم خصوصی', 'شرایط استفاده', 'درگاه پرداخت', 'نقشه سایت'].map(l => (
<a

View File

@ -260,7 +260,7 @@ export default function Header() {
}}
className="max-md:text-[16px]"
>
اندیشکده فولاد ایران
اندیشکده فولاد آینده
</span>
<span
style={{
@ -273,7 +273,7 @@ export default function Header() {
}}
className="max-md:hidden"
>
IRAN STEEL POLICY INSTITUTE
FUTURE STEEL POLICY INSTITUTE
</span>
</NavLink>
@ -442,7 +442,7 @@ export default function Header() {
}}
>
<span style={{ fontSize: 14, fontWeight: 800 }}>
اندیشکده فولاد ایران
اندیشکده فولاد آینده
</span>
<button
aria-label="بستن منو"

View File

@ -43,20 +43,20 @@
DESIGN TOKENS
*/
:root {
--paper: #f4efe7;
--paper-2: #ede8de;
--paper-3: #e4ddd0;
--ink: #1a1712;
--ink-2: #2e2a25;
--ink-3: #4a4540;
--ink-4: #6b6560;
--ink-5: #766e68;
--ink-6: #c8c2bc;
--rule-thin: rgba(26,23,18,0.12);
--red: #9b1c1c;
--red-2: #b52020;
--amber: #92400e;
--green-ink: #166534;
--paper: #fafbfd;
--paper-2: #f1f4f9;
--paper-3: #e4eaf2;
--ink: #0f172a;
--ink-2: #1e293b;
--ink-3: #334155;
--ink-4: #64748b;
--ink-5: #94a3b8;
--ink-6: #cbd5e1;
--rule-thin: rgba(15,23,42,0.10);
--red: #dc2626;
--red-2: #ef4444;
--amber: #d97706;
--green-ink: #059669;
}
/*

View File

@ -198,7 +198,7 @@ export default function LatestNewsBentoSection() {
<div style={{ width: 28, height: 28, background: 'var(--red)', display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'white', fontSize: 11, fontWeight: 900, flexShrink: 0 }}>م</div>
<div>
<div style={{ fontSize: 12, fontWeight: 700, color: 'var(--ink)' }}>دکتر علی محمدی</div>
<div style={{ fontSize: 10, color: 'var(--ink-5)' }}>مدیر ارشد پژوهش · اندیشکده فولاد</div>
<div style={{ fontSize: 10, color: 'var(--ink-5)' }}>مدیر ارشد پژوهش · اندیشکده فولاد آینده</div>
</div>
</div>
</div>

View File

@ -1,4 +1,3 @@
import { useEffect, useRef, useState } from 'react'
import { Link } from 'react-router-dom'
/* ─── Risk data ──────────────────────────────────────────── */
@ -75,19 +74,9 @@ const LEVEL = {
/* ─── Section ────────────────────────────────────────────── */
export default function RiskSection() {
const containerRef = useRef<HTMLDivElement>(null)
const listRef = useRef<HTMLUListElement>(null)
const [ready, setReady] = useState(false)
useEffect(() => {
if (!containerRef.current || !listRef.current) return
/* Clone all items for seamless loop */
const original = Array.from(listRef.current.children)
original.forEach(item => {
listRef.current!.appendChild(item.cloneNode(true))
})
setReady(true)
}, [])
/* Duplicate items for seamless infinite loop (handled in JSX, not effect, to
stay immune to StrictMode double-invocation that would otherwise clone twice). */
const loopItems = [...riskItems, ...riskItems]
return (
<section style={{ background: 'var(--paper)' }}>
@ -144,7 +133,6 @@ export default function RiskSection() {
{/* ── Auto-scroll ticker ── */}
<div
ref={containerRef}
style={{
position: 'relative',
overflow: 'hidden',
@ -157,8 +145,7 @@ export default function RiskSection() {
}}
>
<ul
ref={listRef}
className={ready ? 'animate-scroll-risk' : ''}
className="animate-scroll-risk"
style={{
display: 'flex',
gap: 20,
@ -172,7 +159,7 @@ export default function RiskSection() {
onMouseEnter={e => (e.currentTarget.style.animationPlayState = 'paused')}
onMouseLeave={e => (e.currentTarget.style.animationPlayState = 'running')}
>
{riskItems.map((item, idx) => {
{loopItems.map((item, idx) => {
const cfg = LEVEL[item.level]
return (
<li

View File

@ -55,7 +55,7 @@ export default function Risks() {
marginBottom: '12px',
}}
>
اندیشکده فولاد ایران پایش ریسک
اندیشکده فولاد آینده پایش ریسک
</div>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end', flexWrap: 'wrap', gap: '16px' }}>
<h1

View File

@ -167,7 +167,7 @@ export default function Scanner() {
marginBottom: '12px',
}}
>
اندیشکده فولاد ایران دادههای بازار
اندیشکده فولاد آینده دادههای بازار
</div>
<div
style={{

View File

@ -261,7 +261,7 @@ export default function Special() {
fontWeight: 600,
}}
>
اندیشکده فولاد ایران پژوهشهای تخصصی
اندیشکده فولاد آینده پژوهشهای تخصصی
</div>
<h1
style={{

View File

@ -587,7 +587,7 @@ export default function Subscribe() {
marginBottom: 16,
}}
>
اندیشکده فولاد ایران
اندیشکده فولاد آینده
</p>
<h2
style={{