A Next.js application for tracking and calculating scores for gardening competition participants across multiple categories.
-
7 Competition Categories:
- Cut flowers
- Roses
- Vege
- fruit
- Pots&Containers
- Floral
- Home baking
-
Scoring System:
- 1st Place: 3 points
- 2nd Place: 2 points
- 3rd Place: 1 point
-
Dynamic Entry Management: Add or remove entries for each category
-
Real-time Leaderboard: Automatically calculates and updates participant scores
-
Print to PDF: Generate professional printable results with overall winners, score breakdowns, and category details
-
Local Storage Persistence: All data is automatically saved to browser storage
-
Responsive Design: Works on desktop, tablet, and mobile devices
-
Detailed Breakdown: View score breakdowns by category for each participant
npm installnpm run devOpen http://localhost:3000 in your browser to see the application.
npm run build
npm start- Enter Participant Names: Type participant names in the 1st, 2nd, or 3rd place columns
- Multiple Winners: Enter multiple names separated by spaces or commas
- Add Entries: Click the "Add Entry" button to add more entries to a category
- Remove Entries: Click the trash icon to remove an entry
- View Leaderboard: The leaderboard updates automatically as you type
- Detailed Scores: Click "View Detailed Breakdown" to see category-by-category scores
- Print Results: Click "Print Results to PDF" to generate a professional printable document with overall winners, participant breakdowns, and category details
- Framework: Next.js 16 with App Router
- Language: TypeScript 5
- Runtime: React 19
- Styling: Tailwind CSS v4
- UI Components: shadcn/ui
- Icons: Lucide React
- State Management: React Hooks + localStorage
garden/
├── app/
│ ├── layout.tsx # Root layout with metadata
│ ├── page.tsx # Main page with all categories
│ └── globals.css # Global styles
├── components/
│ ├── CategoryTable.tsx # Individual category table
│ ├── Leaderboard.tsx # Real-time leaderboard
│ ├── PrintableResults.tsx # Printable PDF results format
│ └── ui/ # shadcn/ui components
├── lib/
│ ├── types.ts # TypeScript interfaces
│ ├── scoring.ts # Score calculation logic
│ └── utils.ts # Utility functions
└── hooks/
└── useLocalStorage.ts # localStorage persistence hook
All competition data is automatically saved to browser localStorage with the key garden-competition-data. The data persists across page refreshes but is specific to the browser being used.
MIT