Production website for sierraheavyduty.com, built with Next.js 16, TypeScript, and Tailwind CSS v4.
- Framework: Next.js 16 (App Router, Server Components)
- Language: TypeScript
- Styling: Tailwind CSS v4
- Icons: Heroicons
- Validation: Zod
- SEO: JSON-LD structured data, dynamic sitemap, robots.txt
# Install dependencies
npm install
# Start development server
npm run devOpen http://localhost:3000.
src/
├── app/
│ ├── layout.tsx # Root layout (Header + Footer + JSON-LD)
│ ├── page.tsx # Homepage
│ ├── rv-service/page.tsx # Full services page
│ ├── contact/page.tsx # Contact page with form
│ ├── not-found.tsx # 404 page
│ ├── robots.ts # robots.txt generation
│ ├── sitemap.ts # sitemap.xml generation
│ └── globals.css # Global styles
├── components/
│ ├── layout/
│ │ ├── Header.tsx # Sticky nav with services dropdown
│ │ └── Footer.tsx # Footer with contact info & hours
│ ├── ui/
│ │ ├── Button.tsx # Reusable CTA button
│ │ ├── SectionHeading.tsx
│ │ ├── ServiceCard.tsx
│ │ └── ReviewCard.tsx
│ └── sections/
│ ├── Hero.tsx
│ ├── ServicesGrid.tsx
│ ├── TrustSection.tsx
│ ├── FAQ.tsx
│ ├── CTABanner.tsx
│ └── ContactForm.tsx # Client component with Zod validation
└── lib/
├── site.ts # Business info (address, phones, hours)
├── schema.ts # JSON-LD generators (LocalBusiness, FAQ)
├── validation.ts # Zod schemas for form data
└── reviews.ts # Review data (ready for Google Places API)
| Route | Description |
|---|---|
/ |
Homepage — hero, services grid, trust signals, reviews, FAQ, CTA |
/rv-service |
Detailed service page with 8 service sections and anchor nav |
/contact |
Contact form (Zod-validated), map embed, hours, phone/email |
npx vercelnpm run build
# Output in .next/ — deploy to any static hostdocker build -t sierra-heavy-duty .
docker run -p 3000:3000 sierra-heavy-dutyEdit src/lib/site.ts to update address, phone numbers, hours, and social links.
Place a hero background image at public/images/hero-bg.jpg. The hero section uses it as a CSS background with an overlay.
Edit src/lib/reviews.ts to update placeholder reviews, or integrate with the Google Places API for live reviews.
The form currently simulates submission. Connect it to your backend API, email service (Resend, SendGrid), or form provider (Formspree, Basin).
npm run buildAll pages are statically generated for maximum performance.