# @seoTitle
@seoDescription
Keywords: @seoKeywords

@using System.Security.Claims @inject IConfiguration Configuration @inject IFeatureRequestService FeatureRequestService @inject IOnboardingService OnboardingService @{ var shellClass = ViewData["ShellClass"] as string ?? string.Empty; var isMarketingPage = shellClass.Contains("marketing-shell", StringComparison.OrdinalIgnoreCase); var userEmail = User.FindFirstValue(ClaimTypes.Email); var userIdValue = User.FindFirstValue(ClaimTypes.NameIdentifier); var userId = int.TryParse(userIdValue, out var parsedUserId) ? parsedUserId : (int?)null; var adminEmails = Configuration.GetSection("Admin:AllowedEmails").Get<string[]>() ?? []; var isAdmin = !string.IsNullOrWhiteSpace(userEmail) && adminEmails.Any(email => string.Equals(email, userEmail, StringComparison.OrdinalIgnoreCase)); var featureRequestAttentionCount = userId.HasValue ? await FeatureRequestService.CountAttentionForUserAsync(userId.Value) : 0; var adminFeatureRequestAttentionCount = isAdmin ? await FeatureRequestService.CountWaitingForAdminAsync() : 0; var showWordCompanionHeader = User.Identity?.IsAuthenticated == true && await OnboardingService.ShouldShowWordCompanionHeaderAsync(); var seoMetadata = ViewData["Seo"] as SeoMetadata; var defaultTitle = PublicSeo.DisplayTitle(ViewData["Title"] as string); var seoTitle = ViewData["SeoTitle"] is string seoTitleValue ? seoTitleValue : defaultTitle; var hasSeoMetadata = seoMetadata is not null || ViewData["SeoDescription"] is string || ViewData["CanonicalUrl"] is string; var seoDescription = ViewData["SeoDescription"] as string; var canonicalUrl = ViewData["CanonicalUrl"] as string; var seoKeywords = ViewData["SeoKeywords"] as string; var structuredData = ViewData["StructuredData"] is IEnumerable<string> structuredDataValues ? structuredDataValues : Array.Empty<string>(); var ogTitle = ViewData["OgTitle"] as string ?? seoTitle; var ogDescription = ViewData["OgDescription"] as string ?? seoDescription; var ogType = ViewData["OgType"] as string ?? "website"; var ogImageUrl = ViewData["OgImage"] as string ?? "https://plotdirector.com/og-image.png"; var twitterCard = ViewData["TwitterCard"] as string ?? "summary_large_image"; } @if (hasSeoMetadata) { @if (!string.IsNullOrWhiteSpace(seoDescription)) { } @if (!string.IsNullOrWhiteSpace(seoKeywords)) { } @if (!string.IsNullOrWhiteSpace(ogDescription)) { } @if (!string.IsNullOrWhiteSpace(canonicalUrl)) { } @if (!string.IsNullOrWhiteSpace(ogDescription)) { } } @foreach (var jsonLd in structuredData) { @Html.Raw("
") } @if (!string.IsNullOrWhiteSpace(canonicalUrl)) { }
@if (TempData["ArchiveMessage"] is string archiveMessage) {
@archiveMessage
} @if (TempData["ArchiveError"] is string archiveError) {
@archiveError
} @if (TempData["ImportMessage"] is string importMessage) {
@importMessage
} @RenderBody()
Help

Choose More from a help popover to open the full guide.

@if ((ViewData["ShellClass"] as string)?.Contains("marketing-shell", StringComparison.OrdinalIgnoreCase) == true) {
}

## Confirm action

Type DELETE to continue
@if (User.Identity?.IsAuthenticated == true) {
}
@if (User.Identity?.IsAuthenticated == true) {
} @await RenderSectionAsync("Scripts", required: false)