A modern, responsive issue tracking application built with Next.js App Router and Tailwind CSS. Features real-time search, filtering, dark mode, and persistent client-side storage.
- π Issue Management: Create, edit, and track issues with titles, descriptions, and status
- π Real-time Search: Instant filtering by issue title (case-insensitive)
- π·οΈ Status Filtering: Filter by Open, In Progress, Closed, or All issues
- π Smart Sorting: Sort by update date (newest/oldest) with null values handled properly
- π URL State: Shareable URLs with search, filter, and sort parameters
- πΎ Persistent Storage: Client-side changes saved to localStorage
- π Dark Mode: Toggle between light, dark, and system preference themes
- π± Responsive Design: Mobile-first approach with progressive enhancement
- βΏ Accessibility: WCAG AA compliant with keyboard navigation and screen reader support
- π¨ Modern UI: Clean design with semantic color tokens and smooth animations
- π Next.js App Router: Server-side rendering with client-side hydration
- π― TypeScript: Full type safety and developer experience
- π§© Custom Hooks: Modular, reusable logic separation
- π¦ Shadcn/UI: High-quality, accessible component library
- π Tailwind CSS: Utility-first styling with semantic design tokens
- Node.js 18+
- npm or yarn
# Clone or download the project
cd issue-tracker
# Install dependencies
npm install
# Start development server
npm run dev
The app will be available at http://localhost:3000
# Build for production
npm run build
# Start production server
npm start
issue-tracker/
βββ src/
β βββ app/ # Next.js App Router pages
β β βββ layout.tsx # Root layout with metadata
β β βββ page.tsx # Main issues page (server component)
β βββ components/ # React components
β β βββ ui/ # Shadcn/UI base components
β β βββ issue-header.tsx # Header with search/filter/sort controls
β β βββ issue-table.tsx # Responsive issues table
β β βββ issue-detail-panel.tsx # Slide-over edit panel
β β βββ new-issue-modal.tsx # Create issue modal
β β βββ status-badge.tsx # Status indicator component
β β βββ search-input.tsx # Search with icon
β β βββ status-filter.tsx # Status dropdown
β β βββ sort-toggle.tsx # Sort direction toggle
β β βββ dark-mode-toggle.tsx # Theme switcher
β β βββ issues-page-client.tsx # Main client component
β βββ hooks/ # Custom React hooks
β β βββ use-url-state.ts # URL synchronization
β β βββ use-issues-manager.ts # Data management
β β βββ use-modal-state.ts # Modal state
β β βββ use-dark-mode.ts # Theme management
β β βββ index.ts # Hook exports
β βββ lib/
β βββ issues.ts # Data parsing and utilities
βββ issues.dat # Sample issue data
βββ tailwind.config.ts # Tailwind configuration with design tokens
βββ DECISIONS.md # Technical decisions and rationale
βββ README.md # This file
- View Issues: All issues are displayed in a responsive table
- Search Issues: Type in the search box to filter by title
- Filter by Status: Use the status dropdown to filter by Open/In Progress/Closed
- Sort Issues: Click the sort toggle to switch between newest/oldest
- Create Issue: Click "New Issue" button, fill form, and submit
- Edit Issue: Click any issue row to open the detail panel
The app maintains all filter state in the URL for easy sharing:
?q=search+term
- Search query?status=open
- Status filter?sort=asc
- Sort direction- Combined:
?q=login&status=open&sort=desc
- Manual Toggle: Click the sun/moon icon in the header
- System Preference: Automatically follows your OS setting
- Persistent: Remembers your choice across sessions
- Server Data: Initial issues loaded from
issues.dat
- Client Changes: Edits and new issues saved to localStorage
- Smart Merging: Client changes overlay server data on app load
/* Light Mode */
--surface: #F1F5F9 /* Page background */
--surface-secondary: #FFFFFF /* Cards, panels */
--text-primary: #0F172A /* Main text */
--text-secondary: #334155 /* Supporting text */
/* Dark Mode */
--surface-dark: #1E293B /* Page background */
--surface-dark-secondary: #334155 /* Cards, panels */
--text-primary-dark: #F1F5F9 /* Main text */
--text-secondary-dark: #CBD5E1 /* Supporting text */
/* Status Colors */
--status-open: #3B82F6 /* Blue - needs attention */
--status-in-progress: #F59E0B /* Amber - work in progress */
--status-closed: #10B981 /* Green - completed */
- Mobile: < 640px (single column, stacked controls)
- Tablet: 640px - 768px (two columns, some controls hidden)
- Desktop: 768px+ (full table, all features visible)
The project uses a modular architecture with separation of concerns:
- Hooks: Business logic extracted into custom hooks
- Components: Focused, single-responsibility components
- Type Safety: Full TypeScript coverage with strict types
- Error Boundaries: Graceful error handling throughout
- New Hook: Create in
src/hooks/
and export fromindex.ts
- New Component: Create in
src/components/
with TypeScript interface - Styling: Use semantic tokens from
tailwind.config.ts
- State: Use appropriate hook (URL state, modal state, etc.)
- Memoization: Expensive operations wrapped in
useMemo
- Callbacks: Event handlers stabilized with
useCallback
- Code Splitting: Large components loaded separately
- Efficient Updates: Only changed data re-saved to localStorage
Custom design tokens defined in tailwind.config.ts
:
- Semantic color names
- Consistent spacing scale
- Animation presets
- Dark mode class strategy
- App Router enabled
- TypeScript strict mode
- Optimized builds
- Development hot reload
Dark mode not working?
- Check if JavaScript is enabled
- Clear localStorage:
localStorage.clear()
- Try hard refresh (Ctrl+Shift+R)
Search/filter not updating URL?
- Ensure JavaScript is enabled
- Check browser console for errors
- Try in incognito mode
Issues not persisting?
- Check localStorage quota
- Verify browser supports localStorage
- Check browser console for storage errors
- β Chrome 90+, Firefox 88+, Safari 14+, Edge 90+
- β Mobile: iOS Safari 14+, Chrome Mobile 90+
- β Internet Explorer (not supported)
This project is provided as-is for demonstration purposes.
This is a demonstration project, but suggestions and improvements are welcome:
- Focus on accessibility improvements
- Performance optimizations
- Additional keyboard shortcuts
- Enhanced mobile experience
- Better error handling
Built with β€οΈ using Next.js, TypeScript, and Tailwind CSS