Full rewrite of the portfolio site from Next.js 14 to .NET 10: - ASP.NET Core 10 Razor Pages, no Node.js dependency - EF Core 10 + SQLite (same schema as before — data survives upgrade) - Cookie authentication (same single-password model) - Resend contact form via HttpClient - Bilingual FA/EN via locale cookie + BasePageModel - All UI ported to Razor Pages with Tailwind CDN + custom CSS - Vanilla JS: particles, typewriter, cursor, animations, portfolio modal - Dockerfile: SDK 10.0-alpine → aspnet 10.0-alpine (no npm/Node needed) - CI/CD: dropped NPM_TOKEN, ADMIN_SESSION_SECRET — pure dotnet publish Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
@page "/blog/{slug}"
|
||||
@model SoroushAsadi.Pages.Blog.PostModel
|
||||
@{
|
||||
ViewData["Title"] = Model.Title + " — Soroush Asadi";
|
||||
var fa = Model.IsFa;
|
||||
}
|
||||
|
||||
<div class="min-h-screen pt-28 pb-20 px-5 sm:px-8">
|
||||
<div class="mx-auto max-w-3xl">
|
||||
<a href="/blog" class="label-mono mb-8 inline-flex items-center gap-2 text-slate-400 hover:text-white transition-colors @(fa ? "flex-row-reverse" : "")">
|
||||
<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" class="@(fa ? "" : "rotate-180")"><path d="M5 12H19"/><path d="M13 6L19 12L13 18"/></svg>
|
||||
@(fa ? "بازگشت به بلاگ" : "Back to blog")
|
||||
</a>
|
||||
|
||||
@if (Model.PostNotFound)
|
||||
{
|
||||
<p class="text-slate-400">@(fa ? "مقاله پیدا نشد." : "Post not found.")</p>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="mb-6">
|
||||
<span class="label-mono text-electric">@Model.Category</span>
|
||||
<h1 class="mt-3 font-display text-3xl font-extrabold leading-tight text-white @(fa ? "font-fa" : "")">@Model.Title</h1>
|
||||
<p class="mt-2 label-mono text-slate-500">@Model.ReadTime @(fa ? "دقیقه مطالعه" : "min read")</p>
|
||||
</div>
|
||||
|
||||
<article class="prose-custom glass p-8">
|
||||
@Html.Raw(Model.BodyHtml)
|
||||
</article>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@section Scripts {
|
||||
<style>
|
||||
.prose-custom { color:#cbd5e1; line-height:1.8; }
|
||||
.prose-custom h2,.prose-custom h3 { font-family:'Syne',sans-serif; font-weight:700; color:#fff; margin:2rem 0 .75rem; }
|
||||
.prose-custom p { margin-bottom:1.25rem; }
|
||||
.prose-custom code { font-family:'SpaceMono',monospace; background:rgba(56,189,248,.08); border:1px solid rgba(56,189,248,.2); border-radius:.35rem; padding:.15em .45em; font-size:.85em; color:#38bdf8; }
|
||||
.prose-custom pre { background:#050a1a; border:1px solid rgba(255,255,255,.06); border-radius:.75rem; padding:1.25rem; overflow-x:auto; margin:1.5rem 0; }
|
||||
.prose-custom pre code { background:none; border:none; padding:0; color:#e2e8f0; }
|
||||
.prose-custom ul,.prose-custom ol { padding-inline-start:1.5rem; margin-bottom:1.25rem; }
|
||||
.prose-custom li { margin-bottom:.4rem; }
|
||||
.prose-custom blockquote { border-inline-start:3px solid #38bdf8; padding-inline-start:1rem; color:#94a3b8; margin:1.5rem 0; }
|
||||
.prose-custom strong { color:#e2e8f0; }
|
||||
.prose-custom a { color:#38bdf8; text-decoration:underline; text-underline-offset:.2em; }
|
||||
</style>
|
||||
}
|
||||
Reference in New Issue
Block a user