Exam Prep Nigeria
# Nigerian Exam Prep (PWA)
An offline-first Progressive Web App for practising past questions for
**BECE**, **NECO**, and **JAMB** exams. Built with Vite + React + TypeScript,
Tailwind CSS, Zustand, React Router, and `vite-plugin-pwa`.
The app is designed to run fast on cheap Android phones (Tecno, Infinix) and
to work offline once the user installs it.
---
## Features
- **6 routes**: Home, Subjects, Years, Test Runner, Results, Dashboard
- **PWA install** with custom install banner (`InstallPrompt`)
- **Offline support** via Workbox service worker (cache-first for assets,
stale-while-revalidate for `data/questions.json`)
- **Dark mode** — auto / light / dark, persisted in `localStorage`
- **Progress tracking** — attempts, average score, weak topics, day streak
- **Timed tests** with auto-submit on expiry
- **Friendly empty state** when `data/questions.json` is not yet available
- **Mobile-first** — 44px minimum tap targets, large readable typography
## Tech stack
| Concern | Choice |
| -------------- | ----------------------------------------- |
| Bundler | Vite 5 |
| UI framework | React 18 + TypeScript 5 |
| Styling | Tailwind CSS 3 |
| State | Zustand 4 (persisted to `localStorage`) |
| Routing | React Router 6 |
| PWA / SW | `vite-plugin-pwa` (Workbox under the hood)|
| Fonts | Inter (Google Fonts) with system fallback |
## Project structure
```
exam-prep-ng/
├── index.html
├── package.json
├── postcss.config.js
├── tailwind.config.js
├── tsconfig.json
├── vite.config.ts
├── public/
│ ├── favicon.svg
│ ├── manifest.json
│ └── robots.txt
└── src/
├── App.tsx
├── main.tsx
├── components/
│ ├── InstallPrompt.tsx
│ ├── OptionButton.tsx
│ ├── ProgressRing.tsx
│ ├── QuestionCard.tsx
│ ├── Shell.tsx
│ └── Timer.tsx
├── data/
│ └── loader.ts
├── …