mirror of
https://github.com/harivansh-afk/Austens-Wedding-Guide.git
synced 2026-04-18 02:03:04 +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 BlogPost from './pages/BlogPost/BlogPost';
|
||||||
import { ErrorBoundary } from './components/ErrorBoundary';
|
import { ErrorBoundary } from './components/ErrorBoundary';
|
||||||
import SuccessStories from './pages/SuccessStories';
|
import SuccessStories from './pages/SuccessStories';
|
||||||
|
import Analysis from './pages/Analysis';
|
||||||
|
|
||||||
// Lazy load other pages
|
// Lazy load other pages
|
||||||
const Quiz = React.lazy(() => import('./pages/Quiz'));
|
const Quiz = React.lazy(() => import('./pages/Quiz'));
|
||||||
|
|
@ -27,7 +28,8 @@ function App() {
|
||||||
<Route path="/advice" element={<Advice />} />
|
<Route path="/advice" element={<Advice />} />
|
||||||
<Route path="/vendors" element={<Vendors />} />
|
<Route path="/vendors" element={<Vendors />} />
|
||||||
<Route path="/success-stories" element={<SuccessStories />} />
|
<Route path="/success-stories" element={<SuccessStories />} />
|
||||||
<Route path="/calculator" element={<MarketCalculator />} />
|
<Route path="/market-calculator" element={<MarketCalculator />} />
|
||||||
|
<Route path="/analysis" element={<Analysis />} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
|
|
|
||||||
|
|
@ -1,62 +1,43 @@
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { Feather, Heart, BookOpen, Mail, Users } from 'lucide-react';
|
import { Feather } from 'lucide-react';
|
||||||
import { Button } from '@/components/ui/button';
|
|
||||||
import {
|
|
||||||
NavigationMenu,
|
|
||||||
NavigationMenuContent,
|
|
||||||
NavigationMenuItem,
|
|
||||||
NavigationMenuLink,
|
|
||||||
NavigationMenuList,
|
|
||||||
NavigationMenuTrigger,
|
|
||||||
} from '@/components/ui/navigation-menu';
|
|
||||||
|
|
||||||
const Navbar = () => {
|
const Navbar = () => {
|
||||||
return (
|
return (
|
||||||
<header className="border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
<header className="border-b bg-cream-50">
|
||||||
<div className="container flex h-16 items-center px-4">
|
<div className="container mx-auto px-4">
|
||||||
<Link to="/" className="flex items-center space-x-2">
|
<div className="flex h-16 items-center justify-between">
|
||||||
<Feather className="h-6 w-6" />
|
<Link to="/" className="flex items-center space-x-2">
|
||||||
<span className="font-serif text-xl">Austen's Wedding Guide</span>
|
<Feather className="h-6 w-6 text-sage-700" />
|
||||||
</Link>
|
<span className="font-cormorant text-xl text-sage-900">Austen's Wedding Guide</span>
|
||||||
<NavigationMenu className="ml-auto">
|
</Link>
|
||||||
<NavigationMenuList>
|
|
||||||
<NavigationMenuItem>
|
<nav className="flex items-center space-x-6">
|
||||||
<NavigationMenuTrigger>Advice</NavigationMenuTrigger>
|
<Link to="/blogs" className="text-sage-700 hover:text-sage-900 transition-colors">
|
||||||
<NavigationMenuContent>
|
Character Blogs
|
||||||
<div className="grid gap-3 p-4 w-[400px]">
|
</Link>
|
||||||
<NavigationMenuLink asChild>
|
<Link to="/quiz" className="text-sage-700 hover:text-sage-900 transition-colors">
|
||||||
<Link to="/blogs" className="flex items-center space-x-2">
|
Bride Quiz
|
||||||
<BookOpen className="h-4 w-4" />
|
</Link>
|
||||||
<span>Character Blogs</span>
|
<Link to="/dear-jane" className="text-sage-700 hover:text-sage-900 transition-colors">
|
||||||
</Link>
|
Dear Jane
|
||||||
</NavigationMenuLink>
|
</Link>
|
||||||
<NavigationMenuLink asChild>
|
<Link to="/vendors" className="text-sage-700 hover:text-sage-900 transition-colors">
|
||||||
<Link to="/dear-jane" className="flex items-center space-x-2">
|
Vendors
|
||||||
<Mail className="h-4 w-4" />
|
</Link>
|
||||||
<span>Dear Jane</span>
|
<Link to="/success-stories" className="text-sage-700 hover:text-sage-900 transition-colors">
|
||||||
</Link>
|
Success Stories
|
||||||
</NavigationMenuLink>
|
</Link>
|
||||||
</div>
|
<Link to="/market-calculator" className="text-sage-700 hover:text-sage-900 transition-colors">
|
||||||
</NavigationMenuContent>
|
Market Value
|
||||||
</NavigationMenuItem>
|
</Link>
|
||||||
<NavigationMenuItem>
|
<Link
|
||||||
<Link to="/quiz">
|
to="/analysis"
|
||||||
<Button variant="secondary" size="sm">
|
className="bg-sage-100 text-sage-700 hover:bg-sage-200 px-4 py-2 rounded-md transition-colors"
|
||||||
<Users className="mr-2 h-4 w-4" />
|
>
|
||||||
Quiz
|
Literary Analysis
|
||||||
</Button>
|
</Link>
|
||||||
</Link>
|
</nav>
|
||||||
</NavigationMenuItem>
|
</div>
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import Blogs from '@/pages/Blogs';
|
||||||
import DearJane from '@/pages/DearJane';
|
import DearJane from '@/pages/DearJane';
|
||||||
import Quiz from '@/pages/Quiz';
|
import Quiz from '@/pages/Quiz';
|
||||||
import SuccessStories from '@/pages/SuccessStories';
|
import SuccessStories from '@/pages/SuccessStories';
|
||||||
|
import Analysis from '@/pages/Analysis';
|
||||||
|
|
||||||
const Routes = () => {
|
const Routes = () => {
|
||||||
return (
|
return (
|
||||||
|
|
@ -13,6 +14,7 @@ const Routes = () => {
|
||||||
<Route path="/dear-jane" element={<DearJane />} />
|
<Route path="/dear-jane" element={<DearJane />} />
|
||||||
<Route path="/quiz" element={<Quiz />} />
|
<Route path="/quiz" element={<Quiz />} />
|
||||||
<Route path="/success-stories" element={<SuccessStories />} />
|
<Route path="/success-stories" element={<SuccessStories />} />
|
||||||
|
<Route path="/analysis" element={<Analysis />} />
|
||||||
</RouterRoutes>
|
</RouterRoutes>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,10 @@
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { Toaster } from '@/components/ui/toaster';
|
import { Toaster } from '@/components/ui/toaster';
|
||||||
|
import Navbar from '../Navbar';
|
||||||
|
|
||||||
const MainLayout = ({ children }: { children: React.ReactNode }) => {
|
const MainLayout = ({ children }: { children: React.ReactNode }) => {
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-cream-50">
|
<div className="min-h-screen bg-cream-50">
|
||||||
<nav className="bg-sage-100 border-b border-sage-200">
|
<Navbar />
|
||||||
<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>
|
|
||||||
|
|
||||||
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
||||||
{children}
|
{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.'
|
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 */}
|
{/* Featured Sections */}
|
||||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
<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 */}
|
{/* Character Blogs */}
|
||||||
<Link to="/blogs" className="feature-card">
|
<Link to="/blogs" className="feature-card">
|
||||||
<div className="bg-sage-50 p-6 rounded-lg hover:shadow-lg transition">
|
<div className="bg-sage-50 p-6 rounded-lg hover:shadow-lg transition">
|
||||||
|
|
@ -64,17 +74,6 @@ const Home = () => {
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</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>
|
</div>
|
||||||
|
|
||||||
{/* Quote Section */}
|
{/* Quote Section */}
|
||||||
|
|
|
||||||
|
|
@ -4,30 +4,49 @@ interface MarketValue {
|
||||||
income: number;
|
income: number;
|
||||||
estate: string;
|
estate: string;
|
||||||
connections: string;
|
connections: string;
|
||||||
|
location: string;
|
||||||
accomplishments: string[];
|
accomplishments: string[];
|
||||||
personality: string[];
|
personality: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const ACCOMPLISHMENTS = [
|
const ACCOMPLISHMENTS = [
|
||||||
'Playing the pianoforte',
|
'Playing the pianoforte',
|
||||||
|
'Playing the harp',
|
||||||
'Drawing landscapes',
|
'Drawing landscapes',
|
||||||
'Speaking French',
|
'Speaking French',
|
||||||
'Embroidery',
|
'Embroidery',
|
||||||
'Reading extensively',
|
'Reading extensively',
|
||||||
|
'Reading Gothic novels',
|
||||||
'Dancing gracefully',
|
'Dancing gracefully',
|
||||||
'Writing poetry',
|
'Singing',
|
||||||
'Maintaining witty correspondence'
|
'Writing letters',
|
||||||
|
'Moral improvement',
|
||||||
|
'Walking great distances'
|
||||||
];
|
];
|
||||||
|
|
||||||
const PERSONALITY_TRAITS = [
|
const PERSONALITY_TRAITS = [
|
||||||
'Wit and vivacity',
|
'Wit and vivacity',
|
||||||
'Serene temperament',
|
'Serene temperament',
|
||||||
'Excellent manners',
|
'Excellent manners',
|
||||||
|
'Strong principles',
|
||||||
'Proper reserve',
|
'Proper reserve',
|
||||||
'Charming conversation',
|
'Charming conversation',
|
||||||
'Filial devotion',
|
'Filial devotion',
|
||||||
'Prudent judgment',
|
'Prudent judgment',
|
||||||
'Musical taste'
|
'Romantic sensibility',
|
||||||
|
'Quiet dignity',
|
||||||
|
'Natural elegance',
|
||||||
|
'Quick understanding'
|
||||||
|
];
|
||||||
|
|
||||||
|
const LOCATIONS = [
|
||||||
|
'Derbyshire',
|
||||||
|
'Devonshire',
|
||||||
|
'Bath',
|
||||||
|
'Northamptonshire',
|
||||||
|
'Hertfordshire',
|
||||||
|
'London',
|
||||||
|
'Kent'
|
||||||
];
|
];
|
||||||
|
|
||||||
const MarketCalculator = () => {
|
const MarketCalculator = () => {
|
||||||
|
|
@ -35,6 +54,7 @@ const MarketCalculator = () => {
|
||||||
income: 0,
|
income: 0,
|
||||||
estate: '',
|
estate: '',
|
||||||
connections: '',
|
connections: '',
|
||||||
|
location: '',
|
||||||
accomplishments: [],
|
accomplishments: [],
|
||||||
personality: []
|
personality: []
|
||||||
});
|
});
|
||||||
|
|
@ -49,14 +69,28 @@ const MarketCalculator = () => {
|
||||||
|
|
||||||
// Estate value
|
// Estate value
|
||||||
if (values.estate.toLowerCase().includes('pemberley')) score += 50;
|
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('estate')) score += 20;
|
||||||
if (values.estate.toLowerCase().includes('manor')) score += 15;
|
if (values.estate.toLowerCase().includes('manor')) score += 15;
|
||||||
|
if (values.estate.toLowerCase().includes('parsonage')) score += 10;
|
||||||
if (values.estate.toLowerCase().includes('cottage')) score += 5;
|
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
|
// Social connections
|
||||||
if (values.connections.toLowerCase().includes('nobility')) score += 25;
|
if (values.connections.toLowerCase().includes('nobility')) score += 25;
|
||||||
if (values.connections.toLowerCase().includes('london')) score += 15;
|
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
|
// Accomplishments
|
||||||
score += values.accomplishments.length * 8;
|
score += values.accomplishments.length * 8;
|
||||||
|
|
@ -64,18 +98,18 @@ const MarketCalculator = () => {
|
||||||
// Personality traits
|
// Personality traits
|
||||||
score += values.personality.length * 6;
|
score += values.personality.length * 6;
|
||||||
|
|
||||||
// Calculate result
|
// Calculate result with references to the four novels
|
||||||
let result = '';
|
let result = '';
|
||||||
if (score >= 100) {
|
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) {
|
} 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) {
|
} 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) {
|
} 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 {
|
} 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);
|
setResult(result);
|
||||||
|
|
@ -122,6 +156,25 @@ const MarketCalculator = () => {
|
||||||
/>
|
/>
|
||||||
</div>
|
</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 */}
|
{/* Connections Input */}
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<label className="block text-sage-900 font-semibold">
|
<label className="block text-sage-900 font-semibold">
|
||||||
|
|
@ -132,7 +185,7 @@ const MarketCalculator = () => {
|
||||||
value={values.connections}
|
value={values.connections}
|
||||||
onChange={(e) => setValues({ ...values, connections: e.target.value })}
|
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"
|
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>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ export type VendorCategory =
|
||||||
| 'catering'
|
| 'catering'
|
||||||
| 'music'
|
| 'music'
|
||||||
| 'flowers'
|
| 'flowers'
|
||||||
| 'transport'
|
| 'matchmaking'
|
||||||
| 'stationery';
|
| 'modiste';
|
||||||
|
|
||||||
export type VendorRating = {
|
export type VendorRating = {
|
||||||
reputation: number;
|
reputation: number;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue