Initial template: Next.js Web App starter template
This commit is contained in:
commit
46d1f10fc1
42
.gitignore
vendored
Normal file
42
.gitignore
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/versions
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
.idea
|
||||
232
ALTERNATIVES.md
Normal file
232
ALTERNATIVES.md
Normal file
@ -0,0 +1,232 @@
|
||||
# Alternative Approaches to Template Management
|
||||
|
||||
## Current Approach: Simple Copy
|
||||
|
||||
```bash
|
||||
cp -r ~/Projects/nextjs-starter ~/Projects/my-project
|
||||
cd ~/Projects/my-project
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- ✅ Simple and fast
|
||||
- ✅ No external dependencies
|
||||
- ✅ Works offline
|
||||
- ✅ Easy to understand
|
||||
|
||||
**Cons:**
|
||||
- ❌ Feels "low-tech"
|
||||
- ❌ Manual process
|
||||
- ❌ No built-in versioning
|
||||
|
||||
## Better Alternatives
|
||||
|
||||
### 1. GitHub Template + create-next-app (Recommended)
|
||||
|
||||
**Setup once:**
|
||||
```bash
|
||||
cd ~/Projects/nextjs-starter
|
||||
gh repo create nextjs-starter --public --source=. --remote=origin
|
||||
git push -u origin main
|
||||
# Enable "Template repository" in GitHub Settings
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
npx create-next-app my-project --example https://github.com/yourusername/nextjs-starter
|
||||
cd my-project
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- ✅ Official Next.js tool
|
||||
- ✅ Industry standard
|
||||
- ✅ Automatic npm install
|
||||
- ✅ Clean (no git history)
|
||||
- ✅ Shareable with team
|
||||
|
||||
**Cons:**
|
||||
- ❌ Requires GitHub
|
||||
- ❌ Requires internet
|
||||
|
||||
---
|
||||
|
||||
### 2. degit (Fast, No Git History)
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
npx degit yourusername/nextjs-starter my-project
|
||||
cd my-project
|
||||
npm install
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- ✅ Very fast
|
||||
- ✅ No git history
|
||||
- ✅ Popular in JS community
|
||||
- ✅ Works with GitHub/GitLab/Bitbucket
|
||||
|
||||
**Cons:**
|
||||
- ❌ Requires GitHub
|
||||
- ❌ Requires internet
|
||||
|
||||
---
|
||||
|
||||
### 3. npm init / create Package (Most Professional)
|
||||
|
||||
Create a package like `create-my-app`:
|
||||
|
||||
**Setup:**
|
||||
```bash
|
||||
# Create a new package
|
||||
mkdir create-my-nextjs-app
|
||||
cd create-my-nextjs-app
|
||||
npm init -y
|
||||
|
||||
# Add template files
|
||||
mkdir template
|
||||
cp -r ~/Projects/nextjs-starter/* template/
|
||||
|
||||
# Create index.js that copies template
|
||||
# Publish to npm
|
||||
npm publish
|
||||
```
|
||||
|
||||
**Usage:**
|
||||
```bash
|
||||
npm create my-nextjs-app my-project
|
||||
# or
|
||||
npx create-my-nextjs-app my-project
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- ✅ Most professional
|
||||
- ✅ Like create-react-app, create-next-app
|
||||
- ✅ Can add interactive prompts
|
||||
- ✅ Versioned via npm
|
||||
- ✅ Can be private or public
|
||||
|
||||
**Cons:**
|
||||
- ❌ More setup work
|
||||
- ❌ Requires npm registry
|
||||
- ❌ Overkill for personal use
|
||||
|
||||
---
|
||||
|
||||
### 4. Yeoman Generator (Old School but Powerful)
|
||||
|
||||
```bash
|
||||
npm install -g yo generator-generator
|
||||
yo generator
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- ✅ Very powerful
|
||||
- ✅ Interactive prompts
|
||||
- ✅ Conditional logic
|
||||
- ✅ File templating
|
||||
|
||||
**Cons:**
|
||||
- ❌ Old technology (2012)
|
||||
- ❌ Feels outdated
|
||||
- ❌ Heavy dependency
|
||||
|
||||
---
|
||||
|
||||
### 5. Plop.js (Modern Alternative to Yeoman)
|
||||
|
||||
```bash
|
||||
npm install --save-dev plop
|
||||
```
|
||||
|
||||
**Pros:**
|
||||
- ✅ Modern
|
||||
- ✅ Micro-generator
|
||||
- ✅ Good for components
|
||||
- ✅ Used by many teams
|
||||
|
||||
**Cons:**
|
||||
- ❌ More for components than full projects
|
||||
- ❌ Requires setup
|
||||
|
||||
---
|
||||
|
||||
## Recommendation
|
||||
|
||||
### For Personal Use (Current)
|
||||
**Stick with simple copy** - it works, it's fast, and you don't need complexity.
|
||||
|
||||
### For Team/Public Use
|
||||
**Use GitHub Template + create-next-app**:
|
||||
|
||||
1. Push to GitHub once
|
||||
2. Enable template repository
|
||||
3. Use: `npx create-next-app my-app --example https://github.com/you/nextjs-starter`
|
||||
|
||||
This is the **industry standard** and what most developers expect.
|
||||
|
||||
### For Professional Product
|
||||
**Create npm package** (`create-my-app`):
|
||||
- Most professional
|
||||
- Versioned
|
||||
- Can be private
|
||||
- Like create-react-app
|
||||
|
||||
---
|
||||
|
||||
## About setup.sh
|
||||
|
||||
The `setup.sh` script follows **standard bash practices**:
|
||||
|
||||
- ✅ Shebang (`#!/bin/bash`)
|
||||
- ✅ Error handling (`set -e`)
|
||||
- ✅ Input validation
|
||||
- ✅ User feedback
|
||||
- ✅ Self-deletes after use (clean)
|
||||
- ✅ Cross-platform (macOS/Linux)
|
||||
|
||||
This is similar to:
|
||||
- Ruby on Rails generators
|
||||
- Laravel artisan commands
|
||||
- Django management commands
|
||||
|
||||
**It's not "off the cuff"** - it's a standard pattern for setup scripts.
|
||||
|
||||
---
|
||||
|
||||
## Comparison to Django Cookiecutter
|
||||
|
||||
| Feature | Cookiecutter | GitHub Template | npm create |
|
||||
|---------|-------------|-----------------|------------|
|
||||
| **Templating** | Jinja2 | None | Custom |
|
||||
| **Prompts** | Yes | No | Yes (if custom) |
|
||||
| **Ecosystem** | Python | Git | JavaScript |
|
||||
| **Speed** | Medium | Fast | Fast |
|
||||
| **Complexity** | Medium | Low | High |
|
||||
| **Best For** | Python projects | Any project | JS projects |
|
||||
|
||||
---
|
||||
|
||||
## My Recommendation for You
|
||||
|
||||
**Phase 1 (Now):** Keep the simple copy approach
|
||||
- It works
|
||||
- It's fast
|
||||
- No dependencies
|
||||
- Easy to maintain
|
||||
|
||||
**Phase 2 (When sharing):** Push to GitHub as template
|
||||
- One-time setup
|
||||
- Use `create-next-app --example`
|
||||
- Industry standard
|
||||
- Easy for others
|
||||
|
||||
**Phase 3 (If building product):** Create npm package
|
||||
- Professional
|
||||
- Versioned
|
||||
- Shareable
|
||||
- Like create-react-app
|
||||
|
||||
---
|
||||
|
||||
**Bottom line:** The current approach is fine for personal use. It's not "low-tech" - it's **pragmatic**. When you need to share it, upgrade to GitHub template. 🎯
|
||||
137
COMPARISON.md
Normal file
137
COMPARISON.md
Normal file
@ -0,0 +1,137 @@
|
||||
# Django Cookiecutter vs Next.js Starter
|
||||
|
||||
## Side-by-Side Comparison
|
||||
|
||||
### Django Cookiecutter Workflow
|
||||
|
||||
```bash
|
||||
# Create new Django project
|
||||
cookiecutter ../django_starter/django_starter_cookiecutter
|
||||
|
||||
# Answer prompts...
|
||||
# Install dependencies
|
||||
# Start development
|
||||
```
|
||||
|
||||
### Next.js Starter Workflow
|
||||
|
||||
```bash
|
||||
# Create new Next.js project
|
||||
npx degit ~/Projects/nextjs-starter my-new-project
|
||||
cd my-new-project
|
||||
./setup.sh
|
||||
|
||||
# Answer prompts...
|
||||
# Dependencies auto-installed
|
||||
# Start development
|
||||
```
|
||||
|
||||
## Feature Comparison
|
||||
|
||||
| Feature | Django Cookiecutter | Next.js Starter |
|
||||
|---------|-------------------|-----------------|
|
||||
| **Speed** | ~30 seconds | ~20 seconds |
|
||||
| **Dependencies** | Python required | Node.js only |
|
||||
| **Template Updates** | Pull from cookiecutter | Pull from git |
|
||||
| **Customization** | Jinja2 templates | Direct file editing |
|
||||
| **Learning Curve** | Cookiecutter syntax | Standard git/npm |
|
||||
| **Ecosystem Fit** | Python-native | JavaScript-native |
|
||||
|
||||
## Why This Approach for Next.js?
|
||||
|
||||
### ✅ Advantages
|
||||
|
||||
1. **Native to JavaScript ecosystem**
|
||||
- No Python dependency
|
||||
- Familiar to JS developers
|
||||
- Uses standard npm/git tools
|
||||
|
||||
2. **Simpler mental model**
|
||||
- Just copy files
|
||||
- No template syntax to learn
|
||||
- Direct file editing
|
||||
|
||||
3. **Faster**
|
||||
- No template rendering
|
||||
- Parallel operations
|
||||
- Smaller footprint
|
||||
|
||||
4. **More flexible**
|
||||
- Easy to customize
|
||||
- Can use GitHub templates
|
||||
- Works with any git host
|
||||
|
||||
### 🤔 Trade-offs
|
||||
|
||||
1. **Less dynamic**
|
||||
- No conditional file generation
|
||||
- Manual search/replace for project name
|
||||
- (But setup.sh handles this)
|
||||
|
||||
2. **No validation**
|
||||
- Cookiecutter can validate inputs
|
||||
- (But less needed for simple projects)
|
||||
|
||||
## Workflow Equivalence
|
||||
|
||||
### Django: Create Project
|
||||
```bash
|
||||
cookiecutter ../django_starter/django_starter_cookiecutter
|
||||
cd my_django_project
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
python manage.py migrate
|
||||
python manage.py runserver
|
||||
```
|
||||
|
||||
### Next.js: Create Project
|
||||
```bash
|
||||
npx degit ~/Projects/nextjs-starter my-nextjs-project
|
||||
cd my-nextjs-project
|
||||
./setup.sh
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Result**: Similar experience, native to each ecosystem!
|
||||
|
||||
## When to Use Each
|
||||
|
||||
### Use Django Cookiecutter When:
|
||||
- Building Python/Django projects
|
||||
- Need complex conditional logic
|
||||
- Want validated user inputs
|
||||
- Have many project variants
|
||||
|
||||
### Use Next.js Starter When:
|
||||
- Building JavaScript/Next.js projects
|
||||
- Want simple, fast setup
|
||||
- Prefer standard tools
|
||||
- Need minimal dependencies
|
||||
|
||||
## Updating Templates
|
||||
|
||||
### Django Cookiecutter
|
||||
```bash
|
||||
cd django_starter_cookiecutter
|
||||
# Make changes
|
||||
# Regenerate projects manually
|
||||
```
|
||||
|
||||
### Next.js Starter
|
||||
```bash
|
||||
cd ~/Projects/nextjs-starter
|
||||
# Make changes
|
||||
git add -A && git commit -m "Update template"
|
||||
|
||||
# Update existing projects
|
||||
cd ~/Projects/my-project
|
||||
git remote add template ~/Projects/nextjs-starter
|
||||
git fetch template
|
||||
git merge template/main --allow-unrelated-histories
|
||||
```
|
||||
|
||||
## Conclusion
|
||||
|
||||
Both approaches are valid! The Next.js starter uses **JavaScript-native tools** (degit, npm, git) instead of Python-specific tools (cookiecutter), making it feel more natural in the JavaScript ecosystem.
|
||||
|
||||
**Same philosophy, different implementation!** 🎯
|
||||
72
QUICKSTART.md
Normal file
72
QUICKSTART.md
Normal file
@ -0,0 +1,72 @@
|
||||
# Quick Start Guide
|
||||
|
||||
## 🚀 Create a New Project (One Command)
|
||||
|
||||
```bash
|
||||
# Copy template and run setup
|
||||
cp -r ~/Projects/nextjs-starter ~/Projects/my-new-project && cd ~/Projects/my-new-project && ./setup.sh
|
||||
```
|
||||
|
||||
## 📦 What You Get
|
||||
|
||||
- ✅ Next.js 16.0.7 (latest, security patched)
|
||||
- ✅ React 19.2.1 (latest, security patched)
|
||||
- ✅ Tailwind CSS v4 (latest)
|
||||
- ✅ TypeScript configured
|
||||
- ✅ shadcn/ui ready
|
||||
- ✅ ESLint configured
|
||||
- ✅ 0 vulnerabilities
|
||||
|
||||
## 🎨 Add UI Components
|
||||
|
||||
```bash
|
||||
# Add shadcn/ui components
|
||||
npx shadcn@latest add button
|
||||
npx shadcn@latest add card
|
||||
npx shadcn@latest add dialog
|
||||
npx shadcn@latest add input
|
||||
```
|
||||
|
||||
## 🔧 Common Commands
|
||||
|
||||
```bash
|
||||
npm run dev # Start dev server (http://localhost:3000)
|
||||
npm run build # Build for production
|
||||
npm start # Start production server
|
||||
npm run lint # Run ESLint
|
||||
```
|
||||
|
||||
## 📁 Project Structure
|
||||
|
||||
```
|
||||
my-new-project/
|
||||
├── src/
|
||||
│ ├── app/ # Pages and routes
|
||||
│ ├── components/ui/ # shadcn/ui components
|
||||
│ └── lib/ # Utilities
|
||||
├── package.json
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 🎯 Next Steps
|
||||
|
||||
1. **Customize metadata**: Edit `src/app/layout.tsx`
|
||||
2. **Change theme**: Edit `src/app/globals.css`
|
||||
3. **Add pages**: Create files in `src/app/`
|
||||
4. **Add components**: Use shadcn/ui or create your own
|
||||
|
||||
## 💡 Tips
|
||||
|
||||
- Use `cn()` utility for conditional classes
|
||||
- Environment variables: Create `.env.local`
|
||||
- Deploy to Vercel: `npx vercel`
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- [Full Usage Guide](./USAGE.md)
|
||||
- [Next.js Docs](https://nextjs.org/docs)
|
||||
- [shadcn/ui Docs](https://ui.shadcn.com)
|
||||
|
||||
---
|
||||
|
||||
**That's it! You're ready to build. 🎉**
|
||||
149
README.md
Normal file
149
README.md
Normal file
@ -0,0 +1,149 @@
|
||||
# Next.js Starter Template
|
||||
|
||||
A production-ready Next.js starter template with modern tooling and best practices.
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
```bash
|
||||
# Create new project
|
||||
cp -r ~/Projects/nextjs-starter ~/Projects/my-new-project
|
||||
cd ~/Projects/my-new-project
|
||||
./setup.sh
|
||||
|
||||
# Start developing
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**That's it!** Open [http://localhost:3000](http://localhost:3000) 🎉
|
||||
|
||||
## 📦 What's Included
|
||||
|
||||
- ⚡️ **Next.js 16.0.7** - Latest with Turbopack & security patches
|
||||
- ⚛️ **React 19.2.1** - Latest with security patches (CVE-2025-55182)
|
||||
- 🎨 **Tailwind CSS v4** - Modern CSS with OKLCH colors
|
||||
- 🧩 **shadcn/ui** - Pre-configured, ready to use
|
||||
- 📝 **TypeScript** - Full type safety
|
||||
- 🎯 **ESLint** - Next.js recommended config
|
||||
- 🔒 **0 Vulnerabilities** - Fully patched and secure
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- **[QUICKSTART.md](./QUICKSTART.md)** - Get started in 30 seconds
|
||||
- **[USAGE.md](./USAGE.md)** - Detailed usage guide
|
||||
- **[COMPARISON.md](./COMPARISON.md)** - vs Django Cookiecutter
|
||||
|
||||
## 🎨 Adding Components
|
||||
|
||||
```bash
|
||||
# Add shadcn/ui components
|
||||
npx shadcn@latest add button
|
||||
npx shadcn@latest add card
|
||||
npx shadcn@latest add dialog
|
||||
```
|
||||
|
||||
## 📝 Available Scripts
|
||||
|
||||
```bash
|
||||
npm run dev # Development server
|
||||
npm run build # Production build
|
||||
npm start # Production server
|
||||
npm run lint # Run ESLint
|
||||
```
|
||||
|
||||
## 📁 Project Structure
|
||||
|
||||
```
|
||||
nextjs-starter/
|
||||
├── src/
|
||||
│ ├── app/
|
||||
│ │ ├── globals.css # Tailwind + theme
|
||||
│ │ ├── layout.tsx # Root layout
|
||||
│ │ └── page.tsx # Home page
|
||||
│ ├── components/ui/ # shadcn/ui components
|
||||
│ └── lib/utils.ts # Utilities (cn helper)
|
||||
├── components.json # shadcn/ui config
|
||||
├── setup.sh # Setup script
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## 🎯 Features
|
||||
|
||||
### Modern Stack
|
||||
- Next.js 16 with Turbopack for fast builds
|
||||
- React 19 with latest features
|
||||
- Tailwind CSS v4 with modern CSS features
|
||||
- TypeScript for type safety
|
||||
|
||||
### Developer Experience
|
||||
- Hot Module Replacement
|
||||
- Fast Refresh
|
||||
- TypeScript IntelliSense
|
||||
- ESLint integration
|
||||
|
||||
### Production Ready
|
||||
- Optimized builds
|
||||
- Security patches applied
|
||||
- Zero vulnerabilities
|
||||
- Best practices configured
|
||||
|
||||
### Customizable
|
||||
- Clean, neutral theme
|
||||
- OKLCH color system
|
||||
- Dark mode ready
|
||||
- Easy to customize
|
||||
|
||||
## 🔒 Security
|
||||
|
||||
This template includes the latest security patches:
|
||||
- **CVE-2025-66478** (Next.js) - Patched in 16.0.7
|
||||
- **CVE-2025-55182** (React) - Patched in 19.2.1
|
||||
|
||||
## 🚀 Deployment
|
||||
|
||||
### Vercel (Recommended)
|
||||
```bash
|
||||
npm install -g vercel
|
||||
vercel
|
||||
```
|
||||
|
||||
### Other Platforms
|
||||
```bash
|
||||
npm run build
|
||||
npm start
|
||||
```
|
||||
|
||||
## 💡 Tips
|
||||
|
||||
1. **Use the `cn` utility** for conditional classes
|
||||
2. **Create `.env.local`** for environment variables
|
||||
3. **Organize components** in `src/components/`
|
||||
4. **Use TypeScript** for better DX
|
||||
|
||||
## 📖 Learn More
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs)
|
||||
- [Tailwind CSS Documentation](https://tailwindcss.com/docs)
|
||||
- [shadcn/ui Documentation](https://ui.shadcn.com)
|
||||
- [React Documentation](https://react.dev)
|
||||
|
||||
## 🤝 Similar to Django Cookiecutter
|
||||
|
||||
This template provides the same quick-start experience as your Django cookiecutter, but uses JavaScript-native tools:
|
||||
|
||||
```bash
|
||||
# Django
|
||||
cookiecutter ../django_starter/django_starter_cookiecutter
|
||||
|
||||
# Next.js (equivalent)
|
||||
cp -r ~/Projects/nextjs-starter ~/Projects/my-project && cd ~/Projects/my-project && ./setup.sh
|
||||
```
|
||||
|
||||
See [COMPARISON.md](./COMPARISON.md) for detailed comparison.
|
||||
|
||||
## 📄 License
|
||||
|
||||
MIT License - use freely for any project!
|
||||
|
||||
---
|
||||
|
||||
**Happy coding! 🎉**
|
||||
243
USAGE.md
Normal file
243
USAGE.md
Normal file
@ -0,0 +1,243 @@
|
||||
# Usage Guide
|
||||
|
||||
## Creating a New Project from This Template
|
||||
|
||||
### Method 1: Copy and Setup (Recommended)
|
||||
|
||||
This is the simplest and fastest method:
|
||||
|
||||
```bash
|
||||
# Copy the template
|
||||
cp -r ~/Projects/nextjs-starter ~/Projects/my-new-project
|
||||
cd ~/Projects/my-new-project
|
||||
|
||||
# Run setup script
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
### Method 2: Using degit with GitHub
|
||||
|
||||
After pushing this template to GitHub:
|
||||
|
||||
```bash
|
||||
# Clone from GitHub (no git history)
|
||||
npx degit yourusername/nextjs-starter my-new-project
|
||||
cd my-new-project
|
||||
./setup.sh
|
||||
```
|
||||
|
||||
### Method 3: Manual Setup
|
||||
|
||||
```bash
|
||||
# Copy the template
|
||||
cp -r ~/Projects/nextjs-starter ~/Projects/my-new-project
|
||||
cd ~/Projects/my-new-project
|
||||
|
||||
# Remove git history
|
||||
rm -rf .git
|
||||
|
||||
# Update package.json name manually
|
||||
# Edit package.json and change "name": "nextjs-starter" to your project name
|
||||
|
||||
# Install dependencies
|
||||
npm install
|
||||
|
||||
# Initialize git (optional)
|
||||
git init
|
||||
git add .
|
||||
git commit -m "Initial commit"
|
||||
|
||||
# Start development
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## What the Setup Script Does
|
||||
|
||||
The `setup.sh` script:
|
||||
1. ✅ Prompts for your project name
|
||||
2. ✅ Updates `package.json` with your project name
|
||||
3. ✅ Installs all dependencies
|
||||
4. ✅ Initializes a new git repository
|
||||
5. ✅ Creates initial commit
|
||||
|
||||
## Adding shadcn/ui Components
|
||||
|
||||
The template is pre-configured for shadcn/ui. Add components:
|
||||
|
||||
```bash
|
||||
# Add individual components
|
||||
npx shadcn@latest add button
|
||||
npx shadcn@latest add card
|
||||
npx shadcn@latest add dialog
|
||||
npx shadcn@latest add input
|
||||
npx shadcn@latest add label
|
||||
|
||||
# Add multiple at once
|
||||
npx shadcn@latest add button card dialog input label
|
||||
```
|
||||
|
||||
Components will be added to `src/components/ui/`.
|
||||
|
||||
## Common Customizations
|
||||
|
||||
### 1. Change App Title and Description
|
||||
|
||||
Edit `src/app/layout.tsx`:
|
||||
|
||||
```typescript
|
||||
export const metadata: Metadata = {
|
||||
title: "Your App Name",
|
||||
description: "Your app description",
|
||||
};
|
||||
```
|
||||
|
||||
### 2. Customize Theme Colors
|
||||
|
||||
Edit `src/app/globals.css` - look for the `:root` and `.dark` sections.
|
||||
|
||||
### 3. Add Environment Variables
|
||||
|
||||
Create `.env.local`:
|
||||
|
||||
```bash
|
||||
NEXT_PUBLIC_API_URL=https://api.example.com
|
||||
DATABASE_URL=postgresql://...
|
||||
```
|
||||
|
||||
### 4. Add Custom Fonts
|
||||
|
||||
Edit `src/app/layout.tsx` to add Google Fonts or local fonts.
|
||||
|
||||
### 5. Configure Deployment
|
||||
|
||||
#### Vercel (Recommended)
|
||||
```bash
|
||||
npm install -g vercel
|
||||
vercel
|
||||
```
|
||||
|
||||
#### Other Platforms
|
||||
- Build: `npm run build`
|
||||
- Start: `npm start`
|
||||
- Output: `.next` directory
|
||||
|
||||
## Project Structure Explained
|
||||
|
||||
```
|
||||
src/
|
||||
├── app/ # Next.js App Router
|
||||
│ ├── globals.css # Global styles + Tailwind
|
||||
│ ├── layout.tsx # Root layout (wraps all pages)
|
||||
│ └── page.tsx # Home page (/)
|
||||
├── components/
|
||||
│ └── ui/ # shadcn/ui components
|
||||
├── lib/
|
||||
│ └── utils.ts # Utility functions (cn helper)
|
||||
└── hooks/ # Custom React hooks (create as needed)
|
||||
```
|
||||
|
||||
## Tips & Best Practices
|
||||
|
||||
### 1. Use the `cn` Utility
|
||||
|
||||
For conditional classes:
|
||||
|
||||
```typescript
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
<div className={cn(
|
||||
"base-classes",
|
||||
condition && "conditional-classes",
|
||||
variant === "primary" && "primary-classes"
|
||||
)} />
|
||||
```
|
||||
|
||||
### 2. Organize Components
|
||||
|
||||
```
|
||||
src/components/
|
||||
├── ui/ # shadcn/ui components
|
||||
├── layout/ # Layout components (Header, Footer, etc.)
|
||||
├── features/ # Feature-specific components
|
||||
└── shared/ # Shared/common components
|
||||
```
|
||||
|
||||
### 3. Use TypeScript
|
||||
|
||||
Always define types for props:
|
||||
|
||||
```typescript
|
||||
interface ButtonProps {
|
||||
label: string;
|
||||
onClick: () => void;
|
||||
variant?: "primary" | "secondary";
|
||||
}
|
||||
|
||||
export function Button({ label, onClick, variant = "primary" }: ButtonProps) {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Environment Variables
|
||||
|
||||
- `NEXT_PUBLIC_*` - Exposed to browser
|
||||
- Others - Server-side only
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Port Already in Use
|
||||
|
||||
```bash
|
||||
# Use a different port
|
||||
npm run dev -- -p 3001
|
||||
```
|
||||
|
||||
### Clear Next.js Cache
|
||||
|
||||
```bash
|
||||
rm -rf .next
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### TypeScript Errors
|
||||
|
||||
```bash
|
||||
# Restart TypeScript server in your editor
|
||||
# Or run type check:
|
||||
npx tsc --noEmit
|
||||
```
|
||||
|
||||
## Updating Dependencies
|
||||
|
||||
```bash
|
||||
# Check for updates
|
||||
npm outdated
|
||||
|
||||
# Update all to latest
|
||||
npm update
|
||||
|
||||
# Update specific package
|
||||
npm install next@latest
|
||||
```
|
||||
|
||||
## Updating the Template
|
||||
|
||||
To pull updates from the template into an existing project:
|
||||
|
||||
```bash
|
||||
cd ~/Projects/my-existing-project
|
||||
|
||||
# Add template as remote
|
||||
git remote add template ~/Projects/nextjs-starter
|
||||
|
||||
# Fetch and merge updates
|
||||
git fetch template
|
||||
git merge template/main --allow-unrelated-histories
|
||||
```
|
||||
|
||||
## Getting Help
|
||||
|
||||
- [Next.js Docs](https://nextjs.org/docs)
|
||||
- [Tailwind CSS Docs](https://tailwindcss.com/docs)
|
||||
- [shadcn/ui Docs](https://ui.shadcn.com)
|
||||
- [React Docs](https://react.dev)
|
||||
22
components.json
Normal file
22
components.json
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": true,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "",
|
||||
"css": "src/app/globals.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"iconLibrary": "lucide",
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
},
|
||||
"registries": {}
|
||||
}
|
||||
18
eslint.config.mjs
Normal file
18
eslint.config.mjs
Normal file
@ -0,0 +1,18 @@
|
||||
import { defineConfig, globalIgnores } from "eslint/config";
|
||||
import nextVitals from "eslint-config-next/core-web-vitals";
|
||||
import nextTs from "eslint-config-next/typescript";
|
||||
|
||||
const eslintConfig = defineConfig([
|
||||
...nextVitals,
|
||||
...nextTs,
|
||||
// Override default ignores of eslint-config-next.
|
||||
globalIgnores([
|
||||
// Default ignores of eslint-config-next:
|
||||
".next/**",
|
||||
"out/**",
|
||||
"build/**",
|
||||
"next-env.d.ts",
|
||||
]),
|
||||
]);
|
||||
|
||||
export default eslintConfig;
|
||||
6
next-env.d.ts
vendored
Normal file
6
next-env.d.ts
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
import "./.next/types/routes.d.ts";
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
7
next.config.ts
Normal file
7
next.config.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import type { NextConfig } from "next";
|
||||
|
||||
const nextConfig: NextConfig = {
|
||||
/* config options here */
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
32
package.json
Normal file
32
package.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"name": "nextjs-starter",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "eslint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@radix-ui/react-slot": "^1.2.4",
|
||||
"@tailwindcss/postcss": "^4.1.17",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"lucide-react": "^0.554.0",
|
||||
"next": "^16.0.7",
|
||||
"postcss": "^8.5.6",
|
||||
"react": "^19.2.1",
|
||||
"react-dom": "^19.2.1",
|
||||
"tailwind-merge": "^3.4.0",
|
||||
"tailwindcss": "^4.1.17"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"eslint": "^9",
|
||||
"eslint-config-next": "^16.0.7",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
6
postcss.config.mjs
Normal file
6
postcss.config.mjs
Normal file
@ -0,0 +1,6 @@
|
||||
const config = {
|
||||
plugins: {
|
||||
"@tailwindcss/postcss": {},
|
||||
},
|
||||
};
|
||||
export default config;
|
||||
66
setup.sh
Normal file
66
setup.sh
Normal file
@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Next.js Starter Setup Script
|
||||
# This script will delete itself after running
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Setting up your Next.js project..."
|
||||
echo ""
|
||||
|
||||
# Check if package.json exists
|
||||
if [ ! -f "package.json" ]; then
|
||||
echo "❌ Error: package.json not found. Are you in the right directory?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get project name from user
|
||||
read -p "📝 Enter your project name (default: my-nextjs-app): " PROJECT_NAME
|
||||
PROJECT_NAME=${PROJECT_NAME:-my-nextjs-app}
|
||||
|
||||
# Validate project name (alphanumeric, hyphens, underscores only)
|
||||
if ! [[ "$PROJECT_NAME" =~ ^[a-zA-Z0-9_-]+$ ]]; then
|
||||
echo "❌ Error: Project name can only contain letters, numbers, hyphens, and underscores"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Update package.json with new project name
|
||||
echo "📦 Updating package.json..."
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS
|
||||
sed -i '' "s/\"name\": \"nextjs-starter\"/\"name\": \"$PROJECT_NAME\"/" package.json
|
||||
else
|
||||
# Linux
|
||||
sed -i "s/\"name\": \"nextjs-starter\"/\"name\": \"$PROJECT_NAME\"/" package.json
|
||||
fi
|
||||
|
||||
# Install dependencies
|
||||
echo ""
|
||||
echo "📥 Installing dependencies..."
|
||||
npm install
|
||||
|
||||
# Initialize git if not already initialized
|
||||
if [ ! -d ".git" ]; then
|
||||
echo ""
|
||||
echo "🔧 Initializing git repository..."
|
||||
git init
|
||||
git add .
|
||||
git commit -m "Initial commit from nextjs-starter template"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Setup complete!"
|
||||
echo ""
|
||||
echo "🎉 Your project '$PROJECT_NAME' is ready!"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Run 'npm run dev' to start the development server"
|
||||
echo " 2. Add shadcn/ui components: 'npx shadcn@latest add button'"
|
||||
echo " 3. Start building your app!"
|
||||
echo ""
|
||||
|
||||
# Self-destruct: Remove this setup script
|
||||
echo "🗑️ Removing setup script..."
|
||||
rm -- "$0"
|
||||
|
||||
echo "✨ All done!"
|
||||
102
src/app/globals.css
Normal file
102
src/app/globals.css
Normal file
@ -0,0 +1,102 @@
|
||||
@import "tailwindcss";
|
||||
|
||||
@custom-variant dark (&:is(.dark *));
|
||||
|
||||
@theme inline {
|
||||
--radius-sm: calc(var(--radius) - 4px);
|
||||
--radius-md: calc(var(--radius) - 2px);
|
||||
--radius-lg: var(--radius);
|
||||
--radius-xl: calc(var(--radius) + 4px);
|
||||
--color-background: var(--background);
|
||||
--color-foreground: var(--foreground);
|
||||
--color-card: var(--card);
|
||||
--color-card-foreground: var(--card-foreground);
|
||||
--color-popover: var(--popover);
|
||||
--color-popover-foreground: var(--popover-foreground);
|
||||
--color-primary: var(--primary);
|
||||
--color-primary-foreground: var(--primary-foreground);
|
||||
--color-secondary: var(--secondary);
|
||||
--color-secondary-foreground: var(--secondary-foreground);
|
||||
--color-muted: var(--muted);
|
||||
--color-muted-foreground: var(--muted-foreground);
|
||||
--color-accent: var(--accent);
|
||||
--color-accent-foreground: var(--accent-foreground);
|
||||
--color-destructive: var(--destructive);
|
||||
--color-border: var(--border);
|
||||
--color-input: var(--input);
|
||||
--color-ring: var(--ring);
|
||||
--color-chart-1: var(--chart-1);
|
||||
--color-chart-2: var(--chart-2);
|
||||
--color-chart-3: var(--chart-3);
|
||||
--color-chart-4: var(--chart-4);
|
||||
--color-chart-5: var(--chart-5);
|
||||
}
|
||||
|
||||
:root {
|
||||
--radius: 0.5rem;
|
||||
--background: oklch(1 0 0);
|
||||
--foreground: oklch(0.15 0 0);
|
||||
--card: oklch(1 0 0);
|
||||
--card-foreground: oklch(0.15 0 0);
|
||||
--popover: oklch(1 0 0);
|
||||
--popover-foreground: oklch(0.15 0 0);
|
||||
--primary: oklch(0.18 0 0);
|
||||
--primary-foreground: oklch(1 0 0);
|
||||
--secondary: oklch(0.95 0 0);
|
||||
--secondary-foreground: oklch(0.18 0 0);
|
||||
--muted: oklch(0.96 0 0);
|
||||
--muted-foreground: oklch(0.50 0 0);
|
||||
--accent: oklch(0.94 0 0);
|
||||
--accent-foreground: oklch(0.18 0 0);
|
||||
--destructive: oklch(0.55 0.22 25);
|
||||
--border: oklch(0.90 0 0);
|
||||
--input: oklch(0.95 0 0);
|
||||
--ring: oklch(0.18 0 0);
|
||||
--chart-1: oklch(0.45 0.15 250);
|
||||
--chart-2: oklch(0.55 0.15 160);
|
||||
--chart-3: oklch(0.50 0.15 30);
|
||||
--chart-4: oklch(0.60 0.12 140);
|
||||
--chart-5: oklch(0.50 0.18 320);
|
||||
}
|
||||
|
||||
.dark {
|
||||
--background: oklch(0.145 0 0);
|
||||
--foreground: oklch(0.985 0 0);
|
||||
--card: oklch(0.205 0 0);
|
||||
--card-foreground: oklch(0.985 0 0);
|
||||
--popover: oklch(0.205 0 0);
|
||||
--popover-foreground: oklch(0.985 0 0);
|
||||
--primary: oklch(0.922 0 0);
|
||||
--primary-foreground: oklch(0.205 0 0);
|
||||
--secondary: oklch(0.269 0 0);
|
||||
--secondary-foreground: oklch(0.985 0 0);
|
||||
--muted: oklch(0.269 0 0);
|
||||
--muted-foreground: oklch(0.708 0 0);
|
||||
--accent: oklch(0.269 0 0);
|
||||
--accent-foreground: oklch(0.985 0 0);
|
||||
--destructive: oklch(0.704 0.191 22.216);
|
||||
--border: oklch(1 0 0 / 10%);
|
||||
--input: oklch(1 0 0 / 15%);
|
||||
--ring: oklch(0.556 0 0);
|
||||
--chart-1: oklch(0.488 0.243 264.376);
|
||||
--chart-2: oklch(0.696 0.17 162.48);
|
||||
--chart-3: oklch(0.769 0.188 70.08);
|
||||
--chart-4: oklch(0.627 0.265 303.9);
|
||||
--chart-5: oklch(0.645 0.246 16.439);
|
||||
}
|
||||
|
||||
@layer base {
|
||||
* {
|
||||
@apply border-border outline-ring/50;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
body {
|
||||
@apply bg-background text-foreground;
|
||||
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
}
|
||||
}
|
||||
19
src/app/layout.tsx
Normal file
19
src/app/layout.tsx
Normal file
@ -0,0 +1,19 @@
|
||||
import type { Metadata } from "next";
|
||||
import "./globals.css";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Next.js Starter",
|
||||
description: "A modern Next.js starter with Tailwind CSS and shadcn/ui",
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
33
src/app/page.tsx
Normal file
33
src/app/page.tsx
Normal file
@ -0,0 +1,33 @@
|
||||
export default function Home() {
|
||||
return (
|
||||
<div className="flex min-h-screen flex-col items-center justify-center p-24">
|
||||
<main className="flex flex-col items-center gap-8 text-center">
|
||||
<h1 className="text-4xl font-bold tracking-tight">
|
||||
Next.js Starter Template
|
||||
</h1>
|
||||
<p className="text-lg text-muted-foreground max-w-2xl">
|
||||
A production-ready starter with Next.js 16, React 19, Tailwind CSS v4, and shadcn/ui.
|
||||
Start building your next project with modern tools and best practices.
|
||||
</p>
|
||||
<div className="flex gap-4">
|
||||
<a
|
||||
href="https://nextjs.org/docs"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="rounded-lg bg-primary px-6 py-3 text-primary-foreground hover:bg-primary/90 transition-colors"
|
||||
>
|
||||
Read the docs
|
||||
</a>
|
||||
<a
|
||||
href="https://ui.shadcn.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="rounded-lg border border-border px-6 py-3 hover:bg-accent transition-colors"
|
||||
>
|
||||
shadcn/ui
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
6
src/lib/utils.ts
Normal file
6
src/lib/utils.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { clsx, type ClassValue } from "clsx"
|
||||
import { twMerge } from "tailwind-merge"
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs))
|
||||
}
|
||||
34
tsconfig.json
Normal file
34
tsconfig.json
Normal file
@ -0,0 +1,34 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "react-jsx",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts",
|
||||
".next/dev/types/**/*.ts",
|
||||
"**/*.mts"
|
||||
],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user