A production-ready, accessible ticket management web application built with React 18 and Vite. Features a stylish hero with wave and decorative circles, protected authentication (simulated with localStorage), and full CRUD ticket management.
- π¨ Beautiful, accessible UI with Poppins font
- π Simulated authentication system
- π Full CRUD operations for ticket management
- π Dashboard with statistics
- π― Status tracking (Open, In Progress, Closed)
- β Priority levels (Low, Medium, High)
- π± Fully responsive design
- βΏ WCAG-compliant accessibility
- π Toast notifications
- π Modal dialogs with keyboard support
- Framework: React 18 + Vite
- Routing: React Router DOM
- Styling: CSS Modules
- State Management: React Hooks
- Storage: LocalStorage (simulated backend)
npm installnpm run devOpen http://localhost:5173 in your browser.
npm run buildnpm run previewFor testing purposes, you can use the following credentials:
- Email:
test@example.com - Password:
123456
src/
βββ components/ # Reusable UI components
β βββ Modal.jsx # Modal dialog component
β βββ TicketCard.jsx # Individual ticket display
β βββ TicketForm.jsx # Ticket create/edit form
β βββ Toast.jsx # Toast notification
β βββ ToastContainer.jsx # Toast container wrapper
βββ hooks/ # Custom React hooks
β βββ useAuth.js # Authentication logic
β βββ useToast.js # Toast notification management
βββ pages/ # Page components
β βββ Landing.jsx # Landing/hero page
β βββ Login.jsx # Login page
β βββ Signup.jsx # Signup page
β βββ Dashboard.jsx # Dashboard with stats
β βββ Tickets.jsx # Ticket management page
βββ styles/ # CSS stylesheets
β βββ Landing.css
β βββ Auth.css
β βββ Dashboard.css
β βββ Tickets.css
βββ utils/ # Utility functions
β βββ storage.js # LocalStorage operations
βββ App.tsx # Main app component with routing
βββ App.css # Global styles
βββ index.css # Base styles
βββ main.tsx # App entry point
- App.tsx: Main application component, sets up routing and protected routes
- Modal.jsx: Reusable modal dialog with keyboard support and click-outside-to-close
- TicketCard.jsx: Displays individual ticket with status, priority, and actions
- TicketForm.jsx: Form for creating/editing tickets with validation
- Toast.jsx: Individual toast notification with auto-dismiss
- ToastContainer.jsx: Container for managing multiple toast notifications
- Landing.jsx: Homepage with hero section, wave SVG, and decorative circles
- Login.jsx: User login with email/password authentication
- Signup.jsx: User registration with validation
- Dashboard.jsx: Overview page with ticket statistics
- Tickets.jsx: Full CRUD interface for managing tickets
- useAuth.js: Manages authentication state, login, signup, and logout
- useToast.js: Manages toast notifications with auto-dismiss
- storage.js: LocalStorage operations for tickets and users, includes seed data
/- Landing page with hero and CTA buttons/download- Download source code as ZIP file/auth/login- Login page/auth/signup- Signup page/dashboard- Protected dashboard (requires auth)/tickets- Protected ticket management (requires auth)
The app uses the following localStorage keys:
ticketapp_session: Stores user session (email and token)ticketapp_tickets: Array of ticket objectsticketapp_users: Array of user objects (for authentication)
{
id: string,
title: string,
description?: string,
status: "open" | "in_progress" | "closed",
priority?: "low" | "medium" | "high",
createdAt: timestamp
}- Title: Required
- Status: Required, must be one of:
open,in_progress,closed - Description: Optional, minimum 10 characters if provided
- Priority: Optional, one of:
low,medium,high
- Email: Required, valid email format
- Password: Required, minimum 6 characters
- Confirm Password (signup): Must match password
- All form inputs have associated labels
- Error messages use
aria-describedbyandrole="alert" - All interactive elements are keyboard-accessible
- Visible focus states on all interactive elements
- Semantic HTML (header, main, footer, nav, section, article)
- ARIA attributes for screen readers
- Color contrast ratios meet WCAG standards
- Modal traps focus and closes on Escape key
The project includes a built-in download feature:
- Click Download: Visit
/downloadto access the download page - ZIP File: The complete source code is packaged as
source.zip(~0.25 MB) - Auto-generated: The ZIP is automatically created when you run
npm run build - Public Access: The ZIP file is accessible at
/source.zipfor direct download
To manually create the source ZIP file:
npm run create-zipThe script excludes:
node_modules/.git/dist/andbuild/.envfiles- Build artifacts
To reset the app to its initial state:
- Open browser DevTools (F12)
- Go to Application β Local Storage
- Delete all keys starting with
ticketapp_ - Refresh the page
Or run in console:
localStorage.removeItem('ticketapp_session')
localStorage.removeItem('ticketapp_tickets')
localStorage.removeItem('ticketapp_users')
location.reload()On first load, the app seeds:
- Email:
test@example.com - Password:
123456
- Fix homepage layout issue (Open, High)
- Add user authentication (In Progress, Medium)
- Update documentation (Closed, Low)
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers (iOS Safari, Chrome Android)
- Max Width: 1440px (centered)
- Font: Poppins
- Colors:
- Open status: #28a745 (green)
- In Progress: #ffc107 (amber)
- Closed: #6c757d (gray)
- Hero: Wave SVG bottom edge + decorative circles
- Responsive: Mobile-first with breakpoints at 480px, 640px, 768px
None currently. If you find any issues, please report them.
- Backend API integration
- Real-time updates with WebSockets
- File attachments for tickets
- Comments/activity log
- Email notifications
- Advanced filtering and search
- Ticket assignment to users
- Dark mode support
MIT
Built with Vite + React