mirror of
https://github.com/harivansh-afk/Austens-Wedding-Guide.git
synced 2026-04-15 17:00:58 +00:00
added and improved literary analysis page
This commit is contained in:
parent
b9eb7cf738
commit
0134c81526
13 changed files with 1136 additions and 101 deletions
299
TECHNICAL_DOCUMENTATION.md
Normal file
299
TECHNICAL_DOCUMENTATION.md
Normal 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
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
BIN
public/images/vendors/mansfield.jpg
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
368
src/data/literary-analysis.ts
Normal file
368
src/data/literary-analysis.ts
Normal 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
|
||||
};
|
||||
|
|
@ -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
214
src/pages/Analysis.tsx
Normal 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;
|
||||
|
|
@ -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 */}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ export type VendorCategory =
|
|||
| 'catering'
|
||||
| 'music'
|
||||
| 'flowers'
|
||||
| 'transport'
|
||||
| 'stationery';
|
||||
| 'matchmaking'
|
||||
| 'modiste';
|
||||
|
||||
export type VendorRating = {
|
||||
reputation: number;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue