docs: Add comprehensive frontend documentation and next steps guide
This commit is contained in:
parent
14eff8d0da
commit
cef85dd1a1
273
e-voting-system/.claude/NEXT_STEPS.md
Normal file
273
e-voting-system/.claude/NEXT_STEPS.md
Normal file
@ -0,0 +1,273 @@
|
||||
# E-Voting Frontend - Next Steps
|
||||
|
||||
## Current Status
|
||||
|
||||
The frontend has been completely rebuilt on the **UI branch** with:
|
||||
- ✅ Next.js 15 with TypeScript
|
||||
- ✅ shadcn/ui component library
|
||||
- ✅ Custom dark theme (#e8704b accent)
|
||||
- ✅ Complete dashboard system (7 pages)
|
||||
- ✅ Authentication pages (login/register)
|
||||
- ✅ Responsive design
|
||||
- ✅ Build passes all linting and type checks
|
||||
|
||||
## Immediate Next Steps
|
||||
|
||||
### 1. Backend API Integration (Priority: HIGH)
|
||||
|
||||
**Location**: `frontend/` pages and components
|
||||
|
||||
**What to do**:
|
||||
- Replace mock data with actual API calls
|
||||
- Implement authentication flow (login/logout)
|
||||
- Fetch active, upcoming, and historical votes
|
||||
- Connect vote submission endpoints
|
||||
- Handle API errors with user-friendly messages
|
||||
|
||||
**Files to modify**:
|
||||
- `app/auth/login/page.tsx` - Connect to `/api/auth/login`
|
||||
- `app/auth/register/page.tsx` - Connect to `/api/auth/register`
|
||||
- `app/dashboard/page.tsx` - Fetch stats and active votes
|
||||
- `app/dashboard/votes/*/page.tsx` - Fetch vote data by category
|
||||
- `app/dashboard/profile/page.tsx` - Fetch and update user profile
|
||||
|
||||
**Suggested approach**:
|
||||
```tsx
|
||||
// Create API client helper
|
||||
// lib/api.ts
|
||||
export async function loginUser(email: string, password: string) {
|
||||
const response = await fetch("/api/auth/login", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({ email, password }),
|
||||
})
|
||||
return response.json()
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Authentication Context (Priority: HIGH)
|
||||
|
||||
**What to do**:
|
||||
- Create AuthContext for global user state
|
||||
- Manage authentication tokens
|
||||
- Protect dashboard routes (redirect to login if not authenticated)
|
||||
- Persist user session across page reloads
|
||||
|
||||
**Suggested approach**:
|
||||
- Create `app/providers.tsx` with AuthContext provider
|
||||
- Create hook: `useAuth()` for easy access
|
||||
- Add route protection with middleware or ProtectedRoute component
|
||||
- Store tokens in secure HTTP-only cookies (backend should set these)
|
||||
|
||||
### 3. Form Validation (Priority: MEDIUM)
|
||||
|
||||
**What to do**:
|
||||
- Add Zod schema validation
|
||||
- Implement React Hook Form for all forms
|
||||
- Show field-level error messages
|
||||
- Add password strength indicator for registration
|
||||
|
||||
**Install**:
|
||||
```bash
|
||||
npm install react-hook-form zod @hookform/resolvers
|
||||
```
|
||||
|
||||
**Example**:
|
||||
```tsx
|
||||
import { useForm } from "react-hook-form"
|
||||
import { zodResolver } from "@hookform/resolvers/zod"
|
||||
import { z } from "zod"
|
||||
|
||||
const schema = z.object({
|
||||
email: z.string().email("Invalid email"),
|
||||
password: z.string().min(8, "Password too short"),
|
||||
})
|
||||
|
||||
export default function LoginPage() {
|
||||
const { register, handleSubmit, formState: { errors } } = useForm({
|
||||
resolver: zodResolver(schema),
|
||||
})
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Error Handling & Loading States (Priority: MEDIUM)
|
||||
|
||||
**What to do**:
|
||||
- Add try-catch blocks to API calls
|
||||
- Show loading spinners while fetching
|
||||
- Display error messages to users
|
||||
- Add error boundary component
|
||||
|
||||
**Files to enhance**:
|
||||
- All pages that fetch data
|
||||
- API integration functions
|
||||
- Form submission handlers
|
||||
|
||||
### 5. Additional Pages to Create (Priority: MEDIUM)
|
||||
|
||||
**Voting Page** (`/dashboard/votes/active/[id]`)
|
||||
- Display election details
|
||||
- Show all candidates with descriptions
|
||||
- Implement voting interface
|
||||
- Confirmation before final submission
|
||||
- Success message with receipt/verification
|
||||
|
||||
**Election Results Page** (`/dashboard/votes/active/[id]/results`)
|
||||
- Display results with charts
|
||||
- Show participation rate
|
||||
- Display candidate results (percentages and vote counts)
|
||||
- Timeline of vote counting
|
||||
|
||||
**Profile Edit Modal/Page**
|
||||
- Allow editing each field individually
|
||||
- Password change with current password verification
|
||||
- Two-factor authentication setup
|
||||
|
||||
**404 & Error Pages**
|
||||
- Custom error page (`app/error.tsx`)
|
||||
- Custom 404 page (`app/not-found.tsx`)
|
||||
- Global error boundary
|
||||
|
||||
### 6. Testing (Priority: LOW)
|
||||
|
||||
**What to do**:
|
||||
- Add unit tests with Jest
|
||||
- Add component tests with React Testing Library
|
||||
- Add E2E tests with Cypress or Playwright
|
||||
|
||||
**Install**:
|
||||
```bash
|
||||
npm install --save-dev jest @testing-library/react @testing-library/jest-dom
|
||||
npm install --save-dev cypress
|
||||
```
|
||||
|
||||
## Nice-to-Have Enhancements
|
||||
|
||||
### Performance
|
||||
- [ ] Image optimization with `next/image`
|
||||
- [ ] Add service worker for offline support (PWA)
|
||||
- [ ] Implement caching strategies
|
||||
- [ ] Code splitting optimization
|
||||
|
||||
### UX Improvements
|
||||
- [ ] Toast notifications for user feedback
|
||||
- [ ] Skeleton loaders while fetching data
|
||||
- [ ] Animations and transitions
|
||||
- [ ] Dark/light mode toggle
|
||||
- [ ] Internationalization (i18n) for French/English
|
||||
|
||||
### Features
|
||||
- [ ] Email notifications for upcoming votes
|
||||
- [ ] Vote reminders
|
||||
- [ ] Export vote history as PDF
|
||||
- [ ] Search functionality for elections
|
||||
- [ ] Favorites/bookmarks for elections
|
||||
- [ ] Real-time participation updates
|
||||
|
||||
## Branch Information
|
||||
|
||||
- **Current Branch**: `UI` (contains new Next.js frontend)
|
||||
- **Main Branch**: `paul/evoting` (original development branch)
|
||||
- **Backup Branch**: `backup` (contains old React CRA frontend)
|
||||
- **Backup Location**: `.backups/frontend-old/` (in working directory)
|
||||
|
||||
## File References
|
||||
|
||||
### Key Files to Review
|
||||
|
||||
**Configuration**:
|
||||
- `frontend/package.json` - Dependencies and scripts
|
||||
- `frontend/tailwind.config.ts` - Theme configuration
|
||||
- `frontend/tsconfig.json` - TypeScript settings
|
||||
- `frontend/.eslintrc.json` - Linting rules
|
||||
|
||||
**Core Pages**:
|
||||
- `frontend/app/page.tsx` - Home/landing page
|
||||
- `frontend/app/auth/login/page.tsx` - Login
|
||||
- `frontend/app/auth/register/page.tsx` - Registration
|
||||
- `frontend/app/dashboard/layout.tsx` - Dashboard layout with sidebar
|
||||
- `frontend/app/dashboard/page.tsx` - Dashboard home
|
||||
|
||||
**Components**:
|
||||
- `frontend/components/ui/button.tsx` - Button component
|
||||
- `frontend/components/ui/card.tsx` - Card component
|
||||
- `frontend/components/ui/input.tsx` - Input component
|
||||
- `frontend/components/ui/label.tsx` - Label component
|
||||
|
||||
### Documentation Files
|
||||
|
||||
- `frontend/FRONTEND_NEXTJS_GUIDE.md` - Complete frontend guide (just created)
|
||||
- `frontend/README.md` - Project overview (in .backups/frontend-old/)
|
||||
- `.claude/NEXT_STEPS.md` - This file
|
||||
|
||||
## Git Commands Reference
|
||||
|
||||
```bash
|
||||
# Switch to UI branch
|
||||
git checkout UI
|
||||
|
||||
# View changes on this branch
|
||||
git log --oneline main..UI
|
||||
|
||||
# View specific commit
|
||||
git show 14eff8d
|
||||
|
||||
# Merge UI branch to main
|
||||
git checkout main
|
||||
git merge UI
|
||||
|
||||
# Create new feature branch from UI
|
||||
git checkout -b feature/api-integration
|
||||
```
|
||||
|
||||
## Development Checklist
|
||||
|
||||
- [ ] Backend API endpoints are documented
|
||||
- [ ] Frontend team has API documentation
|
||||
- [ ] Authentication flow is clear (token handling, refresh, logout)
|
||||
- [ ] Error codes from backend are documented
|
||||
- [ ] CORS is configured correctly
|
||||
- [ ] Rate limiting is in place
|
||||
- [ ] Logging is implemented for debugging
|
||||
- [ ] Security headers are set
|
||||
|
||||
## Questions to Answer Before Starting Integration
|
||||
|
||||
1. **Authentication**:
|
||||
- How are tokens managed? (JWT, session-based, other?)
|
||||
- Where are tokens stored? (localStorage, cookie, memory?)
|
||||
- What's the refresh token flow?
|
||||
- How long do tokens last?
|
||||
|
||||
2. **API**:
|
||||
- What's the base URL for API calls?
|
||||
- Are there any authentication headers required?
|
||||
- What error format does the backend use?
|
||||
- What's the pagination strategy?
|
||||
|
||||
3. **Voting**:
|
||||
- How is the vote submitted? (single request or multi-step?)
|
||||
- Is there a signature verification?
|
||||
- Can votes be changed/revoked?
|
||||
- How is vote secrecy maintained?
|
||||
|
||||
4. **Data**:
|
||||
- What format are election results in?
|
||||
- How is participation data calculated?
|
||||
- What user information should be displayed?
|
||||
- How should archived data be filtered?
|
||||
|
||||
## Support & Resources
|
||||
|
||||
- **Backend API Docs**: Check with backend team
|
||||
- **Frontend Docs**: See `frontend/FRONTEND_NEXTJS_GUIDE.md`
|
||||
- **Previous Work**: Check git history on `UI` branch
|
||||
- **Component Library**: https://ui.shadcn.com/
|
||||
|
||||
---
|
||||
|
||||
**Branch**: UI
|
||||
**Last Updated**: 2025-11-06
|
||||
**Frontend Status**: ✅ Complete & Ready for Integration
|
||||
**Next Phase**: Backend API Integration
|
||||
440
e-voting-system/frontend/FRONTEND_NEXTJS_GUIDE.md
Normal file
440
e-voting-system/frontend/FRONTEND_NEXTJS_GUIDE.md
Normal file
@ -0,0 +1,440 @@
|
||||
# E-Voting Frontend - Next.js + ShadCN/UI Guide
|
||||
|
||||
## Overview
|
||||
|
||||
The E-Voting frontend has been completely rebuilt using **Next.js 15** and **shadcn/ui** components. This provides a modern, type-safe, and fully responsive user interface for the e-voting platform.
|
||||
|
||||
### Key Technologies
|
||||
|
||||
- **Framework**: Next.js 15 with App Router
|
||||
- **UI Components**: shadcn/ui (Radix UI + Tailwind CSS)
|
||||
- **Styling**: Tailwind CSS with custom dark theme
|
||||
- **Language**: TypeScript with strict type checking
|
||||
- **Icons**: Lucide React
|
||||
- **Forms**: React Hook Form (ready for integration)
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
frontend/
|
||||
├── app/ # Next.js App Router pages
|
||||
│ ├── layout.tsx # Root layout with metadata
|
||||
│ ├── page.tsx # Home page (landing)
|
||||
│ ├── globals.css # Global styles and CSS variables
|
||||
│ ├── auth/
|
||||
│ │ ├── login/page.tsx # Login page
|
||||
│ │ └── register/page.tsx # Registration page
|
||||
│ └── dashboard/
|
||||
│ ├── layout.tsx # Dashboard layout with sidebar
|
||||
│ ├── page.tsx # Dashboard home
|
||||
│ ├── profile/page.tsx # User profile management
|
||||
│ └── votes/
|
||||
│ ├── active/page.tsx # Active votes
|
||||
│ ├── upcoming/page.tsx # Upcoming votes
|
||||
│ ├── history/page.tsx # Vote history
|
||||
│ └── archives/page.tsx # Archived votes
|
||||
├── components/
|
||||
│ └── ui/ # Reusable UI components
|
||||
│ ├── button.tsx # Button component with variants
|
||||
│ ├── card.tsx # Card component with subcomponents
|
||||
│ ├── input.tsx # Input field component
|
||||
│ ├── label.tsx # Label component
|
||||
│ └── index.ts # Component exports
|
||||
├── lib/
|
||||
│ └── utils.ts # Utility functions (cn helper)
|
||||
├── public/ # Static assets
|
||||
├── styles/ # Additional stylesheets
|
||||
├── package.json # Dependencies and scripts
|
||||
├── tsconfig.json # TypeScript configuration
|
||||
├── tailwind.config.ts # Tailwind CSS configuration
|
||||
├── next.config.js # Next.js configuration
|
||||
└── postcss.config.js # PostCSS configuration
|
||||
```
|
||||
|
||||
## Running the Project
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
cd frontend
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
The application will be available at `http://localhost:3000`.
|
||||
|
||||
### Production Build
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
npm start
|
||||
```
|
||||
|
||||
### Linting
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## Pages Overview
|
||||
|
||||
### Public Pages
|
||||
|
||||
#### 1. Home Page (`/`)
|
||||
- Hero section with call-to-action
|
||||
- Stats section (1000+ voters, 50+ elections, 99.9% security)
|
||||
- Features section highlighting key benefits
|
||||
- Navigation to login/register
|
||||
- Responsive design for mobile
|
||||
|
||||
#### 2. Login Page (`/auth/login`)
|
||||
- Email and password input fields
|
||||
- Error display with icons
|
||||
- Loading state during submission
|
||||
- Link to registration page
|
||||
- Feature highlights illustration
|
||||
|
||||
#### 3. Register Page (`/auth/register`)
|
||||
- First name, last name, email, password fields
|
||||
- Password confirmation validation
|
||||
- Success/error state handling
|
||||
- Feature highlights on form side
|
||||
|
||||
### Protected Pages (Dashboard)
|
||||
|
||||
#### 4. Dashboard Home (`/dashboard`)
|
||||
- Welcome section with user name
|
||||
- Stats cards (active votes, upcoming, past, archives)
|
||||
- Active votes carousel
|
||||
- Quick action buttons
|
||||
- Responsive grid layout
|
||||
|
||||
#### 5. Active Votes (`/dashboard/votes/active`)
|
||||
- List of ongoing elections
|
||||
- Progress bars showing participation
|
||||
- Vote count and candidate information
|
||||
- Filter by category (National, Local, Regional)
|
||||
- "Participate" button for each vote
|
||||
|
||||
#### 6. Upcoming Votes (`/dashboard/votes/upcoming`)
|
||||
- Timeline view of future elections
|
||||
- Importance indicators (color-coded)
|
||||
- Start date and time for each vote
|
||||
- "Notify me" button for reminders
|
||||
- Category and importance filtering
|
||||
|
||||
#### 7. Vote History (`/dashboard/votes/history`)
|
||||
- Past elections with results
|
||||
- Participation indicator (checkmark if voted)
|
||||
- Stats: total voted, participation rate
|
||||
- Results preview (winner and participation %)
|
||||
- Filterable by participation status
|
||||
|
||||
#### 8. Archives (`/dashboard/votes/archives`)
|
||||
- Historical elections organized by year
|
||||
- Document count per election
|
||||
- Download and consult options
|
||||
- Year filtering
|
||||
- Grid layout for browsing
|
||||
|
||||
#### 9. Profile Page (`/dashboard/profile`)
|
||||
- Personal information form
|
||||
- Address and contact details
|
||||
- Password change section
|
||||
- Two-factor authentication status
|
||||
- Session management
|
||||
- Account deletion option
|
||||
|
||||
## Design System
|
||||
|
||||
### Color Palette
|
||||
|
||||
The custom dark theme uses CSS variables defined in `app/globals.css`:
|
||||
|
||||
```css
|
||||
--background: 23 23 23 (rgb(23, 23, 23))
|
||||
--foreground: 224 224 224 (rgb(224, 224, 224))
|
||||
--primary: 232 112 75 (rgb(232, 112, 75)) [Accent]
|
||||
--secondary: 163 163 163
|
||||
--muted: 115 115 115
|
||||
--border: 82 82 82
|
||||
--input: 82 82 82
|
||||
--card: 39 39 39
|
||||
```
|
||||
|
||||
### Component Patterns
|
||||
|
||||
#### Button Component
|
||||
```tsx
|
||||
import { Button } from "@/components/ui/button"
|
||||
|
||||
// Default variant
|
||||
<Button>Submit</Button>
|
||||
|
||||
// Outline variant
|
||||
<Button variant="outline">Cancel</Button>
|
||||
|
||||
// Destructive variant
|
||||
<Button variant="destructive">Delete</Button>
|
||||
|
||||
// Ghost variant (no background)
|
||||
<Button variant="ghost">Link</Button>
|
||||
|
||||
// Sizes
|
||||
<Button size="sm">Small</Button>
|
||||
<Button size="lg">Large</Button>
|
||||
```
|
||||
|
||||
#### Card Component
|
||||
```tsx
|
||||
import { Card, CardHeader, CardTitle, CardDescription, CardContent } from "@/components/ui/card"
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Title</CardTitle>
|
||||
<CardDescription>Description</CardDescription>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
{/* Content */}
|
||||
</CardContent>
|
||||
</Card>
|
||||
```
|
||||
|
||||
#### Input Component
|
||||
```tsx
|
||||
import { Input } from "@/components/ui/input"
|
||||
|
||||
<Input
|
||||
type="email"
|
||||
placeholder="Enter email"
|
||||
value={value}
|
||||
onChange={handleChange}
|
||||
/>
|
||||
```
|
||||
|
||||
#### Label Component
|
||||
```tsx
|
||||
import { Label } from "@/components/ui/label"
|
||||
|
||||
<Label htmlFor="email">Email Address</Label>
|
||||
<Input id="email" type="email" />
|
||||
```
|
||||
|
||||
## State Management
|
||||
|
||||
Currently, all state is managed with React hooks (`useState`). For more complex state management, consider:
|
||||
|
||||
- **Context API** for global state (authentication, user preferences)
|
||||
- **TanStack Query** for server state (API calls, caching)
|
||||
- **Zustand** for client state (if scaling up)
|
||||
|
||||
## Styling Guide
|
||||
|
||||
### Using Tailwind Classes
|
||||
|
||||
All styling uses Tailwind CSS utility classes. Custom CSS is avoided.
|
||||
|
||||
```tsx
|
||||
<div className="flex items-center justify-between p-4 rounded-lg bg-card border border-border hover:border-accent transition-colors">
|
||||
<span className="text-sm font-medium text-foreground">Label</span>
|
||||
<button className="text-accent hover:text-accent/80 transition-colors">Action</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
### Responsive Design
|
||||
|
||||
Use Tailwind's responsive prefixes:
|
||||
|
||||
```tsx
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
{/* Responsive grid */}
|
||||
</div>
|
||||
```
|
||||
|
||||
## Adding New Pages
|
||||
|
||||
### Create a new page
|
||||
|
||||
1. Create a new file in `app/[section]/[page]/page.tsx`
|
||||
2. Make it a "use client" component if it needs interactivity
|
||||
3. Use existing components from `components/ui/`
|
||||
4. Follow the naming conventions and styling patterns
|
||||
|
||||
Example:
|
||||
|
||||
```tsx
|
||||
"use client"
|
||||
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Card, CardHeader, CardTitle } from "@/components/ui/card"
|
||||
|
||||
export default function NewPage() {
|
||||
return (
|
||||
<div className="space-y-8">
|
||||
<h1 className="text-3xl font-bold">New Page Title</h1>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Card Title</CardTitle>
|
||||
</CardHeader>
|
||||
</Card>
|
||||
|
||||
<Button>Action</Button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
## Adding New Components
|
||||
|
||||
### Create a new UI component
|
||||
|
||||
1. Create `components/ui/component-name.tsx`
|
||||
2. Export from `components/ui/index.ts`
|
||||
3. Use Radix UI primitives as base if available
|
||||
4. Style with Tailwind CSS
|
||||
5. Include proper TypeScript types
|
||||
|
||||
Example:
|
||||
|
||||
```tsx
|
||||
import React from "react"
|
||||
|
||||
export interface CustomButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
variant?: "default" | "outline"
|
||||
size?: "sm" | "md" | "lg"
|
||||
}
|
||||
|
||||
export const CustomButton = React.forwardRef<HTMLButtonElement, CustomButtonProps>(
|
||||
({ className, variant = "default", size = "md", ...props }, ref) => {
|
||||
return (
|
||||
<button
|
||||
ref={ref}
|
||||
className={`px-4 py-2 rounded-lg font-medium transition-colors ${
|
||||
variant === "outline" ? "border border-border hover:bg-muted" : "bg-accent text-white hover:bg-accent/90"
|
||||
}`}
|
||||
{...props}
|
||||
/>
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
CustomButton.displayName = "CustomButton"
|
||||
```
|
||||
|
||||
## Integration with Backend
|
||||
|
||||
The frontend is ready to integrate with the E-Voting backend API. Currently, API calls are commented out or return mock data.
|
||||
|
||||
### API Endpoints to Connect
|
||||
|
||||
#### Authentication
|
||||
- `POST /api/auth/register` - User registration
|
||||
- `POST /api/auth/login` - User login
|
||||
- `POST /api/auth/logout` - User logout
|
||||
- `POST /api/auth/refresh` - Refresh authentication token
|
||||
|
||||
#### Votes
|
||||
- `GET /api/votes/active` - Get active votes
|
||||
- `GET /api/votes/upcoming` - Get upcoming votes
|
||||
- `GET /api/votes/:id` - Get vote details
|
||||
- `POST /api/votes/:id/participate` - Submit vote
|
||||
- `GET /api/votes/history` - Get vote history
|
||||
- `GET /api/votes/archives` - Get archived votes
|
||||
|
||||
#### User
|
||||
- `GET /api/user/profile` - Get user profile
|
||||
- `PUT /api/user/profile` - Update profile
|
||||
- `PUT /api/user/password` - Change password
|
||||
- `GET /api/user/sessions` - Get active sessions
|
||||
|
||||
### Example API Integration
|
||||
|
||||
```tsx
|
||||
const [data, setData] = useState(null)
|
||||
const [loading, setLoading] = useState(false)
|
||||
const [error, setError] = useState(null)
|
||||
|
||||
useEffect(() => {
|
||||
const fetchData = async () => {
|
||||
setLoading(true)
|
||||
try {
|
||||
const response = await fetch("/api/votes/active")
|
||||
const result = await response.json()
|
||||
setData(result)
|
||||
} catch (err) {
|
||||
setError(err)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
fetchData()
|
||||
}, [])
|
||||
```
|
||||
|
||||
## Accessibility (a11y)
|
||||
|
||||
All components follow WCAG 2.1 guidelines:
|
||||
|
||||
- Proper heading hierarchy
|
||||
- ARIA labels on form inputs
|
||||
- Keyboard navigation support
|
||||
- Color contrast ratios > 4.5:1
|
||||
- Focus indicators visible
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
- **Code Splitting**: Next.js automatically splits code at route boundaries
|
||||
- **Image Optimization**: Use `next/image` for optimized images
|
||||
- **Font Optimization**: System fonts used by default (fast loading)
|
||||
- **CSS-in-JS**: Tailwind generates minimal CSS bundle
|
||||
|
||||
Current build size: ~117 kB First Load JS (shared by all pages)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Build fails with TypeScript errors:**
|
||||
```bash
|
||||
npm run build -- --no-lint
|
||||
```
|
||||
|
||||
**Dependencies conflict:**
|
||||
```bash
|
||||
npm install --legacy-peer-deps
|
||||
```
|
||||
|
||||
**Cache issues:**
|
||||
```bash
|
||||
rm -rf .next node_modules
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. **API Integration**: Connect authentication and vote endpoints
|
||||
2. **State Management**: Implement user session management with Context
|
||||
3. **Error Handling**: Add error boundaries and error pages
|
||||
4. **Loading States**: Show skeleton screens during data fetching
|
||||
5. **Validation**: Implement form validation with Zod + React Hook Form
|
||||
6. **Testing**: Add unit tests with Jest and E2E tests with Cypress
|
||||
7. **Analytics**: Integrate analytics tracking
|
||||
8. **PWA**: Add PWA capabilities for offline support
|
||||
|
||||
## Resources
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs)
|
||||
- [shadcn/ui Documentation](https://ui.shadcn.com)
|
||||
- [Tailwind CSS Documentation](https://tailwindcss.com/docs)
|
||||
- [Radix UI Documentation](https://www.radix-ui.com)
|
||||
- [TypeScript Documentation](https://www.typescriptlang.org/docs)
|
||||
|
||||
## Support
|
||||
|
||||
For questions or issues related to the frontend, refer to:
|
||||
- Commit history: `git log --oneline`
|
||||
- Recent changes: `git diff main..UI`
|
||||
- Build output: Check terminal after `npm run build`
|
||||
Loading…
x
Reference in New Issue
Block a user