F025: Literary Landing Pages (MyStoryFlow Integration)
Overview
Create beautifully designed genre-specific landing pages within MyStoryFlow, featuring vintage book aesthetics and compelling storytelling to attract authors from different literary traditions.
Dependencies
- F000: MyStoryFlow Monorepo Structure
- F000B: Shared Packages (@mystoryflow/*)
- F001: Project Setup (branding)
- Reference Data System (genres)
Quick Implementation
Using MyStoryFlow Components
- Hero sections with manuscript imagery
- Feature grids with literary icons
- Author testimonials in quote cards
- FAQ with vintage accordion design
- Pricing with parchment styling
- SEO-optimized literary content
New Requirements
- Dynamic genre pages from reference data
- Literary-themed content per genre
- Conversion tracking with analytics
- Personalized author journeys
MVP Implementation
1. Genre Configuration
// apps/analyzer/src/lib/genres/genre-config.ts
import { useReferenceData } from '@mystoryflow/reference-data'
export interface GenreConfig {
code: string
name: string
slug: string
tagline: string
description: string
heroImage: string
themeColors: {
primary: string
secondary: string
accent: string
}
literaryTradition: string
features: GenreFeature[]
testimonials: GenreTestimonial[]
faqs: GenreFAQ[]
sampleReports: string[]
keywords: string[]
metaDescription: string
}
export interface GenreFeature {
title: string
description: string
icon: string
}
export interface GenreTestimonial {
author: string
role: string
quote: string
bookTitle?: string
rating: number
image?: string
}
export interface GenreFAQ {
question: string
answer: string
}
export const GENRE_CONFIGS: Record<string, GenreConfig> = {
romance: {
code: 'romance',
name: 'Romance',
slug: 'romance',
tagline: 'Perfect Your Love Story with AI-Powered Analysis',
description: 'Get detailed feedback on character chemistry, emotional arcs, pacing, and romance tropes. Our AI understands what makes readers fall in love with your characters.',
heroImage: '/images/genres/romance-hero.jpg',
accentColor: '#e11d48', // rose-600
features: [
{
title: 'Chemistry Analysis',
description: 'Evaluate the romantic tension and chemistry between your characters',
icon: '❤️'
},
{
title: 'Emotional Arc Tracking',
description: 'Ensure your emotional beats hit at the right moments',
icon: '📊'
},
{
title: 'Trope Detection',
description: 'Identify romance tropes and how effectively you use them',
icon: '📖'
},
{
title: 'Heat Level Assessment',
description: 'Ensure your romance matches reader expectations for your subgenre',
icon: '🔥'
},
{
title: 'Conflict Balance',
description: 'Analyze internal vs external conflicts driving your romance',
icon: '⚖️'
},
{
title: 'HEA Satisfaction',
description: 'Evaluate how satisfying your happily-ever-after feels',
icon: '🎆'
}
],
testimonials: [
{
author: 'Sarah Mitchell',
role: 'Bestselling Romance Author',
quote: 'The chemistry analysis helped me understand why my beta readers weren\'t connecting with my couple. After implementing the suggestions, my next book hit the USA Today list!',
bookTitle: 'Forever Yours',
rating: 5,
image: '/images/testimonials/sarah-mitchell.jpg'
},
{
author: 'Jessica Chen',
role: 'Contemporary Romance Writer',
quote: 'I was struggling with pacing in my slow-burn romance. The AI pinpointed exactly where I was losing tension and gave me actionable fixes.',
rating: 5
}
],
faqs: [
{
question: 'Does it work for all romance subgenres?',
answer: 'Yes! Our AI is trained on contemporary, historical, paranormal, romantic suspense, and more. It adapts its analysis to your specific subgenre expectations.'
},
{
question: 'How does it analyze chemistry between characters?',
answer: 'Our AI examines dialogue patterns, physical interactions, emotional responses, and tension-building scenes to evaluate the romantic chemistry and provide specific suggestions for improvement.'
},
{
question: 'Will it help with steam/heat levels?',
answer: 'Absolutely. The AI can assess whether your heat level matches your target audience expectations and provide guidance on building tension appropriately for your subgenre.'
}
],
sampleReports: ['romance-sample-1.pdf', 'romance-sample-2.pdf'],
keywords: ['romance manuscript analysis', 'romance writing feedback', 'romance novel editor', 'romance book analysis'],
metaDescription: 'AI-powered romance manuscript analysis. Get detailed feedback on character chemistry, emotional arcs, and pacing. Perfect your love story today!'
},
mystery: {
code: 'mystery',
name: 'Mystery/Thriller',
slug: 'mystery-thriller',
tagline: 'Craft the Perfect Page-Turner with AI Analysis',
description: 'Analyze plot twists, red herrings, pacing, and suspense. Our AI helps you keep readers guessing until the very last page.',
heroImage: '/images/genres/mystery-hero.jpg',
accentColor: '#6366f1', // indigo-500
features: [
{
title: 'Plot Twist Analysis',
description: 'Evaluate the effectiveness and timing of your reveals',
icon: '🌀'
},
{
title: 'Red Herring Detection',
description: 'Ensure your misdirections are clever but fair',
icon: '🐟'
},
{
title: 'Clue Distribution',
description: 'Track how you plant and reveal clues throughout',
icon: '🔍'
},
{
title: 'Suspense Pacing',
description: 'Analyze tension levels chapter by chapter',
icon: '⏱️'
},
{
title: 'Character Motives',
description: 'Evaluate the credibility of suspect motivations',
icon: '🎭'
},
{
title: 'Resolution Satisfaction',
description: 'Ensure your ending delivers on the mystery promise',
icon: '🎯'
}
],
testimonials: [
{
author: 'Michael Torres',
role: 'Crime Fiction Author',
quote: 'The clue distribution analysis was eye-opening. I realized I had clustered too many reveals in act three. The rewrite based on the AI feedback got me my first traditional publishing deal.',
bookTitle: 'Silent Witness',
rating: 5
}
],
faqs: [
{
question: 'Can it help with police procedurals?',
answer: 'Yes! Our AI understands different mystery subgenres including cozies, police procedurals, psychological thrillers, and more.'
},
{
question: 'How does it analyze plot twists?',
answer: 'The AI examines foreshadowing, setup, timing, and reader expectations to evaluate whether your twists are both surprising and satisfying.'
}
],
sampleReports: ['mystery-sample-1.pdf'],
keywords: ['mystery manuscript analysis', 'thriller writing feedback', 'mystery plot analysis', 'crime fiction editor'],
metaDescription: 'AI-powered mystery & thriller manuscript analysis. Perfect your plot twists, pacing, and suspense. Create unputdownable mysteries!'
},
fantasy: {
code: 'fantasy',
name: 'Fantasy',
slug: 'fantasy',
tagline: 'Build Worlds That Enchant with AI-Powered Insights',
description: 'Analyze world-building consistency, magic systems, character arcs, and epic scope. Create immersive fantasy that transports readers.',
heroImage: '/images/genres/fantasy-hero.jpg',
accentColor: '#8b5cf6', // violet-500
features: [
{
title: 'World-Building Analysis',
description: 'Ensure your fantasy world is consistent and immersive',
icon: '🌍'
},
{
title: 'Magic System Logic',
description: 'Evaluate rules, limitations, and consistency of magic',
icon: '✨'
},
{
title: 'Character Journey',
description: 'Track hero\'s journey and character growth arcs',
icon: '🗺️'
},
{
title: 'Pacing Balance',
description: 'Balance action, exposition, and character moments',
icon: '⚔️'
},
{
title: 'Stakes Escalation',
description: 'Ensure stakes grow appropriately throughout',
icon: '📊'
},
{
title: 'Series Potential',
description: 'Identify threads for future books if applicable',
icon: '📚'
}
],
testimonials: [
{
author: 'Elena Blackwood',
role: 'Epic Fantasy Author',
quote: 'The world-building consistency check caught several timeline issues I had missed through multiple revisions. Invaluable for complex fantasy worlds!',
bookTitle: 'Crown of Shadows',
rating: 5
}
],
faqs: [
{
question: 'Does it work for urban fantasy too?',
answer: 'Absolutely! Our AI adapts to all fantasy subgenres including epic, urban, dark, cozy, and romantasy.'
},
{
question: 'How detailed is the world-building analysis?',
answer: 'Very detailed. We analyze geography, cultures, magic systems, politics, economics, and internal consistency across all elements.'
}
],
sampleReports: ['fantasy-sample-1.pdf'],
keywords: ['fantasy manuscript analysis', 'fantasy writing feedback', 'world-building analysis', 'fantasy novel editor'],
metaDescription: 'AI-powered fantasy manuscript analysis. Perfect your world-building, magic systems, and epic storytelling. Create unforgettable fantasy!'
}
}2. Dynamic Landing Page Component
// apps/analyzer-app/src/app/genres/[slug]/page.tsx
import { Metadata } from 'next'
import { notFound } from 'next/navigation'
import { GENRE_CONFIGS } from '@/lib/genres/genre-config'
import { GenreHero } from '@/components/landing/GenreHero'
import { GenreFeatures } from '@/components/landing/GenreFeatures'
import { GenreTestimonials } from '@/components/landing/GenreTestimonials'
import { GenreFAQ } from '@/components/landing/GenreFAQ'
import { GenreCTA } from '@/components/landing/GenreCTA'
import { GenrePricing } from '@/components/landing/GenrePricing'
export async function generateStaticParams() {
return Object.values(GENRE_CONFIGS).map((genre) => ({
slug: genre.slug,
}))
}
export async function generateMetadata({
params
}: {
params: { slug: string }
}): Promise<Metadata> {
const genre = Object.values(GENRE_CONFIGS).find(g => g.slug === params.slug)
if (!genre) return {}
return {
title: `${genre.name} Manuscript Analysis | Story Analyzer`,
description: genre.metaDescription,
keywords: genre.keywords.join(', '),
openGraph: {
title: genre.tagline,
description: genre.description,
images: [genre.heroImage],
},
}
}
export default function GenreLandingPage({
params
}: {
params: { slug: string }
}) {
const genre = Object.values(GENRE_CONFIGS).find(g => g.slug === params.slug)
if (!genre) {
notFound()
}
return (
<div className="min-h-screen">
{/* Hero Section */}
<GenreHero genre={genre} />
{/* Features Grid */}
<GenreFeatures features={genre.features} accentColor={genre.accentColor} />
{/* Sample Report CTA */}
<section className="py-16 bg-muted/50">
<div className="container">
<div className="text-center max-w-3xl mx-auto">
<h2 className="text-3xl font-bold mb-4">
See a Sample {genre.name} Analysis Report
</h2>
<p className="text-lg text-muted-foreground mb-8">
Download a real analysis report to see the depth of feedback
you'll receive for your {genre.name.toLowerCase()} manuscript.
</p>
<Button size="lg" variant="outline" asChild>
<a href={`/samples/${genre.sampleReports[0]}`} download>
Download Sample Report
<Download className="ml-2 h-4 w-4" />
</a>
</Button>
</div>
</div>
</section>
{/* Testimonials */}
<GenreTestimonials testimonials={genre.testimonials} />
{/* How It Works */}
<section className="py-16">
<div className="container">
<h2 className="text-3xl font-bold text-center mb-12">
How {genre.name} Analysis Works
</h2>
<div className="grid md:grid-cols-3 gap-8 max-w-4xl mx-auto">
<div className="text-center">
<div className="w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4">
<span className="text-2xl">1</span>
</div>
<h3 className="font-semibold mb-2">Upload Your Manuscript</h3>
<p className="text-sm text-muted-foreground">
Securely upload your {genre.name.toLowerCase()} manuscript in
any format (DOCX, PDF, TXT)
</p>
</div>
<div className="text-center">
<div className="w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4">
<span className="text-2xl">2</span>
</div>
<h3 className="font-semibold mb-2">AI Analyzes Your Story</h3>
<p className="text-sm text-muted-foreground">
Our genre-trained AI examines every aspect of your
{genre.name.toLowerCase()} novel
</p>
</div>
<div className="text-center">
<div className="w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4">
<span className="text-2xl">3</span>
</div>
<h3 className="font-semibold mb-2">Get Detailed Feedback</h3>
<p className="text-sm text-muted-foreground">
Receive your comprehensive report with actionable insights
in under 5 minutes
</p>
</div>
</div>
</div>
</section>
{/* Pricing */}
<GenrePricing genre={genre} />
{/* FAQ */}
<GenreFAQ faqs={genre.faqs} />
{/* Final CTA */}
<GenreCTA genre={genre} />
</div>
)
}3. Genre Hero Component
// apps/analyzer-app/src/components/landing/GenreHero.tsx
'use client'
import { Button } from '@mystoryflow/ui'
import { ArrowRight, Star } from 'lucide-react'
import Link from 'next/link'
import { motion } from 'framer-motion'
import type { GenreConfig } from '@/lib/genres/genre-config'
export function GenreHero({ genre }: { genre: GenreConfig }) {
return (
<section
className="relative min-h-[600px] flex items-center py-20"
style={{
background: `linear-gradient(135deg, ${genre.accentColor}20 0%, transparent 100%)`
}}
>
<div className="container">
<div className="grid lg:grid-cols-2 gap-12 items-center">
{/* Content */}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
>
<div className="flex items-center gap-2 mb-4">
<div className="flex">
{[...Array(5)].map((_, i) => (
<Star key={i} className="h-5 w-5 fill-current text-yellow-500" />
))}
</div>
<span className="text-sm text-muted-foreground">
Trusted by 1,000+ {genre.name} authors
</span>
</div>
<h1 className="text-5xl lg:text-6xl font-bold mb-6">
{genre.tagline}
</h1>
<p className="text-xl text-muted-foreground mb-8">
{genre.description}
</p>
<div className="flex flex-col sm:flex-row gap-4">
<Button size="lg" asChild>
<Link href="/sign-up">
Analyze Your {genre.name} Novel
<ArrowRight className="ml-2 h-4 w-4" />
</Link>
</Button>
<Button size="lg" variant="outline" asChild>
<Link href="#features">
See What We Analyze
</Link>
</Button>
</div>
<div className="flex items-center gap-6 mt-8 text-sm">
<div>
<span className="font-semibold">5 min</span>
<span className="text-muted-foreground"> analysis time</span>
</div>
<div>
<span className="font-semibold">200+</span>
<span className="text-muted-foreground"> checkpoints</span>
</div>
<div>
<span className="font-semibold">20+</span>
<span className="text-muted-foreground"> page report</span>
</div>
</div>
</motion.div>
{/* Hero Image */}
<motion.div
initial={{ opacity: 0, scale: 0.95 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.6, delay: 0.2 }}
className="relative"
>
<img
src={genre.heroImage}
alt={`${genre.name} manuscript analysis`}
className="rounded-lg shadow-2xl"
/>
<div className="absolute -bottom-6 -left-6 bg-white dark:bg-gray-800 p-4 rounded-lg shadow-lg">
<div className="flex items-center gap-3">
<div className="w-12 h-12 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center">
<span className="text-2xl">✓</span>
</div>
<div>
<p className="font-semibold">Genre-Specific Analysis</p>
<p className="text-sm text-muted-foreground">
Trained on {genre.name} bestsellers
</p>
</div>
</div>
</div>
</motion.div>
</div>
</div>
</section>
)
}4. Genre Features Grid
// apps/analyzer-app/src/components/landing/GenreFeatures.tsx
'use client'
import { Card } from '@mystoryflow/ui'
import { motion } from 'framer-motion'
import type { GenreFeature } from '@/lib/genres/genre-config'
export function GenreFeatures({
features,
accentColor
}: {
features: GenreFeature[]
accentColor: string
}) {
return (
<section id="features" className="py-20">
<div className="container">
<div className="text-center mb-12">
<h2 className="text-3xl lg:text-4xl font-bold mb-4">
Everything We Analyze in Your Manuscript
</h2>
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
Our AI examines your story from every angle, providing insights
that would take human editors weeks to compile.
</p>
</div>
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
{features.map((feature, index) => (
<motion.div
key={feature.title}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: index * 0.1 }}
viewport={{ once: true }}
>
<Card className="p-6 h-full hover:shadow-lg transition-shadow">
<div
className="text-4xl mb-4 w-16 h-16 rounded-lg flex items-center justify-center"
style={{ backgroundColor: `${accentColor}20` }}
>
{feature.icon}
</div>
<h3 className="text-xl font-semibold mb-2">
{feature.title}
</h3>
<p className="text-muted-foreground">
{feature.description}
</p>
</Card>
</motion.div>
))}
</div>
</div>
</section>
)
}5. Conversion Tracking
// apps/analyzer-app/src/components/landing/GenreCTA.tsx
'use client'
import { useState } from 'react'
import { Button, Input } from '@mystoryflow/ui'
import { ArrowRight } from 'lucide-react'
import { useRouter } from 'next/navigation'
import type { GenreConfig } from '@/lib/genres/genre-config'
export function GenreCTA({ genre }: { genre: GenreConfig }) {
const [email, setEmail] = useState('')
const router = useRouter()
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
// Track conversion
await fetch('/api/analytics/track', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event: 'genre_cta_submit',
properties: {
genre: genre.code,
email,
source: 'landing_page_bottom'
}
})
})
// Redirect to sign-up with pre-filled email
router.push(`/sign-up?email=${encodeURIComponent(email)}&genre=${genre.code}`)
}
return (
<section
className="py-20"
style={{
background: `linear-gradient(135deg, ${genre.accentColor}10 0%, transparent 100%)`
}}
>
<div className="container">
<div className="max-w-3xl mx-auto text-center">
<h2 className="text-4xl font-bold mb-4">
Ready to Perfect Your {genre.name} Manuscript?
</h2>
<p className="text-xl text-muted-foreground mb-8">
Join thousands of authors who've improved their stories with our
AI-powered analysis. Get started in less than 2 minutes.
</p>
<form onSubmit={handleSubmit} className="flex flex-col sm:flex-row gap-4 max-w-md mx-auto">
<Input
type="email"
placeholder="Enter your email"
value={email}
onChange={(e) => setEmail(e.target.value)}
className="flex-1"
required
/>
<Button type="submit" size="lg">
Start Free Analysis
<ArrowRight className="ml-2 h-4 w-4" />
</Button>
</form>
<p className="text-sm text-muted-foreground mt-4">
No credit card required • 3 free analyses per month
</p>
<div className="flex items-center justify-center gap-8 mt-12">
<div>
<p className="text-3xl font-bold" style={{ color: genre.accentColor }}>
98%
</p>
<p className="text-sm text-muted-foreground">
satisfaction rate
</p>
</div>
<div className="h-12 w-px bg-border" />
<div>
<p className="text-3xl font-bold" style={{ color: genre.accentColor }}>
50K+
</p>
<p className="text-sm text-muted-foreground">
manuscripts analyzed
</p>
</div>
<div className="h-12 w-px bg-border" />
<div>
<p className="text-3xl font-bold" style={{ color: genre.accentColor }}>
4.9★
</p>
<p className="text-sm text-muted-foreground">
average rating
</p>
</div>
</div>
</div>
</div>
</section>
)
}6. A/B Testing Integration
// apps/analyzer-app/src/hooks/useABTest.ts
import { useEffect, useState } from 'react'
import { createClient } from '@mystoryflow/database/client'
export function useABTest(testName: string, variants: string[]) {
const [variant, setVariant] = useState<string>(variants[0])
const [loading, setLoading] = useState(true)
const supabase = getSupabaseBrowserClient()
useEffect(() => {
const assignVariant = async () => {
// Check if user already has a variant
const stored = localStorage.getItem(`ab-test-${testName}`)
if (stored && variants.includes(stored)) {
setVariant(stored)
setLoading(false)
return
}
// Assign random variant
const newVariant = variants[Math.floor(Math.random() * variants.length)]
localStorage.setItem(`ab-test-${testName}`, newVariant)
setVariant(newVariant)
// Track assignment
await fetch('/api/analytics/track', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event: 'ab_test_assigned',
properties: {
test_name: testName,
variant: newVariant
}
})
})
setLoading(false)
}
assignVariant()
}, [testName, variants])
const trackConversion = async (conversionType: string) => {
await fetch('/api/analytics/track', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event: 'ab_test_conversion',
properties: {
test_name: testName,
variant,
conversion_type: conversionType
}
})
})
}
return { variant, loading, trackConversion }
}MVP Acceptance Criteria
- Dynamic genre landing pages
- SEO-optimized meta tags
- Genre-specific content and imagery
- Testimonials and social proof
- Feature highlights
- Sample report downloads
- FAQ sections
- Conversion tracking
- A/B testing framework
- Mobile-responsive design
Post-MVP Enhancements
- Video testimonials
- Interactive demo
- Genre-specific blog content
- Comparison with competitors
- Success story case studies
- Author resource downloads
- Genre writing tips
- Community showcase
- Webinar registrations
- Email capture optimization
Implementation Time
- Development: 2 days
- Testing: 0.5 days
- Total: 2.5 days
Dependencies
- SEO configuration
- Analytics setup
- Image assets for each genre
- Sample report PDFs
Next Feature
After completion, proceed to F029-TESTING-SUITE for quality assurance.