255e8d25e5
deploy / deploy (push) Successful in 24s
Rewrite the FA strings sitewide in natural, human Persian (English unchanged), removing translation calques like «معمار راهکار», «هوش مصنوعی تولیدی», «موارد کاربری», «چرخههای هیجان», «استقرار در تولید», «محیط تولید». Covers: hero, services, pipeline, stack, expertise, portfolio, blog, contact (Index), nav/meta/footer (_Layout), the /blog list + per-post FA titles (BlogIndexModel, PostModel). Also removed two stray English em-dashes in the blog excerpts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
162 lines
9.1 KiB
Plaintext
162 lines
9.1 KiB
Plaintext
@{
|
|
var locale = (string)(ViewData["Locale"] ?? "fa");
|
|
var fa = locale == "fa";
|
|
var isRtl = locale == "fa";
|
|
var dir = isRtl ? "rtl" : "ltr";
|
|
var lang = locale == "fa" ? "fa" : "en";
|
|
var title = (string?)ViewData["Title"] ?? (locale == "fa"
|
|
? "سروش اسعدی - مهندس هوش مصنوعی و معمار نرمافزار"
|
|
: "Soroush Asadi - AI Engineer, Consultant, Solution Architect");
|
|
}
|
|
<!doctype html>
|
|
<html lang="@lang" dir="@dir">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>@title</title>
|
|
<meta name="description" content="@(locale == "fa"
|
|
? "سامانههای هوش مصنوعی میسازم که در مقیاس سازمانی واقعاً کار میکنند؛ از راهبرد و مهندسی LLM و RAG تا عاملهای خودکار، زیرساخت ابری و استک گوگل."
|
|
: "Designing and deploying enterprise-grade AI systems. Strategy, LLM and RAG, agentic automation, cloud infrastructure, and the Google stack.")" />
|
|
<meta name="theme-color" content="#fafafa" />
|
|
|
|
<!-- Fonts: Syne (display) + Vazirmatn (Persian). Body is system sans. -->
|
|
<style>
|
|
@@font-face { font-family:'Syne'; src:url('/fonts/Syne-Variable.woff2') format('woff2'); font-weight:100 900; font-display:swap; }
|
|
@@font-face { font-family:'Vazirmatn'; src:url('/fonts/Vazirmatn-Arabic.woff2') format('woff2'); font-display:swap; }
|
|
</style>
|
|
|
|
<!-- Tailwind: prebuilt + purged stylesheet (`npm run build`). No runtime CDN. -->
|
|
<link rel="stylesheet" href="/css/tailwind.css" />
|
|
<link rel="stylesheet" href="/css/site.css" />
|
|
<link rel="icon" href="/logo-mark.svg" type="image/svg+xml" />
|
|
</head>
|
|
<body class="site antialiased">
|
|
|
|
<!-- Reading progress (CSS scroll-driven) -->
|
|
<div class="scroll-progress" aria-hidden="true"></div>
|
|
|
|
<!-- Sentinel for the navbar border (observed by IntersectionObserver) -->
|
|
<div id="nav-sentinel" aria-hidden="true"></div>
|
|
|
|
<!-- Navbar -->
|
|
<header id="navbar" class="fixed inset-x-0 top-0 z-50">
|
|
<div class="mx-auto flex max-w-6xl items-center justify-between px-5 py-3.5 sm:px-8">
|
|
<!-- Logo -->
|
|
<a href="/#top" class="flex items-center gap-2.5" aria-label="@(locale == "fa" ? "خانه" : "Home")">
|
|
<img src="/logo-mark.svg" alt="" width="26" height="26" class="h-[26px] w-[26px]" />
|
|
<span class="font-display text-[15px] font-bold text-zinc-900 @(isRtl ? "font-fa" : "")">
|
|
@(locale == "fa" ? "سروش اسعدی" : "Soroush Asadi")
|
|
</span>
|
|
</a>
|
|
|
|
<!-- Desktop nav -->
|
|
<nav class="hidden items-center gap-7 md:flex" aria-label="Main">
|
|
@if (locale == "fa")
|
|
{
|
|
<a href="/#services" class="nav-link">خدمات</a>
|
|
<a href="/#stack" class="nav-link">استک</a>
|
|
<a href="/#expertise" class="nav-link">تخصص</a>
|
|
<a href="/#portfolio" class="nav-link">نمونهکارها</a>
|
|
<a href="/#blog" class="nav-link">بلاگ</a>
|
|
}
|
|
else
|
|
{
|
|
<a href="/#services" class="nav-link">Services</a>
|
|
<a href="/#stack" class="nav-link">Stack</a>
|
|
<a href="/#expertise" class="nav-link">Expertise</a>
|
|
<a href="/#portfolio" class="nav-link">Portfolio</a>
|
|
<a href="/#blog" class="nav-link">Blog</a>
|
|
}
|
|
<a href="/#contact" class="btn text-sm">@(locale == "fa" ? "رزرو جلسه" : "Book a call")</a>
|
|
<!-- Locale toggle -->
|
|
<form method="post" action="/locale">
|
|
<input type="hidden" name="locale" value="@(locale == "fa" ? "en" : "fa")" />
|
|
<input type="hidden" name="returnUrl" value="@Context.Request.Path@Context.Request.QueryString" />
|
|
<button type="submit" class="nav-link text-xs tracking-wide">@(locale == "fa" ? "EN" : "FA")</button>
|
|
</form>
|
|
</nav>
|
|
|
|
<!-- Mobile menu button -->
|
|
<button id="menu-btn" class="flex flex-col gap-1.5 p-2 md:hidden" aria-label="@(locale == "fa" ? "منو" : "Menu")" aria-expanded="false">
|
|
<span class="block h-0.5 w-5 bg-zinc-800"></span>
|
|
<span class="block h-0.5 w-5 bg-zinc-800"></span>
|
|
<span class="block h-0.5 w-5 bg-zinc-800"></span>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Mobile drawer -->
|
|
<div id="mobile-menu" class="hidden border-t border-zinc-200 bg-white/95 backdrop-blur-xl md:hidden">
|
|
<nav class="flex flex-col gap-1 px-5 py-4">
|
|
@if (locale == "fa")
|
|
{
|
|
<a href="/#services" class="nav-link py-2">خدمات</a>
|
|
<a href="/#stack" class="nav-link py-2">استک</a>
|
|
<a href="/#expertise" class="nav-link py-2">تخصص</a>
|
|
<a href="/#portfolio" class="nav-link py-2">نمونهکارها</a>
|
|
<a href="/#blog" class="nav-link py-2">بلاگ</a>
|
|
<a href="/#contact" class="nav-link py-2">تماس</a>
|
|
}
|
|
else
|
|
{
|
|
<a href="/#services" class="nav-link py-2">Services</a>
|
|
<a href="/#stack" class="nav-link py-2">Stack</a>
|
|
<a href="/#expertise" class="nav-link py-2">Expertise</a>
|
|
<a href="/#portfolio" class="nav-link py-2">Portfolio</a>
|
|
<a href="/#blog" class="nav-link py-2">Blog</a>
|
|
<a href="/#contact" class="nav-link py-2">Contact</a>
|
|
}
|
|
<form method="post" action="/locale" class="mt-2">
|
|
<input type="hidden" name="locale" value="@(locale == "fa" ? "en" : "fa")" />
|
|
<input type="hidden" name="returnUrl" value="@Context.Request.Path@Context.Request.QueryString" />
|
|
<button type="submit" class="nav-link text-xs tracking-wide">@(locale == "fa" ? "Switch to English" : "تغییر به فارسی")</button>
|
|
</form>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main>
|
|
@RenderBody()
|
|
</main>
|
|
|
|
<!-- Footer (shared across all public pages) -->
|
|
<footer class="site-footer mt-8 px-5 py-14 sm:px-8">
|
|
<div class="mx-auto grid max-w-6xl grid-cols-1 gap-10 sm:grid-cols-2 lg:grid-cols-[1.5fr_1fr_1fr]">
|
|
<div>
|
|
<a href="/#top" class="flex items-center gap-2.5" aria-label="@(locale == "fa" ? "خانه" : "Home")">
|
|
<img src="/logo-mark.svg" alt="" width="26" height="26" class="h-[26px] w-[26px]" />
|
|
<span class="font-display text-[15px] font-bold text-zinc-900 @(isRtl ? "font-fa" : "")">@(locale == "fa" ? "سروش اسعدی" : "Soroush Asadi")</span>
|
|
</a>
|
|
<p class="mt-4 max-w-xs text-sm leading-relaxed text-zinc-600">@(fa ? "هوش مصنوعی میسازم که در عمل کار میکند؛ از طراحی تا اجرا." : "AI systems engineering for the enterprise, from strategy to live deployment.")</p>
|
|
<div class="mt-5 flex gap-2.5">
|
|
<a class="social" href="https://www.linkedin.com/in/soroushdes/" target="_blank" rel="noopener" aria-label="LinkedIn"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5ZM3 9h4v12H3V9Zm6 0h3.8v1.64h.05c.53-1 1.83-2.06 3.76-2.06 4.02 0 4.76 2.65 4.76 6.1V21h-4v-5.4c0-1.29-.02-2.95-1.8-2.95-1.8 0-2.07 1.4-2.07 2.85V21H9V9Z"/></svg></a>
|
|
<a class="social" href="https://www.instagram.com/soroushasadicom/" target="_blank" rel="noopener" aria-label="Instagram"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="5"/><circle cx="12" cy="12" r="4"/><circle cx="17.2" cy="6.8" r="1.1" fill="currentColor" stroke="none"/></svg></a>
|
|
<a class="social" href="mailto:code.soroush@gmail.com" aria-label="Email"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 7 9 6 9-6"/></svg></a>
|
|
</div>
|
|
</div>
|
|
|
|
<nav aria-label="Footer" class="flex flex-col gap-2.5">
|
|
<span class="kicker mb-1">@(fa ? "پیمایش" : "Navigate")</span>
|
|
<a href="/#services" class="foot-link">@(fa ? "خدمات" : "Services")</a>
|
|
<a href="/#stack" class="foot-link">@(fa ? "استک" : "Stack")</a>
|
|
<a href="/#portfolio" class="foot-link">@(fa ? "نمونهکارها" : "Work")</a>
|
|
<a href="/blog" class="foot-link">@(fa ? "بلاگ" : "Blog")</a>
|
|
</nav>
|
|
|
|
<div class="flex flex-col gap-2.5">
|
|
<span class="kicker mb-1">@(fa ? "تماس" : "Get in touch")</span>
|
|
<a href="/#contact" class="foot-link">@(fa ? "رزرو جلسه" : "Book a call")</a>
|
|
<a href="mailto:code.soroush@gmail.com" class="foot-link">code.soroush@gmail.com</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mx-auto mt-12 flex max-w-6xl flex-col items-center gap-2 border-t border-zinc-200 pt-6 text-center sm:flex-row sm:justify-between sm:text-start">
|
|
<p class="text-[.78rem] text-zinc-400">© 2026 Soroush Asadi. @(fa ? "تمام حقوق محفوظ است." : "All rights reserved.")</p>
|
|
<p class="text-[.78rem] text-zinc-400">@(fa ? "ساختهشده با دقت در تهران." : "Built with care in Tehran.")</p>
|
|
</div>
|
|
</footer>
|
|
|
|
<script src="/js/app.js" defer></script>
|
|
@await RenderSectionAsync("Scripts", required: false)
|
|
</body>
|
|
</html>
|