14 KiB
Dashboard Recreation Plan: Next.js 14 + shadcn/ui
Overview
Recreate the main dashboard page from https://shadcnblocks-admin.vercel.app/ using Next.js 14 App Router, shadcn/ui components, TypeScript, Chart.js, Inter font, and dark/light theme support with mock data.
Project Status
- Current State: Empty directory (only readme.md exists)
- Target: Full-featured dashboard with sidebar navigation, metrics, charts, and data tables
Implementation Phases
Phase 1: Project Foundation (30 min)
1. Initialize Next.js 14 Project
cd /e/repos/claude/shadcn-dashboard
npx create-next-app@latest . --typescript --tailwind --app --no-src-dir --import-alias "@/*"
Choose: TypeScript ✓, ESLint ✓, Tailwind CSS ✓, App Router ✓, No src/ directory
2. Initialize shadcn/ui
npx shadcn@latest init
Choose: Default style, Slate base color, CSS variables ✓
3. Install Dependencies
npm install chart.js react-chartjs-2 next-themes lucide-react date-fns
npm install -D @types/node
4. Install shadcn/ui Components
npx shadcn@latest add button card table dropdown-menu tabs avatar badge separator input sidebar command dialog
Phase 2: Theme & Layout Foundation (45 min)
5. Create Theme Provider
File: components/theme-provider.tsx
- Wrap next-themes provider
- Export ThemeProvider component
6. Configure Root Layout
File: app/layout.tsx
- Import Inter font from next/font/google
- Wrap with ThemeProvider (attribute="class", defaultTheme="system")
- Wrap with SidebarProvider
- Add suppressHydrationWarning to html tag
7. Create Theme Toggle Component
File: components/layout/theme-toggle.tsx
- Use useTheme() hook
- Dropdown menu: Light, Dark, System options
- Sun/Moon icons from lucide-react
8. Build Sidebar Navigation
File: components/layout/app-sidebar.tsx
- Use shadcn/ui Sidebar components
- Navigation structure:
- General: Dashboard (3 sub-items), Tasks, Users
- Pages: Auth, Errors
- Other: Settings, Developers
- Icons from lucide-react
- User profile section in footer
File: components/layout/user-nav.tsx
- Avatar with dropdown menu
- Options: Profile, Settings, Sign out
9. Create Header Component
File: components/layout/header.tsx
- Left: SidebarTrigger button
- Center: Command palette button (⌘K)
- Right: ThemeToggle component
- Sticky positioning with backdrop blur
Phase 3: Data Layer (20 min)
10. Define TypeScript Interfaces
File: types/dashboard.ts
interface MetricCard {
id: string;
title: string;
value: string | number;
change: number;
changeLabel: string;
}
interface Payment {
id: string;
status: 'success' | 'processing' | 'failed';
email: string;
amount: number;
}
interface TeamMember {
id: string;
name: string;
email: string;
role: string;
avatar: string;
}
interface ChartDataPoint {
label: string;
value: number;
secondaryValue?: number;
}
interface DashboardData {
metrics: MetricCard[];
revenueData: ChartDataPoint[];
salesData: ChartDataPoint[];
payments: Payment[];
team: TeamMember[];
}
11. Create Mock Data
File: lib/mock-data.ts
Generate realistic data:
-
Metrics (4 cards):
- New Subscriptions: 4,682 (+15.54%)
- New Orders: 1,226 (+40.2%)
- Avg Order Revenue: 1,080 (+10.8%)
- Total Revenue: $15,231.89 (+20.1%)
-
Revenue Chart: 6 months of trend data
-
Sales Chart: 12 months of bar data
-
Payments Table: 12-15 transaction entries
-
Team Table: 6-8 member entries
Export getDashboardData() function
Phase 4: Chart Components (45 min)
12. Configure Chart.js
File: lib/chart-config.ts
- Register Chart.js components (CategoryScale, LinearScale, PointElement, LineElement, BarElement, Tooltip, Legend)
- Define default options
- Export
getChartColors(theme)for theme-aware styling
13. Create Line Chart Component
File: components/charts/line-chart.tsx
- Mark as "use client"
- Use dynamic import with
{ ssr: false } - Accept props: data, options, height
- Apply theme-aware colors using useTheme()
14. Create Bar Chart Component
File: components/charts/bar-chart.tsx
- Similar to LineChart but using Bar from react-chartjs-2
- "use client" directive
- Theme-aware colors
Phase 5: Dashboard Components (90 min)
15. Create Metric Card
File: components/dashboard/metric-card.tsx
- Use Card component
- Display: title, value, change percentage (colored), change label
- Add TrendingUp/TrendingDown icon based on change
16. Build Revenue Chart Component
File: components/dashboard/revenue-chart.tsx
- Use LineChart component
- Dual-line display (Revenue + Subscriptions)
- Wrap in Card with title
17. Build Sales Activity Chart
File: components/dashboard/sales-chart.tsx
- Use BarChart component
- 12-month bar display
- Wrap in Card with title
18. Create Payments Table
File: components/dashboard/payments-table.tsx
- Use Table components
- Columns: Status (Badge), Email, Amount (formatted), Actions (DropdownMenu)
- Color-coded status badges (green/yellow/red)
- Wrap in Card with title
19. Create Team Members Table
File: components/dashboard/team-table.tsx
- Use Table components
- Columns: Member (Avatar + name), Email, Role
- Wrap in Card with title
20. Create Dashboard Tabs
File: components/dashboard/dashboard-tabs.tsx
- Use Tabs component
- Four tabs: Overview (active), Analytics, Reports, Notifications (last 3 disabled)
- Overview contains all dashboard content
Phase 6: Assembly & Polish (60 min)
21. Build Main Dashboard Page
File: app/page.tsx
- Import all dashboard components
- Call getDashboardData()
- Layout structure:
- Page header with title
- DashboardTabs wrapper
- Metric cards grid (1→2→4 cols responsive)
- Charts row (1→2 cols responsive)
- Tables row (1→2 cols responsive)
22. Configure Inter Font
File: app/layout.tsx
- Import Inter from next/font/google
- Apply to body with className
23. Add Custom Styling
File: app/globals.css
- Smooth transitions for theme changes
- Custom scrollbar styling
- Hover effects
- Focus states
24. Create Avatar Placeholders
Directory: public/avatars/
- Create 01.png through 08.png
- Use UI Avatars service or placeholder images
- Ensure Avatar components have fallback initials
Phase 7: Testing & Refinement (30 min)
25. Development Testing
npm run dev
Test checklist:
- ✓ Dashboard loads at localhost:3000
- ✓ Theme toggle works (light/dark/system)
- ✓ Sidebar collapse/expand
- ✓ All metric cards display
- ✓ Charts render with data
- ✓ Tables show all entries
- ✓ Responsive design works
- ✓ Command palette (⌘K) opens
- ✓ No TypeScript errors
26. Build Optimization
npm run build
npm start
Verify:
- No build errors
- Reasonable bundle size
- Chart.js code-split properly
- Production performance good
27. Final Polish
- Add loading states for charts
- Add empty states for tables
- Improve accessibility (ARIA labels)
- Add tooltips where helpful
- Refine responsive breakpoints
Critical Files to Create (22 total)
Configuration (Auto-generated)
- package.json, tsconfig.json, tailwind.config.ts, next.config.js, components.json
Application Core
- app/layout.tsx - Root layout with providers
- app/page.tsx - Main dashboard page
- app/globals.css - Global styles
Theme & Layout
- components/theme-provider.tsx
- components/layout/app-sidebar.tsx
- components/layout/header.tsx
- components/layout/theme-toggle.tsx
- components/layout/user-nav.tsx
Dashboard Components
- components/dashboard/metric-card.tsx
- components/dashboard/revenue-chart.tsx
- components/dashboard/sales-chart.tsx
- components/dashboard/payments-table.tsx
- components/dashboard/team-table.tsx
- components/dashboard/dashboard-tabs.tsx
Charts
Data Layer
- lib/mock-data.ts
- lib/chart-config.ts
- lib/utils.ts - Auto-generated by shadcn
Types
Assets
21-28. public/avatars/01-08.png - Avatar placeholder images
Key Technical Decisions
1. Chart.js Integration
- Use Chart.js (as requested) with react-chartjs-2
- Mark chart components as "use client"
- Use dynamic imports with
{ ssr: false }to avoid SSR issues - Theme-aware colors using useTheme() hook
2. Sidebar Implementation
- Use shadcn/ui Sidebar component (official, accessible)
- Built-in state management with cookie persistence
- Fully customizable with Tailwind
3. Theme Management
- Use next-themes package (industry standard)
- Zero-flash on load with suppressHydrationWarning
- CSS class strategy for theme switching
4. Component Strategy
- Server Components by default
- "use client" only when necessary (charts, theme toggle, interactive elements)
- Feature-based organization in components/ directory
5. Responsive Design
- Mobile-first with Tailwind breakpoints
- Metrics: 1→2→4 column grid
- Charts/Tables: 1→2 column grid
- Horizontal scroll for tables on mobile
Potential Challenges & Solutions
Challenge 1: Chart.js SSR Issues
Solution: Use dynamic imports with { ssr: false } and "use client" directive
Challenge 2: Theme Flash on Load
Solution: Use next-themes with suppressHydrationWarning and disableTransitionOnChange
Challenge 3: Sidebar State Persistence
Solution: shadcn/ui Sidebar has built-in cookie persistence
Challenge 4: Responsive Tables
Solution: Wrap tables in overflow-x-auto containers
Challenge 5: Chart Colors in Dark Mode
Solution: Use useTheme() to detect theme and apply color schemes from chart-config.ts
Project Directory Structure
shadcn-dashboard/
├── app/
│ ├── layout.tsx # Root layout with providers
│ ├── page.tsx # Main dashboard page
│ └── globals.css # Global styles
├── components/
│ ├── ui/ # shadcn/ui components (auto-generated)
│ ├── layout/
│ │ ├── app-sidebar.tsx # Main sidebar
│ │ ├── header.tsx # Top header
│ │ ├── theme-toggle.tsx # Theme switcher
│ │ └── user-nav.tsx # User profile dropdown
│ ├── dashboard/
│ │ ├── metric-card.tsx # Metric display card
│ │ ├── revenue-chart.tsx # Revenue line chart
│ │ ├── sales-chart.tsx # Sales bar chart
│ │ ├── payments-table.tsx # Payments data table
│ │ ├── team-table.tsx # Team members table
│ │ └── dashboard-tabs.tsx # Tab navigation
│ ├── charts/
│ │ ├── line-chart.tsx # Line chart wrapper
│ │ └── bar-chart.tsx # Bar chart wrapper
│ └── theme-provider.tsx # Theme context provider
├── lib/
│ ├── utils.ts # Utility functions
│ ├── mock-data.ts # Mock dashboard data
│ └── chart-config.ts # Chart.js config
├── types/
│ └── dashboard.ts # TypeScript interfaces
├── public/
│ └── avatars/ # User avatar images
├── tailwind.config.ts
├── tsconfig.json
├── next.config.js
├── components.json
└── package.json
Estimated Timeline
- Phase 1 (Foundation): 30 minutes
- Phase 2 (Theme & Layout): 45 minutes
- Phase 3 (Data Layer): 20 minutes
- Phase 4 (Charts): 45 minutes
- Phase 5 (Dashboard Components): 90 minutes
- Phase 6 (Assembly & Polish): 60 minutes
- Phase 7 (Testing): 30 minutes
Total: 5-6 hours for complete implementation
Next Steps After Approval
- Run project initialization commands
- Install and configure all dependencies
- Create file structure
- Implement components in order
- Test thoroughly
- Polish and optimize
Future Enhancement Possibilities
- Real API Integration: Replace mock data with API calls
- Authentication: Add NextAuth.js or Clerk
- More Pages: Analytics, Reports, User Management
- Real-time Updates: WebSocket integration
- Advanced Tables: Add TanStack Table for sorting/filtering
- Alternative Charts: Consider shadcn/ui Chart components (Recharts) for better theme integration