added and improved literary analysis page

This commit is contained in:
Harivansh Rathi 2024-12-03 23:23:10 -05:00
parent b9eb7cf738
commit 0134c81526
13 changed files with 1136 additions and 101 deletions

299
TECHNICAL_DOCUMENTATION.md Normal file
View file

@ -0,0 +1,299 @@
# Technical Documentation - Austen's Wedding Guide
## Project Overview
A React-based web application that serves as a modern wedding guide themed around Jane Austen's works. The project combines literary analysis with interactive features, presenting Austen's insights in a contemporary context.
## Tech Stack
- **Framework**: React with TypeScript
- **Build Tool**: Vite
- **Styling**: Tailwind CSS
- **UI Components**: Shadcn/UI
- **Routing**: React Router
- **Package Manager**: npm
## Project Structure
```
src/
├── components/
│ ├── ui/ # Shadcn UI components
│ ├── layout/ # Layout components
│ ├── vendor/ # Vendor-specific components
│ ├── BlogPost.tsx # Blog post component
│ ├── CommentSection.tsx
│ ├── ErrorBoundary.tsx
│ ├── Footer.tsx
│ ├── Layout.tsx
│ ├── LoadingSpinner.tsx
│ ├── Navbar.tsx
│ ├── Pagination.tsx
│ ├── QuoteDisplay.tsx
│ ├── Routes.tsx
│ ├── ShareButtons.tsx
│ └── theme-provider.tsx
├── data/
│ ├── blog-posts.ts # Character blog content
│ ├── quotes.ts # Austen quotes
│ ├── quiz.ts # Character quiz data
│ ├── dear-jane.ts # Advice column content
│ ├── success-stories.ts
│ ├── literary-analysis.ts # Literary analysis data
│ └── vendors.ts
├── pages/
│ ├── BlogPost/
│ ├── Advice.tsx
│ ├── Analysis.tsx # Literary analysis page
│ ├── Blogs.tsx
│ ├── DearJane.tsx
│ ├── Home.tsx
│ ├── MarketCalculator.tsx
│ ├── Quiz.tsx
│ ├── Stories.tsx
│ ├── SuccessStories.tsx
│ └── Vendors.tsx
```
## Routing Structure
The application uses React Router for navigation with the following route structure:
```typescript
<Routes>
<Route path="/" element={<Home />} />
<Route path="/blogs" element={<Blogs />} />
<Route path="/blogs/:id" element={<BlogPost />} />
<Route path="/quiz" element={<Quiz />} />
<Route path="/advice" element={<Advice />} />
<Route path="/vendors" element={<Vendors />} />
<Route path="/success-stories" element={<SuccessStories />} />
<Route path="/market-calculator" element={<MarketCalculator />} />
<Route path="/analysis" element={<Analysis />} />
</Routes>
```
### Navigation Updates
- Main navigation in `Navbar.tsx` includes:
- Primary navigation links
- Literary Analysis link with distinct styling
- Responsive design for all screen sizes
- Home page features:
- Literary Analysis card in featured sections
- Direct link to analysis content
- Layout structure:
- MainLayout component wraps all pages
- Consistent header with navigation
- Footer with copyright and quote
### Route Integration
- Analysis page is directly accessible via `/analysis`
- Integrated into main navigation flow
- Maintains consistent layout and styling
- Proper error handling and loading states
## Key Features
### 1. Content Management
- Data is stored in TypeScript files with strong typing
- Content is organized by characters and themes
- Modular content structure for easy updates
- **New: Comprehensive literary analysis data structure with detailed novel analysis**
### 2. UI Components
- Custom components built on Shadcn/UI
- Responsive design using Tailwind CSS
- Consistent theme using custom color palette:
- Sage
- Cream
- Rose
- **New: Interactive novel selector and tabbed analysis interface**
### 3. Interactive Features
- Character quiz with result mapping
- Blog comment system
- Share functionality
- Pagination for content lists
- Market calculator
- **New: Literary analysis with themed tabs and novel selection**
### 4. Performance Considerations
- Component-based architecture for better code splitting
- Error boundaries for graceful error handling
- Loading states for better UX
- Client-side routing for smooth navigation
## Styling
The project uses a combination of:
- Tailwind CSS for utility-first styling
- Custom components from Shadcn/UI
- Custom theme variables for consistent branding
- Responsive design patterns
- **New: Scrollable content areas with consistent styling**
- **New: Themed cards and tabs for analysis content**
## Typography
- Headings: Cormorant font family
- Body: Lato font family
- Consistent text sizing using Tailwind's scale
## Component Architecture
### Layout Components
- `Layout.tsx`: Main layout wrapper
- `Navbar.tsx`: Navigation header
- `Footer.tsx`: Site footer
- `ErrorBoundary.tsx`: Error handling wrapper
### Content Components
- `BlogPost.tsx`: Blog post display
- `QuoteDisplay.tsx`: Quote formatting
- `CommentSection.tsx`: User comments
- `ShareButtons.tsx`: Social sharing
- **New: Analysis.tsx**: Literary analysis with novel selection and tabbed content
### UI Components
Extensive UI component library including:
- Buttons
- Cards
- Forms
- Modals
- Navigation menus
- Tables
- Toast notifications
- **New: Select dropdown for novel selection**
- **New: Tabs for content organization**
- **New: ScrollArea for content sections**
## Data Structure
### Blog Posts
```typescript
interface BlogPost {
id: string;
title: string;
author: string;
authorImage: string;
date: string;
content: string[];
}
```
### Quiz System
```typescript
interface QuizQuestion {
id: string;
question: string;
options: QuizOption[];
}
interface QuizResult {
character: string;
quote: string;
description: string;
book: string;
matchAdvice: string;
}
```
### Literary Analysis
```typescript
// Novel Analysis Structure
interface NovelAnalysis {
title: string;
publicationYear: number;
mainThemes: ThematicElement[];
characterAnalysis: CharacterAnalysis[];
socialCommentary: SocialCommentary[];
literaryDevices: LiteraryDevice[];
}
// Theme Analysis
interface ThematicElement {
theme: string;
description: string;
examples: {
quote: string;
source: string;
analysis: string;
}[];
significance: string;
}
// Available Novels
const novelAnalyses = {
prideAndPrejudice: NovelAnalysis;
northangerAbbey: NovelAnalysis;
senseAndSensibility: NovelAnalysis;
mansfieldPark: NovelAnalysis;
}
```
## Pages and Components
### Analysis Page
- Path: `/analysis`
- Features:
- Novel selector dropdown
- Tabbed interface for different analysis aspects
- Scrollable content areas
- Themed styling
- Content Sections:
- Themes
- Characters
- Social Commentary
- Literary Devices
### Data Organization
- `src/data/literary-analysis.ts`: Contains structured analysis data for all novels
- Pride and Prejudice
- Northanger Abbey
- Sense and Sensibility
- Mansfield Park
- Each novel includes:
- Main themes with examples and significance
- Character analysis with development and key quotes
- Social commentary with modern relevance
- Literary devices with examples and effects
## Best Practices
1. TypeScript for type safety
2. Component-based architecture
3. Consistent file naming
4. Modular CSS with Tailwind
5. Error handling with boundaries
6. Loading state management
7. Responsive design patterns
8. **New: Structured content organization**
9. **New: Interactive content navigation**
## Future Considerations
1. Content expansion opportunities
2. Performance optimization
3. Accessibility improvements
4. SEO optimization
5. Content management system integration
6. **New: Additional novel analysis features**
7. **New: Comparative analysis tools**

