diff --git a/PlotLine/Controllers/PublicController.cs b/PlotLine/Controllers/PublicController.cs
new file mode 100644
index 0000000..12fd283
--- /dev/null
+++ b/PlotLine/Controllers/PublicController.cs
@@ -0,0 +1,31 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using PlotLine.ViewModels;
+
+namespace PlotLine.Controllers;
+
+[AllowAnonymous]
+[Route("")]
+public sealed class PublicController : Controller
+{
+ private const string SupportEmail = "hello@plotweaver.studio";
+ private const string PolicyDate = "June 7, 2026";
+
+ [HttpGet("About")]
+ public IActionResult About() => View(CreateModel());
+
+ [HttpGet("Contact")]
+ public IActionResult Contact() => View(CreateModel());
+
+ [HttpGet("Privacy")]
+ public IActionResult Privacy() => View(CreateModel());
+
+ [HttpGet("Terms")]
+ public IActionResult Terms() => View(CreateModel());
+
+ private static PublicPageViewModel CreateModel() => new()
+ {
+ SupportEmail = SupportEmail,
+ LastUpdated = PolicyDate
+ };
+}
diff --git a/PlotLine/ViewModels/AuthViewModels.cs b/PlotLine/ViewModels/AuthViewModels.cs
index cd9cba3..4b77fb2 100644
--- a/PlotLine/ViewModels/AuthViewModels.cs
+++ b/PlotLine/ViewModels/AuthViewModels.cs
@@ -24,6 +24,12 @@ public sealed class PricingViewModel
public bool IsSignedIn { get; set; }
}
+public sealed class PublicPageViewModel
+{
+ public string SupportEmail { get; set; } = "support@plotweaver.studio";
+ public string LastUpdated { get; set; } = "June 7, 2026";
+}
+
public sealed class RegisterViewModel
{
[Required(ErrorMessage = "Enter your email address.")]
diff --git a/PlotLine/Views/Home/Index.cshtml b/PlotLine/Views/Home/Index.cshtml
index f16b246..82b9ca3 100644
--- a/PlotLine/Views/Home/Index.cshtml
+++ b/PlotLine/Views/Home/Index.cshtml
@@ -231,7 +231,7 @@
diff --git a/PlotLine/wwwroot/css/plotline-theme.css b/PlotLine/wwwroot/css/plotline-theme.css
index 41f6ee3..7a1293c 100644
--- a/PlotLine/wwwroot/css/plotline-theme.css
+++ b/PlotLine/wwwroot/css/plotline-theme.css
@@ -3102,6 +3102,218 @@ a:focus-visible {
white-space: nowrap;
}
+.public-info-page {
+ margin-top: -1rem;
+}
+
+.public-hero {
+ padding: clamp(2rem, 5vw, 3.75rem) 0 clamp(2.5rem, 6vw, 4.5rem);
+ background:
+ radial-gradient(circle at 18% 20%, rgba(212, 165, 116, 0.2), transparent 24rem),
+ linear-gradient(180deg, var(--marketing-cream), var(--marketing-offwhite));
+}
+
+.public-hero__inner {
+ display: grid;
+ justify-items: center;
+ gap: 1.05rem;
+ text-align: center;
+}
+
+.public-hero h1 {
+ max-width: 13ch;
+}
+
+.public-hero .marketing-lead {
+ max-width: 50rem;
+}
+
+.public-updated {
+ margin: 0;
+ border: 1px solid rgba(31, 42, 68, 0.12);
+ border-radius: 999px;
+ padding: 0.45rem 0.85rem;
+ color: var(--marketing-muted);
+ background: rgba(255, 253, 249, 0.78);
+ font-weight: 760;
+}
+
+.public-content-section,
+.public-mission {
+ padding: clamp(3.5rem, 7vw, 6rem) 0;
+}
+
+.public-content-section {
+ background: var(--marketing-offwhite);
+}
+
+.public-content-section--soft,
+.public-mission {
+ background:
+ radial-gradient(circle at 90% 20%, rgba(95, 120, 108, 0.12), transparent 24rem),
+ var(--marketing-cream);
+}
+
+.public-narrative,
+.public-policy {
+ max-width: 860px;
+}
+
+.public-narrative {
+ display: grid;
+ gap: 1rem;
+}
+
+.public-narrative p,
+.public-policy p,
+.public-policy li,
+.public-card p {
+ color: var(--marketing-muted);
+ font-size: clamp(1rem, 1.45vw, 1.13rem);
+ line-height: 1.75;
+}
+
+.public-narrative p {
+ margin: 0;
+}
+
+.public-narrative strong {
+ color: var(--marketing-navy);
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: clamp(1.7rem, 3vw, 2.45rem);
+ line-height: 1.15;
+}
+
+.public-feature-panel {
+ border: 1px solid rgba(31, 42, 68, 0.11);
+ border-radius: 28px;
+ padding: clamp(2rem, 5vw, 4rem);
+ background: rgba(255, 253, 249, 0.9);
+ box-shadow: 0 22px 56px rgba(31, 42, 68, 0.1);
+ text-align: center;
+}
+
+.public-feature-panel h2 {
+ max-width: 860px;
+ margin: 0 auto;
+ font-size: clamp(2rem, 4vw, 3.6rem);
+}
+
+.public-card-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 1rem;
+}
+
+.public-card {
+ border: 1px solid rgba(31, 42, 68, 0.1);
+ border-radius: 18px;
+ padding: clamp(1.1rem, 2.2vw, 1.5rem);
+ background:
+ linear-gradient(180deg, rgba(255, 253, 249, 0.96), rgba(250, 248, 245, 0.88)),
+ #fff;
+ box-shadow: 0 16px 36px rgba(31, 42, 68, 0.07);
+}
+
+.public-card h2,
+.public-policy h2 {
+ margin: 0;
+ color: var(--marketing-navy);
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: clamp(1.35rem, 2.1vw, 1.85rem);
+}
+
+.public-card p {
+ margin: 0.7rem 0 0;
+}
+
+.public-policy {
+ display: grid;
+ gap: clamp(1.4rem, 3vw, 2.1rem);
+}
+
+.public-policy section {
+ border-bottom: 1px solid rgba(31, 42, 68, 0.1);
+ padding-bottom: clamp(1.2rem, 2.6vw, 1.8rem);
+}
+
+.public-policy p {
+ margin: 0.65rem 0 0;
+}
+
+.public-policy ul {
+ display: grid;
+ gap: 0.55rem;
+ margin: 0.75rem 0 0;
+ padding-left: 1.25rem;
+}
+
+.public-policy a,
+.public-card a {
+ color: var(--marketing-navy);
+ font-weight: 820;
+}
+
+.public-disclaimer {
+ border: 1px solid rgba(212, 165, 116, 0.38);
+ border-radius: 18px;
+ padding: 1rem 1.1rem;
+ background: rgba(212, 165, 116, 0.13);
+}
+
+.public-disclaimer p {
+ margin: 0;
+ color: #6b4a22;
+ font-size: 0.96rem;
+ font-weight: 720;
+}
+
+.public-footer {
+ border-top: 1px solid rgba(255, 250, 242, 0.12);
+ background: #1f2a44;
+}
+
+.public-footer__inner {
+ display: flex;
+ justify-content: space-between;
+ gap: 1rem;
+ align-items: center;
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.public-footer__brand {
+ color: #fffaf2;
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: 1.25rem;
+ font-weight: 700;
+ text-decoration: none;
+}
+
+.public-footer__brand:hover,
+.public-footer__brand:focus {
+ color: #d4a574;
+}
+
+.public-footer__nav {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ gap: 0.55rem 1rem;
+}
+
+.public-footer__nav a {
+ color: rgba(255, 250, 242, 0.76);
+ font-size: 0.92rem;
+ font-weight: 760;
+ text-decoration: none;
+}
+
+.public-footer__nav a:hover,
+.public-footer__nav a:focus {
+ color: #d4a574;
+}
+
.pricing-feature-list {
display: grid;
gap: 0.65rem;
@@ -3240,7 +3452,8 @@ a:focus-visible {
}
.comparison-grid,
- .faq-grid {
+ .faq-grid,
+ .public-card-grid {
grid-template-columns: 1fr;
}
}
@@ -3352,6 +3565,19 @@ a:focus-visible {
.pricing-card-grid {
grid-template-columns: 1fr;
}
+
+ .public-hero {
+ padding-top: 1.8rem;
+ }
+
+ .public-footer__inner {
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ .public-footer__nav {
+ justify-content: flex-start;
+ }
}
@media (max-width: 520px) {