Elevate public site UX: premium hero, motion, scrollspy, shared footer
deploy / deploy (push) Successful in 6m30s
deploy / deploy (push) Successful in 6m30s
Redesign-preserve pass on the light editorial theme (dials 7/5/3): - Hero: live availability status, accent value-prop, role line, social row, staggered entrance - Motion (all motivated, reduced-motion safe): CSS scroll-driven reading progress bar, scrollspy nav with animated underline, CTA/blog arrow nudges, service hover accent rule, portfolio cover scale, card lift - Shared multi-column footer across home + blog (brand, nav, contact, social) - Fix anchor scroll offset under the fixed navbar (scroll-margin-top) - Wire real social: LinkedIn, Instagram, email (code.soroush@gmail.com) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+28
-22
@@ -8,22 +8,33 @@
|
||||
<!-- ─── HERO (editorial, centered) ───────────────────────────────────── -->
|
||||
<section id="top" class="px-5 pt-28 pb-24 sm:px-8 sm:pt-32">
|
||||
<div class="mx-auto max-w-3xl text-center">
|
||||
<p class="kicker reveal">@(fa ? "مهندس هوش مصنوعی، مشاور، معمار راهکار" : "AI Engineer, Consultant, Solution Architect")</p>
|
||||
<div class="reveal mb-7 flex justify-center">
|
||||
<span class="status"><span class="dot"></span>@(fa ? "پذیرای پروژههای جدید" : "Available for new projects")</span>
|
||||
</div>
|
||||
|
||||
<h1 class="reveal mt-6 @(fa ? "font-fa" : "")" style="font-size:clamp(2.6rem,7vw,4.75rem);transition-delay:.05s">
|
||||
<h1 class="reveal @(fa ? "font-fa" : "")" style="font-size:clamp(2.6rem,7vw,4.75rem);transition-delay:.05s">
|
||||
@(fa ? "سروش اسعدی" : "Soroush Asadi")
|
||||
</h1>
|
||||
|
||||
<p class="lede reveal mx-auto mt-6 text-balance" style="font-size:clamp(1.05rem,2vw,1.3rem);transition-delay:.1s">
|
||||
@(fa
|
||||
? "طراحی و استقرار سامانههای هوش مصنوعی در مقیاس سازمانی؛ از نخستین جلسهی راهبرد تا استقرار در تولید."
|
||||
: "I design and ship production-grade AI systems for the enterprise, from the first strategy session to live deployment.")
|
||||
<p class="reveal mx-auto mt-6 max-w-2xl text-balance leading-snug text-zinc-800" style="font-size:clamp(1.2rem,2.4vw,1.6rem);transition-delay:.1s">
|
||||
@(fa ? "طراحی و استقرار " : "I build ")<span class="accent-text font-semibold">@(fa ? "هوش مصنوعی تولیدی" : "production-grade AI")</span>@(fa ? " برای سازمانها، از راهبرد تا استقرار در تولید." : " for the enterprise, from strategy to live deployment.")
|
||||
</p>
|
||||
|
||||
<div class="reveal mt-9 flex flex-wrap items-center justify-center gap-3" style="transition-delay:.15s">
|
||||
<a href="#contact" class="btn">@(fa ? "رزرو جلسه" : "Book a call")</a>
|
||||
<p class="lede reveal mx-auto mt-4 text-[.98rem]" style="transition-delay:.15s">@(fa ? "مهندس هوش مصنوعی، مشاور و معمار راهکار." : "AI Engineer, Consultant, and Solution Architect.")</p>
|
||||
|
||||
<div class="reveal mt-9 flex flex-wrap items-center justify-center gap-3" style="transition-delay:.2s">
|
||||
<a href="#contact" class="btn">
|
||||
@(fa ? "رزرو جلسه" : "Book a call")
|
||||
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" class="@(fa ? "rotate-180" : "")" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg>
|
||||
</a>
|
||||
<a href="#portfolio" class="btn-ghost">@(fa ? "نمونهکارها" : "View work")</a>
|
||||
</div>
|
||||
|
||||
<div class="reveal mt-8 flex items-center justify-center gap-2.5" style="transition-delay:.25s">
|
||||
<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>
|
||||
</section>
|
||||
|
||||
@@ -53,16 +64,18 @@
|
||||
("google-stack","Google Stack Specialist","Vertex AI, GKE, and Gemini deployments with cost optimization and enterprise security patterns.",new[]{"Vertex AI","GKE","Gemini"}),
|
||||
};
|
||||
}
|
||||
@{ int si = 0; }
|
||||
@foreach (var (id, title, desc, tags) in services)
|
||||
{
|
||||
<article class="reveal border-t border-zinc-200 pt-6">
|
||||
<span class="text-zinc-400" aria-hidden="true">@Html.Raw(ServiceIcon(id))</span>
|
||||
<article class="svc reveal border-t border-zinc-200 pt-6" style="transition-delay:@(si * 60)ms">
|
||||
<span class="svc-icon text-zinc-400" aria-hidden="true">@Html.Raw(ServiceIcon(id))</span>
|
||||
<h3 class="mt-5 text-lg font-semibold @(fa ? "font-fa" : "")">@title</h3>
|
||||
<p class="mt-2.5 text-[.95rem] leading-relaxed text-zinc-600">@desc</p>
|
||||
<div class="mt-4 flex flex-wrap gap-1.5">
|
||||
@foreach (var tag in tags) { <span class="chip">@tag</span> }
|
||||
</div>
|
||||
</article>
|
||||
si++;
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -207,7 +220,7 @@
|
||||
{
|
||||
var initial = char.ToUpperInvariant(pid[0]);
|
||||
<article class="card card-link reveal overflow-hidden">
|
||||
<div class="flex aspect-[16/9] items-center justify-center bg-zinc-100" aria-hidden="true">
|
||||
<div class="cover flex aspect-[16/9] items-center justify-center bg-zinc-100" aria-hidden="true">
|
||||
<span class="font-display text-5xl font-bold text-zinc-300">@initial</span>
|
||||
</div>
|
||||
<div class="p-5">
|
||||
@@ -269,6 +282,10 @@
|
||||
<div>
|
||||
<h3 class="text-[1.1rem] font-semibold transition-colors group-hover:text-accent @(fa ? "font-fa" : "")">@btitle</h3>
|
||||
<p class="mt-1.5 text-[.9rem] leading-relaxed text-zinc-600">@excerpt</p>
|
||||
<span class="arrow-link mt-3">
|
||||
@(fa ? "خواندن" : "Read")
|
||||
<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="@(fa ? "rotate-180" : "")" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg>
|
||||
</span>
|
||||
</div>
|
||||
</a>
|
||||
}
|
||||
@@ -348,17 +365,6 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ─── FOOTER ───────────────────────────────────────────────────────── -->
|
||||
<footer class="border-t border-zinc-200 px-5 py-10 sm:px-8">
|
||||
<div class="mx-auto flex max-w-6xl flex-col items-center gap-3 text-center sm:flex-row sm:justify-between sm:text-start">
|
||||
<div class="flex items-center gap-2.5">
|
||||
<img src="/logo-mark.svg" alt="" width="22" height="22" />
|
||||
<span class="text-sm text-zinc-600">@(fa ? "مهندسی سامانههای هوش مصنوعی برای سازمانها." : "AI systems engineering for the enterprise.")</span>
|
||||
</div>
|
||||
<p class="text-[.78rem] text-zinc-400">© 2026 Soroush Asadi. @(fa ? "تمام حقوق محفوظ است." : "All rights reserved.")</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@functions {
|
||||
static string ServiceIcon(string id) => id switch {
|
||||
"strategy" => """<svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><path d="M9 20H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h4"/><polyline points="9,9 4,9"/><polyline points="9,12 4,12"/><polyline points="9,15 4,15"/><rect x="9" y="2" width="6" height="6"/><path d="M15 8h4a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-4"/></svg>""",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
@{
|
||||
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";
|
||||
@@ -45,6 +46,9 @@
|
||||
</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>
|
||||
|
||||
@@ -128,6 +132,43 @@
|
||||
@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>
|
||||
|
||||
Reference in New Issue
Block a user