BIN
public/images/vendors/barton.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
public/images/vendors/mansfield.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View file

@ -6,6 +6,7 @@ import Blogs from './pages/Blogs';
import BlogPost from './pages/BlogPost/BlogPost';
import { ErrorBoundary } from './components/ErrorBoundary';
import SuccessStories from './pages/SuccessStories';
import Analysis from './pages/Analysis';
// Lazy load other pages
const Quiz = React.lazy(() => import('./pages/Quiz'));
@ -27,7 +28,8 @@ function App() {
<Route path="/advice" element={<Advice />} />
<Route path="/vendors" element={<Vendors />} />
<Route path="/success-stories" element={<SuccessStories />} />
<Route path="/calculator" element={<MarketCalculator />} />
<Route path="/market-calculator" element={<MarketCalculator />} />
<Route path="/analysis" element={<Analysis />} />
</Routes>
</Suspense>
</ErrorBoundary>

View file

@ -1,62 +1,43 @@
import { Link } from 'react-router-dom';
import { Feather, Heart, BookOpen, Mail, Users } from 'lucide-react';
import { Button } from '@/components/ui/button';
import {
NavigationMenu,
NavigationMenuContent,
NavigationMenuItem,
NavigationMenuLink,
NavigationMenuList,
NavigationMenuTrigger,
} from '@/components/ui/navigation-menu';
import { Feather } from 'lucide-react';
const Navbar = () => {
return (
<header className="border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
<div className="container flex h-16 items-center px-4">
<Link to="/" className="flex items-center space-x-2">
<Feather className="h-6 w-6" />
<span className="font-serif text-xl">Austen's Wedding Guide</span>
</Link>
<NavigationMenu className="ml-auto">
<NavigationMenuList>
<NavigationMenuItem>
<NavigationMenuTrigger>Advice</NavigationMenuTrigger>
<NavigationMenuContent>
<div className="grid gap-3 p-4 w-[400px]">
<NavigationMenuLink asChild>
<Link to="/blogs" className="flex items-center space-x-2">
<BookOpen className="h-4 w-4" />
<span>Character Blogs</span>
</Link>
</NavigationMenuLink>
<NavigationMenuLink asChild>
<Link to="/dear-jane" className="flex items-center space-x-2">
<Mail className="h-4 w-4" />
<span>Dear Jane</span>
</Link>
</NavigationMenuLink>
</div>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem>
<Link to="/quiz">
<Button variant="secondary" size="sm">
<Users className="mr-2 h-4 w-4" />
Quiz
</Button>
</Link>
</NavigationMenuItem>
<NavigationMenuItem>
<Link to="/success-stories">
<Button variant="secondary" size="sm">
<Heart className="mr-2 h-4 w-4" />
Success Stories
</Button>
</Link>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>
<header className="border-b bg-cream-50">
<div className="container mx-auto px-4">
<div className="flex h-16 items-center justify-between">
<Link to="/" className="flex items-center space-x-2">
<Feather className="h-6 w-6 text-sage-700" />
<span className="font-cormorant text-xl text-sage-900">Austen's Wedding Guide</span>
</Link>
<nav className="flex items-center space-x-6">
<Link to="/blogs" className="text-sage-700 hover:text-sage-900 transition-colors">
Character Blogs
</Link>
<Link to="/quiz" className="text-sage-700 hover:text-sage-900 transition-colors">
Bride Quiz
</Link>
<Link to="/dear-jane" className="text-sage-700 hover:text-sage-900 transition-colors">
Dear Jane
</Link>
<Link to="/vendors" className="text-sage-700 hover:text-sage-900 transition-colors">
Vendors
</Link>
<Link to="/success-stories" className="text-sage-700 hover:text-sage-900 transition-colors">
Success Stories
</Link>
<Link to="/market-calculator" className="text-sage-700 hover:text-sage-900 transition-colors">
Market Value
</Link>
<Link
to="/analysis"
className="bg-sage-100 text-sage-700 hover:bg-sage-200 px-4 py-2 rounded-md transition-colors"
>
Literary Analysis
</Link>
</nav>
</div>
</div>
</header>
);

View file

@ -4,6 +4,7 @@ import Blogs from '@/pages/Blogs';
import DearJane from '@/pages/DearJane';
import Quiz from '@/pages/Quiz';
import SuccessStories from '@/pages/SuccessStories';
import Analysis from '@/pages/Analysis';
const Routes = () => {
return (
@ -13,8 +14,9 @@ const Routes = () => {
<Route path="/dear-jane" element={<DearJane />} />
<Route path="/quiz" element={<Quiz />} />
<Route path="/success-stories" element={<SuccessStories />} />
<Route path="/analysis" element={<Analysis />} />
</RouterRoutes>
);
}
export default Routes;
export default Routes;

View file

@ -1,28 +1,10 @@
import { Link } from 'react-router-dom';
import { Toaster } from '@/components/ui/toaster';
import Navbar from '../Navbar';
const MainLayout = ({ children }: { children: React.ReactNode }) => {
return (
<div className="min-h-screen bg-cream-50">
<nav className="bg-sage-100 border-b border-sage-200">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between h-16">
<div className="flex">
<Link to="/" className="flex items-center font-cormorant text-2xl text-sage-900">
Austen's Wedding Guide
</Link>
</div>
<div className="hidden sm:ml-6 sm:flex sm:space-x-8">
<Link to="/blogs" className="nav-link">Character Blogs</Link>
<Link to="/quiz" className="nav-link">Bride Quiz</Link>
<Link to="/advice" className="nav-link">Dear Jane</Link>
<Link to="/vendors" className="nav-link">Vendors</Link>
<Link to="/success-stories" className="nav-link">Success Stories</Link>
<Link to="/calculator" className="nav-link">Market Value</Link>
</div>
</div>
</div>
</nav>
<Navbar />
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
{children}

View file

@ -0,0 +1,368 @@
interface ThematicElement {
theme: string;
description: string;
examples: {
quote: string;
source: string;
analysis: string;
}[];
significance: string;
}
interface NovelAnalysis {
title: string;
publicationYear: number;
mainThemes: ThematicElement[];
characterAnalysis: {
character: string;
role: string;
development: string;
significance: string;
keyQuotes: {
quote: string;
context: string;
analysis: string;
}[];
}[];
socialCommentary: {
topic: string;
analysis: string;
modernRelevance: string;
examples: string[];
}[];
literaryDevices: {
device: string;
usage: string;
examples: string[];
effect: string;
}[];
}
export const prideAndPrejudiceAnalysis: NovelAnalysis = {
title: "Pride and Prejudice",
publicationYear: 1813,
mainThemes: [
{
theme: "Marriage and Economic Reality",
description: "Exploration of marriage as both a social and economic institution in Regency England",
examples: [
{
quote: "It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife.",
source: "Chapter 1",
analysis: "This iconic opening line establishes the novel's central premise: the interconnection between marriage and economics. The ironic tone suggests Austen's critique of viewing marriage purely as an economic transaction."
},
{
quote: "I am not romantic, you know. I never was. I ask only a comfortable home.",
source: "Charlotte Lucas to Elizabeth",
analysis: "Charlotte's practical view of marriage represents the economic reality many women faced, choosing financial security over romantic love."
}
],
significance: "Through this theme, Austen critiques the marriage market while acknowledging the practical constraints women faced in Regency society."
},
{
theme: "Pride and Social Prejudice",
description: "Examination of how pride and prejudice affect social relationships and personal growth",
examples: [
{
quote: "I could easily forgive his pride, if he had not mortified mine.",
source: "Elizabeth about Darcy",
analysis: "This quote encapsulates how personal pride leads to prejudice, showing how both Elizabeth and Darcy must overcome their biases."
}
],
significance: "The theme demonstrates how personal growth requires overcoming both social prejudices and individual pride."
}
],
characterAnalysis: [
{
character: "Elizabeth Bennet",
role: "Protagonist",
development: "Elizabeth's journey from confident wit to self-awareness represents the novel's central character development",
significance: "Through Elizabeth, Austen explores the balance between individual judgment and societal expectations",
keyQuotes: [
{
quote: "Till this moment I never knew myself.",
context: "After reading Darcy's letter",
analysis: "This moment marks Elizabeth's recognition of her own prejudices and marks the beginning of her character transformation."
}
]
},
{
character: "Mr. Darcy",
role: "Male Protagonist",
development: "Darcy's evolution from proud aristocrat to humble lover shows the possibility of personal growth",
significance: "His character arc demonstrates how true love requires overcoming class prejudice and personal pride",
keyQuotes: [
{
quote: "I have been a selfish being all my life, in practice, though not in principle.",
context: "Darcy's self-reflection to Elizabeth",
analysis: "This admission shows Darcy's growth and self-awareness, marking his character development."
}
]
}
],
socialCommentary: [
{
topic: "Class Mobility",
analysis: "Austen explores the rigidity and occasional permeability of class boundaries in Regency England",
modernRelevance: "The commentary on social mobility and class prejudice remains relevant to modern social inequalities",
examples: [
"The Bingley family's 'new money' status versus Darcy's established wealth",
"Elizabeth's ability to transcend class boundaries through marriage",
"Lady Catherine's attempts to maintain class distinctions"
]
}
],
literaryDevices: [
{
device: "Free Indirect Discourse",
usage: "Austen pioneered this technique to blend narrator and character perspectives",
examples: [
"The opening line's ironic tone",
"Elizabeth's internal reflections",
"Commentary on the Meryton assembly"
],
effect: "Creates intimacy with characters while maintaining narrative distance for ironic commentary"
}
]
};
export const northangerAbbeyAnalysis: NovelAnalysis = {
title: "Northanger Abbey",
publicationYear: 1818,
mainThemes: [
{
theme: "Gothic Literature Parody",
description: "A satirical take on Gothic fiction and its influence on young readers",
examples: [
{
quote: "The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.",
source: "Chapter 5",
analysis: "Austen directly addresses the value of novel reading while simultaneously parodying Gothic literature's melodramatic tendencies."
},
{
quote: "Oh! I am delighted with the book! I should like to spend my whole life in reading it.",
source: "Catherine about 'The Mysteries of Udolpho'",
analysis: "Illustrates Catherine's naive enthusiasm for Gothic novels, which Austen uses to critique uncritical consumption of literature."
}
],
significance: "Through parody, Austen critiques both Gothic conventions and the societal attitudes toward novel reading."
},
{
theme: "Reality vs. Imagination",
description: "The contrast between romantic imagination and everyday reality",
examples: [
{
quote: "She had yet to learn that the commonplace details of real life can be more affecting than the most dramatic of imagined horrors.",
source: "Narrator about Catherine",
analysis: "Shows Catherine's growth from Gothic fantasy to understanding real-world complexities."
}
],
significance: "Demonstrates how imagination must be tempered with reality and experience."
}
],
characterAnalysis: [
{
character: "Catherine Morland",
role: "Protagonist",
development: "Catherine's journey from naive Gothic romance enthusiast to mature observer of real human nature",
significance: "Represents the necessary maturation from adolescent fantasy to adult understanding",
keyQuotes: [
{
quote: "No one who had ever seen Catherine Morland in her infancy would have supposed her born to be an heroine.",
context: "Opening line",
analysis: "Sets up the novel's playful subversion of Gothic and romantic conventions."
}
]
}
],
socialCommentary: [
{
topic: "Novel Reading and Education",
analysis: "Austen examines the role of reading in young women's education and moral development",
modernRelevance: "Parallels contemporary debates about media influence on young minds",
examples: [
"Catherine's Gothic-influenced imagination",
"The defense of novel reading",
"The contrast between sensational fiction and reality"
]
}
],
literaryDevices: [
{
device: "Narrative Irony",
usage: "Austen uses ironic narration to comment on Gothic conventions and social expectations",
examples: [
"The opening description of Catherine as an unlikely heroine",
"Commentary on Catherine's Gothic fantasies",
"The narrator's knowing asides about romance conventions"
],
effect: "Creates a meta-commentary on literary conventions while telling an engaging story"
}
]
};
export const senseAndSensibilityAnalysis: NovelAnalysis = {
title: "Sense and Sensibility",
publicationYear: 1811,
mainThemes: [
{
theme: "Reason vs. Emotion",
description: "The balance between emotional expression and rational judgment",
examples: [
{
quote: "I will be calm. I will be mistress of myself.",
source: "Elinor Dashwood",
analysis: "Represents the struggle between emotional truth and social necessity."
},
{
quote: "The more I know of the world, the more I am convinced that I shall never see a man whom I can really love.",
source: "Marianne Dashwood",
analysis: "Illustrates the dangers of excessive romantic sensibility."
}
],
significance: "Explores the necessity of balancing emotional authenticity with social pragmatism."
},
{
theme: "Financial Vulnerability",
description: "The economic precarity of women in Regency society",
examples: [
{
quote: "What have wealth or grandeur to do with happiness?",
source: "Marianne Dashwood",
analysis: "Highlights the tension between romantic ideals and economic reality."
}
],
significance: "Demonstrates how economic circumstances shape women's choices and opportunities."
}
],
characterAnalysis: [
{
character: "Elinor Dashwood",
role: "Protagonist - Sense",
development: "Maintains emotional control while navigating social and personal challenges",
significance: "Represents the value of emotional regulation and social awareness",
keyQuotes: [
{
quote: "I have suffered all the punishment of an attachment without enjoying any of its advantages.",
context: "Reflecting on Edward",
analysis: "Shows the cost of emotional restraint while highlighting its necessity."
}
]
},
{
character: "Marianne Dashwood",
role: "Protagonist - Sensibility",
development: "Learns to temper excessive emotion with judgment",
significance: "Shows the maturation from pure emotional response to balanced understanding",
keyQuotes: [
{
quote: "My feelings shall be governed and my temper improved.",
context: "After her illness",
analysis: "Marks her growth toward emotional maturity."
}
]
}
],
socialCommentary: [
{
topic: "Women's Economic Dependence",
analysis: "Examines how financial constraints affect women's choices and behavior",
modernRelevance: "Relates to contemporary issues of economic inequality and gender",
examples: [
"The Dashwood women's reduced circumstances",
"Lucy Steele's strategic marriage choices",
"The power dynamics in courtship and marriage"
]
}
],
literaryDevices: [
{
device: "Parallel Characters",
usage: "Uses contrasting character pairs to explore different approaches to life",
examples: [
"Elinor and Marianne's different temperaments",
"Edward and Willoughby's different moral characters",
"Lucy and Elinor's different approaches to love"
],
effect: "Creates a nuanced exploration of different philosophical approaches to life"
}
]
};
export const mansfieldParkAnalysis: NovelAnalysis = {
title: "Mansfield Park",
publicationYear: 1814,
mainThemes: [
{
theme: "Morality and Social Values",
description: "The relationship between moral character and social behavior",
examples: [
{
quote: "We have all a better guide in ourselves, if we would attend to it, than any other person can be.",
source: "Fanny Price",
analysis: "Emphasizes the importance of individual moral judgment over social pressure."
}
],
significance: "Explores how true morality must come from internal conviction rather than external rules."
},
{
theme: "Colonial Undertones",
description: "The presence of colonial wealth and its moral implications",
examples: [
{
quote: "But I do talk to him more than I used. I am sure I do. Did not you hear me ask him about the slave-trade last night?",
source: "Fanny about Sir Thomas",
analysis: "Highlights the novel's engagement with colonial issues and moral responsibility."
}
],
significance: "Addresses the relationship between domestic English society and colonial exploitation."
}
],
characterAnalysis: [
{
character: "Fanny Price",
role: "Protagonist",
development: "Maintains moral integrity while navigating social pressures",
significance: "Represents moral constancy in the face of social corruption",
keyQuotes: [
{
quote: "We have all a better guide in ourselves, if we would attend to it, than any other person can be.",
context: "Refusing Henry Crawford",
analysis: "Shows Fanny's commitment to internal moral guidance over external pressure."
}
]
}
],
socialCommentary: [
{
topic: "Class and Moral Character",
analysis: "Examines the relationship between social position and moral behavior",
modernRelevance: "Connects to contemporary discussions about privilege and responsibility",
examples: [
"The contrast between the Bertrams and the Crawfords",
"Fanny's position between social classes",
"The moral implications of wealth and privilege"
]
}
],
literaryDevices: [
{
device: "Moral Contrast",
usage: "Uses character contrasts to highlight moral choices",
examples: [
"Fanny's principles versus Mary's pragmatism",
"Edmund's sincerity versus Henry's performance",
"The stability of Mansfield versus the chaos of London"
],
effect: "Creates a clear moral framework while exploring its complexities"
}
]
};
// Export all analyses
export const novelAnalyses = {
prideAndPrejudice: prideAndPrejudiceAnalysis,
northangerAbbey: northangerAbbeyAnalysis,
senseAndSensibility: senseAndSensibilityAnalysis,
mansfieldPark: mansfieldParkAnalysis
};

View file

@ -108,5 +108,140 @@ export const VENDOR_LISTINGS: VendorListing[] = [
text: 'The chapel holds such special memories, and the grounds are perfect for quiet moments of reflection.'
}
]
},
{
id: '5',
name: 'Longbourn Catering Services',
description: 'Exquisite dining experiences for your special day. Our skilled staff ensures every detail is perfect, from intimate family gatherings to grand celebrations.',
category: 'catering',
location: 'Hertfordshire',
imageUrl: '/images/vendors/catering.jpg',
priceRange: '£££',
rating: {
reputation: 5,
elegance: 4,
value: 5
},
features: [
'Custom menu planning',
'Local seasonal ingredients',
'Formal dinner service',
'Wedding breakfast',
'Evening refreshments'
],
testimonials: [
{
author: 'Charlotte Lucas',
text: 'The attention to detail was remarkable. Every dish was perfectly prepared and beautifully presented.'
}
]
},
{
id: '6',
name: 'Devonshire Blooms',
description: 'Creating enchanting floral arrangements that capture the natural beauty of the English countryside. Specializing in seasonal flowers and romantic designs.',
category: 'flowers',
location: 'Devonshire',
imageUrl: '/images/vendors/flowers.jpg',
priceRange: '£££',
rating: {
reputation: 5,
elegance: 5,
value: 4
},
features: [
'Bridal bouquets',
'Church decorations',
'Reception arrangements',
'Seasonal flowers',
'Garden-inspired designs'
],
testimonials: [
{
author: 'Marianne Dashwood',
text: 'The wildflower arrangements perfectly captured the romantic spirit of our celebration.'
}
]
},
{
id: '7',
name: 'Mrs. Bennet\'s Matchmaking Services',
description: 'With years of experience in bringing together the finest matches in society, we offer discrete and personalized matchmaking services for discerning clients.',
category: 'matchmaking',
location: 'Hertfordshire',
imageUrl: '/images/vendors/matchmaking.jpg',
priceRange: '££',
rating: {
reputation: 4,
elegance: 3,
value: 5
},
features: [
'Personal introductions',
'Society connections',
'Discrete service',
'County-wide network',
'Pre-event consultations'
],
testimonials: [
{
author: 'Jane Bennet',
text: 'A most fortuitous introduction that led to the happiest of outcomes.'
}
]
},
{
id: '8',
name: 'Madame Laurent\'s Modiste',
description: 'Creating exquisite wedding attire that combines timeless elegance with the latest London fashions. Each piece is carefully crafted to ensure the perfect fit.',
category: 'modiste',
location: 'London',
imageUrl: '/images/vendors/modiste.jpg',
priceRange: '££££',
rating: {
reputation: 5,
elegance: 5,
value: 4
},
features: [
'Custom designs',
'Finest materials',
'Multiple fittings',
'Wedding party attire',
'Accessories available'
],
testimonials: [
{
author: 'Elizabeth Bennet',
text: 'My wedding dress exceeded all expectations. The attention to detail was remarkable.'
}
]
},
{
id: '9',
name: 'The Tilney Quartet',
description: 'Providing elegant musical entertainment for your celebration. From classical pieces to country dances, we ensure your celebration is filled with perfect harmony.',
category: 'music',
location: 'Bath',
imageUrl: '/images/vendors/music.jpg',
priceRange: '£££',
rating: {
reputation: 5,
elegance: 5,
value: 4
},
features: [
'String quartet',
'Piano accompaniment',
'Country dance music',
'Ceremony music',
'Evening entertainment'
],
testimonials: [
{
author: 'Catherine Morland',
text: 'The music was absolutely enchanting, perfect for both the ceremony and dancing.'
}
]
}
];

214
src/pages/Analysis.tsx Normal file
View file

@ -0,0 +1,214 @@
import { useState } from 'react';
import { novelAnalyses } from '../data/literary-analysis';
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "../components/ui/tabs";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "../components/ui/card";
import { ScrollArea } from "../components/ui/scroll-area";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "../components/ui/select";
const Analysis = () => {
const [selectedNovel, setSelectedNovel] = useState('prideAndPrejudice');
const analysis = novelAnalyses[selectedNovel];
if (!analysis) {
return (
<div className="container mx-auto py-8">
<p className="text-sage-700">Loading analysis...</p>
</div>
);
}
return (
<div className="container mx-auto py-8 space-y-8">
<div className="text-center space-y-4">
<h1 className="font-cormorant text-4xl text-sage-900">
Literary Analysis
</h1>
<div className="max-w-xs mx-auto">
<Select
value={selectedNovel}
onValueChange={setSelectedNovel}
>
<SelectTrigger className="w-full">
<SelectValue placeholder="Select a novel" />
</SelectTrigger>
<SelectContent>
<SelectItem value="prideAndPrejudice">Pride and Prejudice (1813)</SelectItem>
<SelectItem value="senseAndSensibility">Sense and Sensibility (1811)</SelectItem>
<SelectItem value="northangerAbbey">Northanger Abbey (1818)</SelectItem>
<SelectItem value="mansfieldPark">Mansfield Park (1814)</SelectItem>
</SelectContent>
</Select>
</div>
<div className="mt-4">
<h2 className="font-cormorant text-2xl text-sage-900">{analysis.title}</h2>
<p className="text-sage-600">
Published {analysis.publicationYear} - A Deep Dive into Themes, Characters, and Social Commentary
</p>
</div>
</div>
<Tabs defaultValue="themes" className="w-full">
<TabsList className="grid w-full grid-cols-4">
<TabsTrigger value="themes">Themes</TabsTrigger>
<TabsTrigger value="characters">Characters</TabsTrigger>
<TabsTrigger value="social">Social Commentary</TabsTrigger>
<TabsTrigger value="literary">Literary Devices</TabsTrigger>
</TabsList>
<TabsContent value="themes" className="space-y-4">
{analysis.mainThemes.map((theme, index) => (
<Card key={index}>
<CardHeader>
<CardTitle>{theme.theme}</CardTitle>
<CardDescription>{theme.description}</CardDescription>
</CardHeader>
<CardContent>
<ScrollArea className="h-[300px] rounded-md border p-4">
<div className="space-y-4">
{theme.examples.map((example, i) => (
<div key={i} className="space-y-2">
<blockquote className="border-l-2 border-sage-300 pl-4 italic">
"{example.quote}"
<footer className="text-sm text-sage-600">
- {example.source}
</footer>
</blockquote>
<p className="text-sage-700">{example.analysis}</p>
</div>
))}
<div className="mt-4 pt-4 border-t">
<h4 className="font-semibold text-sage-900">Significance</h4>
<p className="text-sage-700">{theme.significance}</p>
</div>
</div>
</ScrollArea>
</CardContent>
</Card>
))}
</TabsContent>
<TabsContent value="characters" className="space-y-4">
{analysis.characterAnalysis.map((character, index) => (
<Card key={index}>
<CardHeader>
<CardTitle>{character.character}</CardTitle>
<CardDescription>{character.role}</CardDescription>
</CardHeader>
<CardContent>
<ScrollArea className="h-[300px] rounded-md border p-4">
<div className="space-y-4">
<div>
<h4 className="font-semibold text-sage-900">Character Development</h4>
<p className="text-sage-700">{character.development}</p>
</div>
<div>
<h4 className="font-semibold text-sage-900">Significance</h4>
<p className="text-sage-700">{character.significance}</p>
</div>
<div>
<h4 className="font-semibold text-sage-900">Key Quotes</h4>
{character.keyQuotes.map((quote, i) => (
<div key={i} className="mt-2 space-y-2">
<blockquote className="border-l-2 border-sage-300 pl-4 italic">
"{quote.quote}"
<footer className="text-sm text-sage-600">
Context: {quote.context}
</footer>
</blockquote>
<p className="text-sage-700">{quote.analysis}</p>
</div>
))}
</div>
</div>
</ScrollArea>
</CardContent>
</Card>
))}
</TabsContent>
<TabsContent value="social" className="space-y-4">
{analysis.socialCommentary.map((topic, index) => (
<Card key={index}>
<CardHeader>
<CardTitle>{topic.topic}</CardTitle>
</CardHeader>
<CardContent>
<ScrollArea className="h-[300px] rounded-md border p-4">
<div className="space-y-4">
<div>
<h4 className="font-semibold text-sage-900">Analysis</h4>
<p className="text-sage-700">{topic.analysis}</p>
</div>
<div>
<h4 className="font-semibold text-sage-900">Modern Relevance</h4>
<p className="text-sage-700">{topic.modernRelevance}</p>
</div>
<div>
<h4 className="font-semibold text-sage-900">Examples</h4>
<ul className="list-disc list-inside text-sage-700">
{topic.examples.map((example, i) => (
<li key={i}>{example}</li>
))}
</ul>
</div>
</div>
</ScrollArea>
</CardContent>
</Card>
))}
</TabsContent>
<TabsContent value="literary" className="space-y-4">
{analysis.literaryDevices.map((device, index) => (
<Card key={index}>
<CardHeader>
<CardTitle>{device.device}</CardTitle>
</CardHeader>
<CardContent>
<ScrollArea className="h-[300px] rounded-md border p-4">
<div className="space-y-4">
<div>
<h4 className="font-semibold text-sage-900">Usage</h4>
<p className="text-sage-700">{device.usage}</p>
</div>
<div>
<h4 className="font-semibold text-sage-900">Examples</h4>
<ul className="list-disc list-inside text-sage-700">
{device.examples.map((example, i) => (
<li key={i}>{example}</li>
))}
</ul>
</div>
<div>
<h4 className="font-semibold text-sage-900">Effect</h4>
<p className="text-sage-700">{device.effect}</p>
</div>
</div>
</ScrollArea>
</CardContent>
</Card>
))}
</TabsContent>
</Tabs>
</div>
);
};
export default Analysis;

View file

@ -15,6 +15,16 @@ const Home = () => {
{/* Featured Sections */}
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
{/* Literary Analysis */}
<Link to="/analysis" className="feature-card">
<div className="bg-sage-50 p-6 rounded-lg hover:shadow-lg transition">
<h2 className="font-cormorant text-2xl text-sage-900 mb-3">Literary Analysis</h2>
<p className="text-sage-700">
Explore themes, characters, and social commentary in Austen's timeless works
</p>
</div>
</Link>
{/* Character Blogs */}
<Link to="/blogs" className="feature-card">
<div className="bg-sage-50 p-6 rounded-lg hover:shadow-lg transition">
@ -64,17 +74,6 @@ const Home = () => {
</p>
</div>
</Link>
{/* Featured Article */}
<div className="bg-cream-50 p-6 rounded-lg">
<h2 className="font-cormorant text-2xl text-sage-900 mb-3">Latest from Charlotte</h2>
<p className="text-sage-700 mb-4">
"The Art of Practical Partnership: A Guide to Sensible Matches"
</p>
<Link to="/blogs/charlotte" className="text-sage-500 hover:text-sage-600">
Read More
</Link>
</div>
</div>
{/* Quote Section */}

View file

@ -4,30 +4,49 @@ interface MarketValue {
income: number;
estate: string;
connections: string;
location: string;
accomplishments: string[];
personality: string[];
}
const ACCOMPLISHMENTS = [
'Playing the pianoforte',
'Playing the harp',
'Drawing landscapes',
'Speaking French',
'Embroidery',
'Reading extensively',
'Reading Gothic novels',
'Dancing gracefully',
'Writing poetry',
'Maintaining witty correspondence'
'Singing',
'Writing letters',
'Moral improvement',
'Walking great distances'
];
const PERSONALITY_TRAITS = [
'Wit and vivacity',
'Serene temperament',
'Excellent manners',
'Strong principles',
'Proper reserve',
'Charming conversation',
'Filial devotion',
'Prudent judgment',
'Musical taste'
'Romantic sensibility',
'Quiet dignity',
'Natural elegance',
'Quick understanding'
];
const LOCATIONS = [
'Derbyshire',
'Devonshire',
'Bath',
'Northamptonshire',
'Hertfordshire',
'London',
'Kent'
];
const MarketCalculator = () => {
@ -35,6 +54,7 @@ const MarketCalculator = () => {
income: 0,
estate: '',
connections: '',
location: '',
accomplishments: [],
personality: []
});
@ -49,14 +69,28 @@ const MarketCalculator = () => {
// Estate value
if (values.estate.toLowerCase().includes('pemberley')) score += 50;
if (values.estate.toLowerCase().includes('mansfield')) score += 45;
if (values.estate.toLowerCase().includes('northanger')) score += 40;
if (values.estate.toLowerCase().includes('estate')) score += 20;
if (values.estate.toLowerCase().includes('manor')) score += 15;
if (values.estate.toLowerCase().includes('parsonage')) score += 10;
if (values.estate.toLowerCase().includes('cottage')) score += 5;
// Location value
if (values.location === 'Derbyshire') score += 20;
if (values.location === 'London') score += 15;
if (values.location === 'Bath') score += 12;
if (values.location === 'Northamptonshire') score += 15;
if (values.location === 'Devonshire') score += 10;
if (values.location === 'Hertfordshire') score += 8;
if (values.location === 'Kent') score += 10;
// Social connections
if (values.connections.toLowerCase().includes('nobility')) score += 25;
if (values.connections.toLowerCase().includes('london')) score += 15;
if (values.connections.toLowerCase().includes('bath')) score += 10;
if (values.connections.toLowerCase().includes('admiral')) score += 12;
if (values.connections.toLowerCase().includes('clergy')) score += 8;
if (values.connections.toLowerCase().includes('military')) score += 10;
// Accomplishments
score += values.accomplishments.length * 8;
@ -64,18 +98,18 @@ const MarketCalculator = () => {
// Personality traits
score += values.personality.length * 6;
// Calculate result
// Calculate result with references to the four novels
let result = '';
if (score >= 100) {
result = "Most Eligible! You rival Mr. Darcy in desirability. Mrs. Bennet would faint from joy at the prospect of your acquaintance.";
result = "Most Eligible! Your prospects rival Mr. Darcy's, and even Lady Catherine de Bourgh would struggle to find fault with your situation.";
} else if (score >= 75) {
result = "Highly Suitable! Like Mr. Bingley, you present an excellent prospect for any family's eldest daughter.";
result = "Highly Suitable! Like Colonel Brandon, you possess both the means and character to make an excellent match.";
} else if (score >= 50) {
result = "Quite Promising! Colonel Brandon would consider you a worthy competitor in the marriage market.";
result = "Quite Promising! You stand with Edmund Bertram - respectable, principled, and possessed of good connections.";
} else if (score >= 25) {
result = "Moderately Advantageous! You stand somewhere between a country parson and a militia officer in eligibility.";
result = "Moderately Advantageous! Like Henry Tilney, your situation is comfortable though not grand, with room for improvement.";
} else {
result = "Rather Modest! Perhaps consider a position as a governess or companion while improving your prospects?";
result = "Rather Modest! You might find yourself in Fanny Price's position - dependent on the goodwill of others, but possessed of true worth.";
}
setResult(result);
@ -122,6 +156,25 @@ const MarketCalculator = () => {
/>
</div>
{/* Location Selection */}
<div className="space-y-2">
<label className="block text-sage-900 font-semibold">
Primary Location
</label>
<select
value={values.location}
onChange={(e) => setValues({ ...values, location: e.target.value })}
className="w-full p-3 rounded-lg border-sage-200 focus:ring-sage-500 focus:border-sage-500"
>
<option value="">Select a location</option>
{LOCATIONS.map((location) => (
<option key={location} value={location}>
{location}
</option>
))}
</select>
</div>
{/* Connections Input */}
<div className="space-y-2">
<label className="block text-sage-900 font-semibold">
@ -132,7 +185,7 @@ const MarketCalculator = () => {
value={values.connections}
onChange={(e) => setValues({ ...values, connections: e.target.value })}
className="w-full p-3 rounded-lg border-sage-200 focus:ring-sage-500 focus:border-sage-500"
placeholder="e.g., Connected to nobility in London"
placeholder="e.g., Connected to nobility, military officers"
/>
</div>

View file

@ -5,8 +5,8 @@ export type VendorCategory =
| 'catering'
| 'music'
| 'flowers'
| 'transport'
| 'stationery';
| 'matchmaking'
| 'modiste';
export type VendorRating = {
reputation: number;