A professional recreation of longhouseplants.com built with Next.js 14, TypeScript, and Tailwind CSS. This project replicates the original nursery website with exact content, modern responsive design, and accessibility features.
This is a faithful recreation of the Long House Plants nursery website, featuring:
- Complete content match: All text, prices, opening hours, and notices exactly as specified
- Modern tech stack: Next.js 14, TypeScript, Tailwind CSS, and Recharts
- Responsive design: Mobile-first approach with desktop optimization
- Accessibility: WCAG compliant with semantic HTML and ARIA labels
- Performance optimized: Static generation, image optimization, and code splitting
- Node.js 18.0.0 or higher
- npm or yarn package manager
-
Clone or download the project
cd longhouseplants-landing-page -
Install dependencies
npm install
-
Start development server
npm run dev
-
Open in browser
http://localhost:3000
| Command | Description |
|---|---|
npm run dev |
Start development server on port 3000 |
npm run build |
Build production version |
npm run start |
Start production server |
npm run lint |
Run ESLint code linting |
npm run type-check |
Run TypeScript type checking |
npm run check-content |
Verify exact content phrases |
longhouseplants-landing-page/
βββ components/ # Reusable React components
β βββ Navbar.tsx # Main navigation
β βββ Footer.tsx # Site footer with contact info
β βββ PlantCard.tsx # Individual plant display
β βββ RainfallChart.tsx # Interactive rainfall chart
β βββ EventList.tsx # Open garden events
β βββ AccessibilityBanner.tsx # Assistance dogs notice
β βββ UlezNotice.tsx # ULEZ information component
βββ pages/ # Next.js pages (file-based routing)
β βββ _app.tsx # App wrapper with layout
β βββ index.tsx # Home page
β βββ about.tsx # About Us page
β βββ catalogue.tsx # Plant catalogue with pagination
β βββ rainfall.tsx # Rainfall data and charts
β βββ events.tsx # Open Gardens / Events
β βββ ulez.tsx # ULEZ information
β βββ newsletter.tsx # Newsletter 2025
β βββ club.tsx # Club page
β βββ publicity.tsx # Media coverage
β βββ contact.tsx # Contact form and details
βββ data/ # JSON data files
β βββ catalogue.json # 30 sample plants with exact pricing
β βββ rainfall.json # Annual rainfall 2006-2024
β βββ events.json # 2025 open garden events
βββ styles/ # Global CSS and Tailwind
β βββ globals.css # Base styles and components
βββ scripts/ # Utility scripts
β βββ check-content.js # Content verification script
βββ public/ # Static assets
The project includes a content linting script that verifies all exact phrases are present:
npm run check-contentThis script checks for:
- β Hero tagline: "Plants for sun, plants for shade..."
- β Exact notices: "We do not offer a mail order service"
- β ULEZ text: Complete exact wording
- β Rainfall data: "719.18 mm / 28.3 in" precision
- β Contact details: Phone, email, What3words
- β Opening hours: Exact format and times
- β Sample plants: Abelia prices and descriptions
- Responsive Navigation: Mobile hamburger menu, desktop horizontal nav
- PlantCard: Displays genus, species, cultivar, price, tags, and descriptions
- RainfallChart: Interactive chart using Recharts with 19-year average line
- EventList: 2025 calendar with charity information
- AccessibilityBanner: Prominent assistance dogs notice
- Tailwind CSS: Utility-first styling with custom design system
- Color Palette: Green primary, earth tones, accessibility-compliant contrast
- Typography: System fonts with semantic heading hierarchy
- Cards: Consistent card design with shadows and borders
- Semantic HTML: Proper heading structure, landmarks, lists
- ARIA Labels: Screen reader support for interactive elements
- Focus Management: Visible focus indicators and keyboard navigation
- Color Contrast: WCAG AA compliant color combinations
- Alt Text: Descriptive text for images and icons
Schema for 1,270+ plants (30 sample records included):
{
"id": "string",
"genus": "string",
"species": "string",
"cultivar": "string?",
"category": "shrub|perennial|tree|bulb|climber",
"price": "number",
"difficultSpots": ["string[]"],
"description": "string",
"tags": ["string[]"]
}Annual records 2006-2024 with mm and inches:
{
"year": "number",
"rainfall_mm": "number",
"rainfall_inches": "number"
}2025 open garden calendar:
{
"id": "string",
"date": "string",
"title": "string",
"time": "string",
"description": "string",
"charity": "string?",
"pricing": { "adult": "number", "child": "number" }
}-
Connect repository
# Install Vercel CLI npm i -g vercel # Deploy vercel
-
Configure build settings (auto-detected):
- Framework: Next.js
- Build Command:
npm run build - Output Directory:
.next
-
Build settings:
- Build command:
npm run build && npm run export - Publish directory:
out
- Build command:
-
Add to
next.config.js:output: 'export', trailingSlash: true, images: { unoptimized: true }
# Build production
npm run build
# Start production server
npm run start
# Or serve statically
npm run build
npm run export
# Serve the `out` directory-
Edit
data/catalogue.json:{ "id": "31", "genus": "Planticus", "species": "newicus", "cultivar": "Amazing", "category": "perennial", "price": 12.50, "difficultSpots": ["Full sun", "Well drained soil"], "description": "A remarkable new plant...", "tags": ["Hardy", "Long flowering"] } -
Pagination automatically adjusts (12 plants per page)
- Modify page files in
pages/directory - Run content check:
npm run check-content - Update required phrases in
scripts/check-content.jsif needed
- Edit
tailwind.config.jsfor design tokens - Modify
styles/globals.cssfor component styles - Use Tailwind classes in components for layout
| Breakpoint | Width | Usage |
|---|---|---|
sm |
640px+ | Mobile landscape |
md |
768px+ | Tablet portrait |
lg |
1024px+ | Tablet landscape |
xl |
1280px+ | Desktop |
2xl |
1536px+ | Large desktop |
- β Exact content: All text matches source verbatim
- β 30 sample plants: Including Abelia varieties with correct pricing
- β Rainfall chart: 2006-2024 data with average reference line
- β 2025 events: Complete calendar with charity attribution
- β Accessibility: WCAG compliance and semantic HTML
- β Content linting: Automated verification of exact phrases
- Static Generation: Pages pre-built at compile time
- Code Splitting: Automatic route-based splitting
- Image Optimization: Next.js Image component (when images added)
- Bundle Analysis: Separate vendor and chart bundles
- Meta Tags: Title, description, and viewport for all pages
- Semantic HTML: Proper heading hierarchy and landmarks
- Structured Data: Ready for schema markup addition
- Clean URLs: Next.js file-based routing with readable paths
For questions about the original Long House Plants nursery:
- Phone: 01708 371719
- Email: tim@thelonghouse.net
- Address: Church Road, Noak Hill, Romford RM4 1LD
- What3words: remain.keys.beard
For technical questions about this recreation:
- Review the code comments and component documentation
- Check the content verification script output
- Ensure all dependencies are correctly installed
This is a recreation for educational purposes. The original content belongs to Long House Plants nursery.
Built with β€οΈ using Next.js, TypeScript, and Tailwind CSS