# QuickPoll Next.js 15 Demo Project

A complete, step-by-step Next.js 15 polling application built for live-coding classroom demonstrations. Includes git tags at each development step for easy navigation during teaching.

## 📦 What's Included

### Zip Files (Individual Steps)
- `stap-0.zip` - Project setup + types + data
- `stap-1.zip` - Layout & Navigation
- `stap-2.zip` - Homepage with poll cards
- `stap-3.zip` - API routes (GET, POST)
- `stap-4.zip` - Vote API + demo form ⭐
- `stap-5.zip` - Poll detail page
- `stap-6.zip` - VoteForm component
- `stap-7.zip` - Error handling & loading states
- `stap-8.zip` - Middleware
- `bonus.zip` - Create poll page

### Complete Project
- `quickpoll-demo-complete.zip` - Full project with complete git history

### Documentation
- `QUICK-START.md` - Instructions for Tim (start here!)
- `TEACHER-GUIDE.md` - Comprehensive teaching guide
- `PROJECT-SUMMARY.md` - Technical overview
- `README.md` - This file

## 🚀 Getting Started

### Step 1: Extract & Setup
```bash
unzip quickpoll-demo-complete.zip
cd quickpoll-demo
npm install
npm run dev
```

### Step 2: Navigate to App
Open http://localhost:3000 in your browser

### Step 3: Jump Between Steps (During Teaching)
```bash
# View all available steps
git tag -l

# Jump to any step
git checkout stap-3

# See what changed in this step
git diff stap-2 stap-3

# Go to final version
git checkout bonus
```

## ✨ Key Features

- **9 Development Steps** - Logical progression from setup to full app
- **API Routes** - Backend routes in `/app/api`
- **Dynamic Routing** - `/poll/[id]` for individual poll pages
- **Real-Time Voting** - Vote and see results update instantly
- **Server Components** - Default Next.js 15 pattern
- **Client Components** - Interactive VoteForm with state
- **Error Handling** - Loading skeletons, error boundaries, 404 pages
- **TypeScript** - Fully typed throughout
- **Tailwind CSS** - Purple-themed responsive design
- **Middleware** - Request logging and timing
- **Demo Form** - Testing interface for API endpoints (stap-4)

## 📚 Documentation

### For Teachers
Start with **QUICK-START.md** - has everything you need before class

### For Understanding the Project
Read **PROJECT-SUMMARY.md** - complete technical overview

### For Teaching Details
See **TEACHER-GUIDE.md** - tips, key concepts, troubleshooting

## 🎯 Typical Class Flow

| Step | Duration | Focus |
|------|----------|-------|
| stap-0 to stap-2 | 15 min | File structure, homepage, cards |
| stap-3 | 10 min | API routes concept |
| stap-4 | 15 min | ⭐ Vote API demo (show DevTools!) |
| stap-5 to stap-6 | 15 min | Dynamic pages, voting interface |
| stap-7 to stap-8 | 10 min | Error handling, middleware |
| bonus | 10 min | Form handling, creating polls |

**Total: ~75 minutes for complete lesson**

## 💡 Key Teaching Moments

### stap-4: The Demo Form
This is your star moment! Show:
1. Demo form at http://localhost:3000/demo
2. Open DevTools Console - show logging
3. Switch to Network tab - show POST request
4. Click "Stem" and watch the request happen
5. Show the JSON response with updated votes

### stap-6: VoteForm Component
Explain:
- Why "use client" is needed (state management)
- How useState tracks selected option
- How fetch() sends vote to API
- How component updates when response comes back

### All Steps
Keep showing the running app - live feedback is key!

## 📋 What's in Each Step

### stap-0: Project Setup
- Create Next.js with TypeScript + Tailwind
- Define Poll interfaces
- Create mock data (3 sample polls)
- Set up folder structure

### stap-1: Layout & Navigation
- Add navbar with branding
- Set up global layout
- Add metadata

### stap-2: Homepage
- Display all polls as cards
- Show poll stats (option count, vote count)
- Add links to individual polls

### stap-3: API Routes
- `GET /api/polls` - fetch all polls
- `GET /api/polls/[id]` - fetch single poll
- `POST /api/polls` - create new poll

### stap-4: Vote API + Demo
- `POST /api/polls/[id]/vote` - record a vote
- Demo form at `/demo` for testing

### stap-5: Poll Detail Page
- Dynamic route `/poll/[id]`
- Dynamic metadata for SEO
- Show poll questions and options

### stap-6: VoteForm Component
- Client component with voting logic
- Real-time results with percentage bars
- Purple gradient progress bars

### stap-7: Error Handling
- Loading skeleton (Suspense)
- Error boundary component
- 404 pages

### stap-8: Middleware
- Request logging
- Timing middleware
- Route matching

### bonus: Create Poll
- Form to create new polls
- Dynamic option inputs
- Form validation
- Navigation after creation

## 🛠 Technology Stack

- **Next.js 15** - React framework
- **TypeScript** - Type-safe JavaScript
- **Tailwind CSS** - Utility-first CSS
- **React Hooks** - useState for interactivity
- **Fetch API** - For API calls
- **Git** - Version control with tags

## 🎨 Design System

**Purple Theme:**
- Primary: `#7c3aed` (purple-500)
- Hover: `#a855f7` (purple-600)
- Active: `#9333ea` (purple-700)

**Neutral:**
- Light backgrounds: Gray-50
- Text: Gray-900
- Borders: Gray-200
- Errors: Red-600

## ✅ Build & Deployment

### Verify Build
```bash
npm run build
```

### Deploy to Vercel
```bash
npm i -g vercel
vercel
```

One command deployment! (You need a Vercel account)

## 📌 Important Notes

### In-Memory Data
This project uses in-memory JavaScript arrays for data. In production, you'd use:
- PostgreSQL
- MongoDB
- Supabase
- Firebase

### No Authentication
This project doesn't have user accounts. Real apps would have:
- User authentication
- User-specific voting history
- Admin panels

### No Database
Each time you restart the app, votes reset. That's fine for demos!

## 🤔 Common Questions

**Q: Is this production-ready?**
A: No - it's designed for learning. Add a database for production.

**Q: Can I modify it for my class?**
A: Yes! Use it as a starting point for assignments.

**Q: How do I extend it?**
A: Add a real database (PostgreSQL with Prisma is popular), add authentication, add user accounts, etc.

**Q: Where can students learn more?**
A: https://nextjs.org/learn - official Next.js tutorial

## 📞 Support

Each zip file is independent and self-contained. You can:
1. Extract any `stap-X.zip` individually
2. Run `npm install` and `npm run dev`
3. See the app at that stage of development

The `quickpoll-demo-complete.zip` has git history, so you can:
1. `git log --oneline` - see all commits
2. `git checkout stap-3` - jump to any step
3. `git diff stap-2 stap-3` - see what changed

## 🎓 For Students

After the lesson, students can:
1. Clone the repo and explore the code
2. Modify styling with Tailwind
3. Add new features (poll deletion, editing, etc.)
4. Connect to a real database
5. Deploy to Vercel

This is a great foundation for learning full-stack web development!

## 📝 Notes

- All code in English (variable names, comments)
- UI text in Dutch (button labels, messages)
- Fully typed TypeScript throughout
- Comprehensive comments for teaching
- Clean, readable code style

## 🎉 Ready to Teach!

You have everything you need. Good luck with your live-coding demonstration!

Start with **QUICK-START.md** for immediate instructions.

---

**Version:** 1.0  
**Next.js:** 15.x  
**Node:** 18+ recommended  
**Date Created:** March 2026
