A modern, high-performance elevator company website built with Next.js 15, featuring dynamic product catalogs, Google Sheets integration, and stunning animations.
- 🎯 Features
- 🏗️ Tech Stack
- 📂 Project Structure
- ⚙️ Installation & Setup
- 🔧 Configuration
- 📝 Content Management
- 🎨 Customization Guide
- 🤖 AI Prompt for Editing
- 📊 Google Sheets Integration
- 🚀 Deployment
- 📧 Support
- 🎨 Modern UI/UX - Teal gradient theme with smooth animations
- 📱 Fully Responsive - Mobile-first design approach
- ⚡ Lightning Fast - Next.js 15 with App Router
- 🎭 Smooth Animations - Framer Motion integration
- 📊 Google Sheets Backend - No database needed
- 🔍 SEO Optimized - Dynamic metadata & structured data
- 8 Elevator Categories - Machine Room, Hydraulic, Home, Hospital, etc.
- Dynamic Product Pages - JSON-based content management
- Image Sliders - Multi-image product galleries
- Quote System - Instant quote request forms
- 7 Accessory Categories - Motors, Drives, Panels, Cabins
- Detailed Specifications - Technical details for each item
- Similar Architecture - Mirrors product system
- 4 Form Types - CTA, Contact, Product Quotes, Accessory Quotes
- Google Sheets Storage - Automatic data logging
- Real-time Validation - User-friendly error handling
Next.js 15.0 - React Framework (App Router)
React 18 - UI Library
Tailwind CSS - Utility-first CSS
Framer Motion - Animation Library
Tabler Icons React - Icon Library
Google Sheets API - Form Data Storage
googleapis - Google API Client
Next.js API Routes - Server-side API handlers
ESLint - Code Linting
PostCSS - CSS Processing
vertical/
│
├── 📁 app/ # Next.js App Router
│ ├── 📄 layout.js # Root layout with metadata
│ ├── 📄 page.js # Homepage
│ ├── 📄 globals.css # Global styles
│ │
│ ├── 📁 products/ # Products Section
│ │ ├── 📄 categories.json # ✏️ EDIT: Product categories data
│ │ ├── 📄 products.json # ✏️ EDIT: All products data
│ │ ├── 📄 page.js # Products listing page
│ │ └── 📁 [slug]/ # Dynamic product routes
│ │ ├── 📄 page.js # Product category metadata
│ │ └── 📄 productCategoryClient.js # Product category UI
│ │
│ ├── 📁 accessories/ # Accessories Section
│ │ ├── 📄 categories.json # ✏️ EDIT: Accessory categories
│ │ ├── 📄 accessories.json # ✏️ EDIT: All accessories data
│ │ ├── 📄 page.js # Accessories listing
│ │ └── 📁 [slug]/ # Dynamic accessory routes
│ │
│ ├── 📁 contact/ # Contact Page
│ │ ├── 📄 page.js # Contact metadata
│ │ └── 📄 contactClient.js # ✏️ EDIT: Contact form & info
│ │
│ ├── 📁 about/ # About Page
│ ├── 📁 careers/ # Careers Page
│ ├── 📁 privacy-policy/ # Privacy Policy
│ │
│ └── 📁 api/ # API Routes
│ └── 📁 submit-form/
│ └── 📄 route.js # ✏️ Google Sheets API handler
│
├── 📁 components/ # Reusable Components
│ ├── 📁 layout/
│ │ ├── 📄 header.js # ✏️ EDIT: Navigation & logo
│ │ ├── 📄 footer.js # ✏️ EDIT: Footer links & info
│ │ ├── 📄 bgLayout.js # Background wrapper (teal theme)
│ │ └── 📄 cool-header.js # Animated header
│ │
│ ├── 📁 sections/ # Homepage Sections
│ │ ├── 📄 services.js # ✏️ EDIT: Products showcase
│ │ ├── 📄 offering.js # ✏️ EDIT: Accessories showcase
│ │ ├── 📄 safety.js # ✏️ EDIT: DDA certification & safety
│ │ ├── 📄 testimonials.js # ✏️ EDIT: Customer testimonials
│ │ ├── 📄 clients.js # ✏️ EDIT: Client logos
│ │ ├── 📄 faqs.js # ✏️ EDIT: FAQ section
│ │ ├── 📄 form.js # Homepage contact form
│ │ └── 📄 floatCta.js # Floating CTA button
│ │
│ └── 📁 ui/ # UI Components
│ └── 📄 hover-expand.js # Desktop product slider
│
├── 📁 public/ # Static Assets
│ ├── 📁 home/
│ ├── 📁 images/ # ✏️ Homepage images
│ └── 📁 videos/ # ✏️ Homepage videos
│ ├── 📁 about/ # ✏️ About images
│ ├── 📁 accessories/ # ✏️ Accessories images
│ ├── 📁 products/ # ✏️ Product images
│ ├── 📁 careers/ # ✏️ Careers images
│ ├── 📁 contact/ # ✏️ Contact images
│ └── 📁 clients/ # ✏️ Client logos
│ ├── 📄 icon.png # Icon of Site
│ └── 📄 logo.png # Logo of Site
│
├── 📁 lib/ # Utilities
│ └── 📄 utils.js # Utility functions
│
├── 📄 .env # ✏️ Environment variables (Google Sheets)
├── 📄 next.config.mjs # Next.js configuration
├── 📄 tailwind.config.js # Tailwind configuration
├── 📄 package.json # Dependencies
└── 📄 README.md # This file!
| File | Purpose | What to Edit |
|---|---|---|
app/products/products.json |
Product data | Add/edit elevator models |
app/accessories/accessories.json |
Accessory data | Add/edit accessories |
components/sections/services.js |
Product showcase | Change product descriptions |
components/sections/testimonials.js |
Reviews | Add customer testimonials |
components/layout/footer.js |
Footer | Update contact info, links |
components/sections/safety.js |
Certifications | Manage certification badges |
.env |
Secrets | Google Sheets credentials |
Node.js 18+
npm or yarn
Gitgit clone <repository-url>
cd verticalnpm installCreate .env file in root directory:
# Google Sheets API Configuration
GOOGLE_SHEETS_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
GOOGLE_SHEETS_CLIENT_EMAIL="your-service-account@project-id.iam.gserviceaccount.com"
GOOGLE_SHEETS_SPREADSHEET_ID="your-spreadsheet-id-here"npm run devVisit http://localhost:3000 🎉
npm run build
npm start- Go to Google Cloud Console
- Create new project: "Vertical Elevators"
- Enable Google Sheets API and Google Drive API
- Navigate to: IAM & Admin → Service Accounts
- Click "Create Service Account"
- Name:
sheets-form-handler - Role: Editor
- Create JSON key and download
- Create new Google Sheet
- Create 4 sheets (tabs):
CTA FormContact PageProduct PageAccessories Page
- Open your Google Sheet
- Click "Share"
- Add service account email from JSON file
- Grant Editor permissions
From URL: https://docs.google.com/spreadsheets/d/SHEET_ID/edit
GOOGLE_SHEETS_PRIVATE_KEY- From JSON fileGOOGLE_SHEETS_CLIENT_EMAIL- From JSON fileGOOGLE_SHEETS_SPREADSHEET_ID- From Sheet URL
File: app/products/products.json
{
"slug": "machine-room-lifts",
"model": "VML Series",
"category": "machine-room-lifts",
"type": "Traction Elevator",
"tagline": "Traditional Reliability Meets Modern Technology",
"description": "High-speed traction elevators...",
"longDescription": "Detailed description here...",
"images": [
"/products/machine-room/image1.jpg",
"/products/machine-room/image2.jpg"
],
"specifications": {
"capacity": "630-1600 Kg",
"speed": "1.0-4.0 m/s",
"floors": "Up to 40 floors"
},
"advantages": [
"High speed and efficiency",
"Suitable for high-rise buildings"
]
}File: app/accessories/accessories.json
{
"slug": "vvvf-drive-basic",
"model": "VVVF-2000",
"category": "vvvf-drive",
"type": "Variable Voltage Variable Frequency",
"tagline": "Smooth and Energy Efficient",
"description": "Advanced VVVF drive system...",
"images": ["/services/vvvf.webp"],
"specifications": {
"power": "5.5-15 KW",
"voltage": "380V AC",
"frequency": "50/60 Hz"
},
"advantages": [
"Energy efficient operation",
"Smooth acceleration"
]
}File: components/sections/services.js
Edit the images array to modify products displayed on homepage.
File: components/sections/testimonials.js
const testimonials = [
{
name: "Customer Name",
company: "Company Name",
role: "CEO",
image: "/clients/photo.jpg",
rating: 5,
text: "Testimonial text here..."
}
];File: components/sections/clients.js
Add logos to /public/clients/ folder and update component.
Current Theme: Teal Gradient
/* Tailwind Colors Used */
Primary: #297074
Dark: #075056
Medium: #4A8E94
Light: #91C5C8
Background: #F0F4F5To Change Theme:
- Update
components/layout/bgLayout.js- Background gradients - Update button colors in all components
- Search & replace hex codes across components
File: app/layout.js
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'] })Change to any Google Font.
Files to Update:
components/layout/header.js- Main logocomponents/layout/footer.js- Footer logopublic/logo.png- Logo image file
File: components/layout/footer.js
const contactInfo = {
phone: "+91-XXXXXXXXXX",
email: "info@verticalelevators.com",
address: "Your Address Here"
};Copy and paste this prompt when asking AI to make changes:
I'm working on the Vertical Elevators Next.js website. Here's the context:
TECH STACK:
- Next.js 15 with App Router
- React 18, Tailwind CSS, Framer Motion
- Google Sheets API for form storage
- JSON-based content management
PROJECT STRUCTURE:
- Products: app/products/products.json & app/products/categories.json
- Accessories: app/accessories/accessories.json & app/accessories/categories.json
- Homepage sections: components/sections/
- Forms API: app/api/submit-form/route.js
- Layouts: components/layout/
COLOR THEME:
- Primary: #297074 (Teal)
- Dark: #075056
- Medium: #4A8E94
- Light: #91C5C8
FORMS INTEGRATION:
- All forms submit to /api/submit-form
- Data saved to Google Sheets (4 sheets: CTA Form, Contact Page, Product Page, Accessories Page)
- Environment variables in .env
TASK:
[Describe your specific task here]
Please:
1. Maintain the existing teal color theme
2. Follow the current component structure
3. Use Framer Motion for animations
4. Keep mobile responsiveness
5. Update JSON files for content changes
6. Test all changes before confirming
Add New Product:
Using the AI prompt above, add a new product called "Capsule Elevator Premium"
to the Capsule Lifts category. Model: VCE-P2000, capacity: 8-10 persons,
speed: 1.0 m/s. Add 3 advantages and specifications.
Change Color Theme:
Using the AI prompt above, change the entire website theme from teal
(#297074) to royal blue (#1E40AF). Update all gradients, buttons, and
hover effects across all components.
Add Testimonial:
Using the AI prompt above, add a new testimonial from "John Smith, CEO of
BuildRight Construction" with 5 stars saying "Best elevator service in Delhi!"
Each sheet contains these columns:
| Timestamp | Name | Phone | Product/Accessory Name | Message |
|---|
| Timestamp | Name | Phone | Subject | Message |
|---|
| Timestamp | Name | Phone | Service | Message |
|---|
User fills form → Frontend validates → POST /api/submit-form
→ Google Sheets API → Data saved to appropriate sheet
→ Success response → Thank you modal
Issue: Forms not submitting
# Check API route
cat app/api/submit-form/route.js
# Verify environment variables
echo $GOOGLE_SHEETS_CLIENT_EMAIL
# Check Google Sheets sharing permissions
# Service account must have Editor accessIssue: Wrong sheet name
- Update
SHEET_NAMESinapp/api/submit-form/route.js - Ensure sheet names match exactly (case-sensitive)
# Install Vercel CLI
npm i -g vercel
# Login
vercel login
# Deploy
vercel --prodEnvironment Variables:
Add all .env variables in Vercel dashboard:
- Project Settings → Environment Variables
- Add:
GOOGLE_SHEETS_PRIVATE_KEY,GOOGLE_SHEETS_CLIENT_EMAIL,GOOGLE_SHEETS_SPREADSHEET_ID
npm run build
# Deploy 'out' folder# Build
npm run build
# Start with PM2
pm2 start npm --name "vertical" -- startQ: Forms not working?
- Check Google Sheets API credentials
- Verify service account has Editor access
- Check
.envvariables are set
Q: Images not loading?
- Ensure images are in
/public/folder - Use correct path:
/folder/image.webp - Check file extensions match code
Q: Build errors?
- Delete
.nextfolder and rebuild - Update dependencies:
npm update - Check Node.js version (18+)
Q: Styling issues?
- Run
npm run buildto check for errors - Verify Tailwind classes are correct
- Check
tailwind.config.jsconfiguration
Start developing with:
npm run devNeed help? Don't hesitate to reach out!
Created with ❤️ by Kaizen
Building digital experiences that elevate your business