From 1ceb7cb1561522e92754559c28bf9edd1a6dc5f0 Mon Sep 17 00:00:00 2001 From: aramesh-site deploy Date: Fri, 9 Oct 2026 18:57:46 +0000 Subject: [PATCH] =?UTF-8?q?feat(hero):=20=D9=86=D8=B4=D8=A7=D9=86=20=C2=AB?= =?UTF-8?q?=D9=BE=D8=B1=D9=88=DA=98=D9=87=20=D9=81=D8=B9=D8=A7=D9=84=20?= =?UTF-8?q?=D8=A7=D9=84=DB=8C=D8=B3=DB=8C=D8=A7=D9=86=C2=BB=20=D8=A8=D9=87?= =?UTF-8?q?=20=D8=B5=D9=81=D8=AD=D9=87=D9=94=20=D9=87=D9=85=D8=A7=D9=86=20?= =?UTF-8?q?=D9=BE=D8=B1=D9=88=DA=98=D9=87=20=D9=88=D8=B5=D9=84=20=D8=B4?= =?UTF-8?q?=D8=AF=20(=D8=AA=D8=B7=D8=A8=DB=8C=D9=82=20=D8=AF=D9=88?= =?UTF-8?q?=E2=80=8C=D8=B2=D8=A8=D8=A7=D9=86=D9=87=D9=94=20=D9=86=D8=A7?= =?UTF-8?q?=D9=85=20=D8=A8=D8=A7=20=D9=86=DA=AF=D8=A7=D8=B4=D8=AA=20Elysia?= =?UTF-8?q?n=E2=86=92=D8=A7=D9=84=DB=8C=D8=B3=DB=8C=D8=A7=D9=86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/home/Hero.tsx | 47 +++++++++++++++++-- .../src/components/home/HeroProjectBadge.tsx | 26 +++++++++- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/home/Hero.tsx b/frontend/src/components/home/Hero.tsx index 700f820..5a13493 100644 --- a/frontend/src/components/home/Hero.tsx +++ b/frontend/src/components/home/Hero.tsx @@ -10,9 +10,46 @@ import { InlineEdit } from '../admin/InlineEdit' import { HeroProjectBadge } from './HeroProjectBadge' import { SingletonPill } from '../../admin/Editable' +/** واژه‌های عمومی برچسب نشان که در تطبیق نام پروژه نادیده گرفته می‌شوند */ +const NOISE_WORDS = ['پروژه', 'فعال', 'آرامش', 'گروه', 'ساختمانی', 'Active', 'Project', 'Aramesh'] +/** نام لاتین برچسب انگلیسی → معادل فارسی در عنوان پروژه (پروژه‌های بدون title_en) */ +const LATIN_ALIAS: Record = { elysian: 'الیسیان' } + export function Hero() { - const { brand, hero } = useSite() - const { t, href } = useLang() + const { brand, hero, projects } = useSite() + const { t, href, lang } = useLang() + + /** + * پروژهٔ فعال هیرو → صفحهٔ همان پروژه. + * برچسب نشان مثل «پروژه فعال آرامش الیسیان» یا «Elysian Aramesh Active Project» + * است؛ واژه‌های عمومی حذف و نام باقی‌مانده با عنوان پروژه‌ها تطبیق داده می‌شود. + */ + const activeProjectHref = (() => { + const label = hero.badge_label.trim() + if (!label) return undefined + + const strip = (text: string) => { + let out = text + NOISE_WORDS.forEach((w) => { + out = out.split(w).join(' ') + }) + return out.replace(/[\s\-—_]+/g, '').trim().toLowerCase() + } + + let key = strip(label) + // برچسب انگلیسی ممکن است نام لاتین داشته باشد و پروژه فقط عنوان فارسی (Elysian → الیسیان) + if (key.length < 3 || LATIN_ALIAS[key]) key = LATIN_ALIAS[key] ?? key + if (key.length < 3) return undefined + + const hit = projects.find((p) => { + const candidates = [p.title, p.title_en ?? ''].filter(Boolean) + return candidates.some((title) => { + const k = strip(title) + return k.length >= 3 && (k.includes(key) || key.includes(k)) + }) + }) + return hit ? `/projects/${hit.slug}` : undefined + })() const save = useFieldSaver() const { scrollY } = useScroll() const imageY = useTransform(scrollY, [0, 700], [0, 110]) @@ -141,7 +178,11 @@ export function Hero() {