diff --git a/PlotLine/Views/Home/Index.cshtml b/PlotLine/Views/Home/Index.cshtml index 82b9ca3..161a029 100644 --- a/PlotLine/Views/Home/Index.cshtml +++ b/PlotLine/Views/Home/Index.cshtml @@ -1,6 +1,48 @@ @{ ViewData["Title"] = "Finally finish your novel"; ViewData["ShellClass"] = "marketing-shell"; + ViewData["SeoTitle"] = "PlotWeaver Studio | Novel Planning Software for Authors"; + ViewData["SeoDescription"] = "PlotWeaver Studio helps authors organise characters, plot threads, timelines, story assets, relationships, and continuity so they can finish complex novels with confidence."; + ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible"; + ViewData["CanonicalUrl"] = "https://plotweaver.studio/"; + ViewData["StructuredData"] = new[] + { + """ + { + "@context": "https://schema.org", + "@type": "WebSite", + "name": "PlotWeaver Studio", + "url": "https://plotweaver.studio", + "description": "Novel planning and story organisation software for authors." + } + """, + """ + { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + "name": "PlotWeaver Studio", + "applicationCategory": "WritingApplication", + "operatingSystem": "Web", + "description": "Novel planning software for authors to organise characters, plot threads, timelines, story assets, relationships, continuity, and series.", + "url": "https://plotweaver.studio", + "offers": { + "@type": "Offer", + "priceCurrency": "GBP", + "availability": "https://schema.org/InStock" + } + } + """, + """ + { + "@context": "https://schema.org", + "@type": "Organization", + "name": "PlotWeaver Studio", + "url": "https://plotweaver.studio", + "logo": "https://plotweaver.studio/android-chrome-512x512.png", + "sameAs": [] + } + """ + }; }
diff --git a/PlotLine/Views/Pricing/Index.cshtml b/PlotLine/Views/Pricing/Index.cshtml index bba29b5..3b0566a 100644 --- a/PlotLine/Views/Pricing/Index.cshtml +++ b/PlotLine/Views/Pricing/Index.cshtml @@ -3,6 +3,29 @@ @{ ViewData["Title"] = "Pricing"; ViewData["ShellClass"] = "marketing-shell"; + ViewData["SeoTitle"] = "Pricing | PlotWeaver Studio"; + ViewData["SeoDescription"] = "Compare PlotWeaver Studio plans and choose the right subscription for organising your novel, series, characters, plot threads, timelines, and story details."; + ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible"; + ViewData["CanonicalUrl"] = "https://plotweaver.studio/pricing"; + ViewData["StructuredData"] = new[] + { + """ + { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + "name": "PlotWeaver Studio", + "applicationCategory": "WritingApplication", + "operatingSystem": "Web", + "description": "Novel planning software for authors to organise characters, plot threads, timelines, story assets, relationships, continuity, and series.", + "url": "https://plotweaver.studio", + "offers": { + "@type": "Offer", + "priceCurrency": "GBP", + "availability": "https://schema.org/InStock" + } + } + """ + }; var paidPlans = Model.Plans.Where(x => x.RequiresStripeSubscription).ToList(); var suggestedPlanId = paidPlans.Count >= 2 ? paidPlans[paidPlans.Count / 2].SubscriptionLevelID : (int?)null; } diff --git a/PlotLine/Views/Public/About.cshtml b/PlotLine/Views/Public/About.cshtml index 31148e3..a066b83 100644 --- a/PlotLine/Views/Public/About.cshtml +++ b/PlotLine/Views/Public/About.cshtml @@ -2,6 +2,10 @@ @{ ViewData["Title"] = "About"; ViewData["ShellClass"] = "marketing-shell"; + ViewData["SeoTitle"] = "About PlotWeaver Studio | Built for Novelists"; + ViewData["SeoDescription"] = "Learn why PlotWeaver Studio was created by a novelist to help writers organise complex stories, manage continuity, and finish their books with confidence."; + ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible"; + ViewData["CanonicalUrl"] = "https://plotweaver.studio/about"; }
diff --git a/PlotLine/Views/Public/Contact.cshtml b/PlotLine/Views/Public/Contact.cshtml index 68e7da8..77f477e 100644 --- a/PlotLine/Views/Public/Contact.cshtml +++ b/PlotLine/Views/Public/Contact.cshtml @@ -2,6 +2,10 @@ @{ ViewData["Title"] = "Contact"; ViewData["ShellClass"] = "marketing-shell"; + ViewData["SeoTitle"] = "Contact PlotWeaver Studio"; + ViewData["SeoDescription"] = "Contact PlotWeaver Studio for support, questions, feedback, or feature suggestions about our novel planning and story organisation platform."; + ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible"; + ViewData["CanonicalUrl"] = "https://plotweaver.studio/contact"; }
diff --git a/PlotLine/Views/Public/Privacy.cshtml b/PlotLine/Views/Public/Privacy.cshtml index 28ff477..104b206 100644 --- a/PlotLine/Views/Public/Privacy.cshtml +++ b/PlotLine/Views/Public/Privacy.cshtml @@ -2,6 +2,10 @@ @{ ViewData["Title"] = "Privacy Policy"; ViewData["ShellClass"] = "marketing-shell"; + ViewData["SeoTitle"] = "Privacy Policy | PlotWeaver Studio"; + ViewData["SeoDescription"] = "Read the PlotWeaver Studio Privacy Policy to learn how we protect your account information, subscription data, and story content."; + ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible"; + ViewData["CanonicalUrl"] = "https://plotweaver.studio/privacy"; }
diff --git a/PlotLine/Views/Public/Terms.cshtml b/PlotLine/Views/Public/Terms.cshtml index cb21ba1..f96464f 100644 --- a/PlotLine/Views/Public/Terms.cshtml +++ b/PlotLine/Views/Public/Terms.cshtml @@ -2,6 +2,10 @@ @{ ViewData["Title"] = "Terms of Service"; ViewData["ShellClass"] = "marketing-shell"; + ViewData["SeoTitle"] = "Terms of Service | PlotWeaver Studio"; + ViewData["SeoDescription"] = "Read the PlotWeaver Studio Terms of Service for information about subscriptions, user content, acceptable use, and account responsibilities."; + ViewData["SeoKeywords"] = "novel planning software, writing software, story planning app, author tools, plot tracking, character tracking, story timeline, novel organisation, fiction writing software, series writing software, continuity tracking, plot threads, story bible"; + ViewData["CanonicalUrl"] = "https://plotweaver.studio/terms"; }
diff --git a/PlotLine/Views/Shared/_Layout.cshtml b/PlotLine/Views/Shared/_Layout.cshtml index 6327993..911c2b0 100644 --- a/PlotLine/Views/Shared/_Layout.cshtml +++ b/PlotLine/Views/Shared/_Layout.cshtml @@ -1,9 +1,61 @@  +@{ + var shellClass = ViewData["ShellClass"] as string ?? string.Empty; + var isMarketingPage = shellClass.Contains("marketing-shell", StringComparison.OrdinalIgnoreCase); + var defaultTitle = $"{ViewData["Title"]} - PlotWeaver Studio"; + var seoTitle = isMarketingPage && ViewData["SeoTitle"] is string seoTitleValue ? seoTitleValue : defaultTitle; + var seoDescription = isMarketingPage && ViewData["SeoDescription"] is string seoDescriptionValue ? seoDescriptionValue : null; + var canonicalUrl = isMarketingPage && ViewData["CanonicalUrl"] is string canonicalUrlValue ? canonicalUrlValue : null; + var seoKeywords = isMarketingPage && ViewData["SeoKeywords"] is string seoKeywordsValue ? seoKeywordsValue : null; + var structuredData = isMarketingPage && ViewData["StructuredData"] is IEnumerable structuredDataValues ? structuredDataValues : Array.Empty(); + const string ogImageUrl = "https://plotweaver.studio/og-image.png"; +} - @ViewData["Title"] - PlotWeaver Studio + @seoTitle + @if (isMarketingPage) + { + @if (!string.IsNullOrWhiteSpace(seoDescription)) + { + + } + @if (!string.IsNullOrWhiteSpace(seoKeywords)) + { + + } + @if (!string.IsNullOrWhiteSpace(canonicalUrl)) + { + + } + + + + @if (!string.IsNullOrWhiteSpace(seoDescription)) + { + + } + + @if (!string.IsNullOrWhiteSpace(canonicalUrl)) + { + + } + + + + @if (!string.IsNullOrWhiteSpace(seoDescription)) + { + + } + + @foreach (var jsonLd in structuredData) + { + @Html.Raw("") + } + }