Files
soroushasadi/Pages/Shared/_Layout.cshtml
T
soroush.asadi 8896740895
deploy / deploy (push) Successful in 24s
Harden UX & accessibility (ui-ux-pro-max pass)
Audited the site with the ui-ux-pro-max skill. It validated the brand blue
(#2563EB == its SaaS primary) but flagged real high-severity gaps:

- Contrast: muted grays were zinc-400 (~2.8:1, fails WCAG AA). Bumped the
  muted token + all text-zinc-400 to zinc-500 (#71717a, ~4.6:1).
- Touch targets: social buttons 38px -> 44x44 (meets 44pt minimum).
- Cursor + disabled: cursor-pointer on buttons; disabled state dims + blocks.
- Form a11y: required-field asterisks (name/service/budget/message),
  autocomplete on name/company, and role=status aria-live=polite on the
  submit status so screen readers announce success/error.

Kept Syne + system fonts and the blue accent (skill suggested Inter + an
AI-purple palette its own anti-patterns reject). Rebuilt Tailwind bundles.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 05:33:44 +03:30

162 lines
9.2 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 - Software & AI Engineer");
}
<!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 که به تولید می‌رسند."
: "I design and build software, enterprise apps, and AI solutions: web and mobile platforms, distributed systems, cloud, and LLM/RAG features that ship to production.")" />
<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 ? "نرم‌افزار، اپلیکیشن‌های سازمانی و راهکارهای هوش مصنوعی که در عمل کار می‌کنند." : "Software, enterprise apps, and AI solutions, engineered to last.")</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-500">© 2026 Soroush Asadi. @(fa ? "تمام حقوق محفوظ است." : "All rights reserved.")</p>
<p class="text-[.78rem] text-zinc-500">@(fa ? "ساخته‌شده با دقت در تهران." : "Built with care in Tehran.")</p>
</div>
</footer>
<script src="/js/app.js" defer></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>