update readme

This commit is contained in:
2025-08-17 13:36:00 +01:00
parent ae3daf783e
commit adac2a4a99

View File

@@ -3,10 +3,15 @@
A Next.js web app to browse every English Magikarp Pokémon card with images, set symbols, search, set filter, and a personal checklist stored in your browser. A Next.js web app to browse every English Magikarp Pokémon card with images, set symbols, search, set filter, and a personal checklist stored in your browser.
## Features ## Features
- **Checklist**: Mark cards as collected (stored in `localStorage`). - **Checklist (variants-aware)**: Track base, holofoil, and reverse holofoil per card. Local persistence with migration from v1 to v2.
- **Card images**: Uses official images from `images.pokemontcg.io`. - **Card images**: Uses official images from `images.pokemontcg.io`.
- **Set symbols**: Displays set symbol and series/name. - **Set symbols**: Displays set symbol and series/name.
- **Search & filter**: Search by name/number/rarity/set and filter by set. - **Search & filter**: Search by name/number/rarity/set and filter by set.
- **Totals include variants**: The header and tab badges use variant totals (base + available variants) for collected/uncollected counts.
- **Sort by release date**: Cards are ordered by set release date (oldest first).
- **Caching with TTL**: Server route caches card data to `data/cards.json` with a 24h TTL and a manual refresh button.
- **Cached/Live indicator**: Header shows whether data came from cache or a live fetch, with last updated timestamp.
- **Non-blocking error toast**: Refresh errors show a short-lived toast without disrupting the current view.
- **Responsive UI**: Tailwind CSS, mobile-friendly grid. - **Responsive UI**: Tailwind CSS, mobile-friendly grid.
## Tech Stack ## Tech Stack
@@ -63,7 +68,8 @@ magikarp-collection/
├─ src/ ├─ src/
│ ├─ app/ │ ├─ app/
│ │ ├─ api/ │ │ ├─ api/
│ │ │ ─ magikarp/route.ts # API route that fetches cards from Pokémon TCG API │ │ │ ─ magikarp/route.ts # API route with 24h TTL cache (data/cards.json)
│ │ │ └─ checklist/route.ts # Server-backed checklist persistence (optional)
│ │ ├─ layout.tsx # Root layout and global wrapper │ │ ├─ layout.tsx # Root layout and global wrapper
│ │ ├─ page.tsx # Main page: search, set filter, grid, checklist │ │ ├─ page.tsx # Main page: search, set filter, grid, checklist
│ │ └─ globals.css # Tailwind entry + global styles │ │ └─ globals.css # Tailwind entry + global styles
@@ -75,12 +81,17 @@ magikarp-collection/
│ │ └─ SetFilter.tsx # Dropdown to filter by set │ │ └─ SetFilter.tsx # Dropdown to filter by set
│ ├─ lib/ │ ├─ lib/
│ │ ├─ api.ts # Axios client for Pokémon TCG API │ │ ├─ api.ts # Axios client for Pokémon TCG API
│ │ ─ checklist.ts # localStorage-backed checklist utils │ │ ─ checklist.ts # Checklist utils (local + server-backed)
│ │ └─ currency.ts # Price formatting + exchange rate hook
│ └─ types/ │ └─ types/
│ └─ pokemon.ts # TypeScript types for cards/sets │ └─ pokemon.ts # TypeScript types for cards/sets
├─ data/ # Local cache for cards/checklist JSON (gitignored)
├─ next.config.ts # Remote image domains, turbopack settings ├─ next.config.ts # Remote image domains, turbopack settings
├─ tsconfig.json # TS config with path alias '@/*' ├─ tsconfig.json # TS config with path alias '@/*'
├─ postcss.config.cjs # Tailwind v4 PostCSS plugin config ├─ postcss.config.cjs # Tailwind v4 PostCSS plugin config
├─ Dockerfile # Multi-stage Docker build (standalone output)
├─ docker-compose.yml # Compose with APP_PORT and data volume
├─ .dockerignore # Reduce build context
├─ package.json ├─ package.json
└─ .env.local.example # Example env file └─ .env.local.example # Example env file
``` ```
@@ -91,10 +102,29 @@ magikarp-collection/
- API key header: `X-Api-Key: <your key>` (automatically added when `NEXT_PUBLIC_POKEMON_TCG_API_KEY` is present) - API key header: `X-Api-Key: <your key>` (automatically added when `NEXT_PUBLIC_POKEMON_TCG_API_KEY` is present)
## How It Works ## How It Works
- The client loads data from the internal Next.js route `GET /api/magikarp` (`src/app/api/magikarp/route.ts`). - The client loads data from `GET /api/magikarp` (`src/app/api/magikarp/route.ts`).
- The route proxies to the Pokémon TCG API using `fetchMagikarpCards()` (`src/lib/api.ts`). - The route proxies to Pokémon TCG API using `fetchMagikarpCards()` (`src/lib/api.ts`), caches the full response in `data/cards.json`, and serves cached data when fresh (<24h) unless `?refresh=1` is provided.
- Cards are displayed in `CardGrid`/`CardItem` with images and set symbols (`SetBadge`). - Cards render in `CardGrid`/`CardItem`, ordered by set release date.
- Checklist state is persisted locally via `localStorage` (`src/lib/checklist.ts`). - Checklist persists locally (v2 supports variant-level tracking). A server-backed route exists at `api/checklist` if you enable it.
## Docker
Build and run using Docker/Compose. The container listens on port 3000 internally; pick a host port via `APP_PORT`.
### Build and run
```bash
# Default host port 3000
docker compose up --build
# Custom host port
APP_PORT=8080 docker compose up --build
```
Open: http://localhost:3000 (or your chosen `APP_PORT`).
### Volumes and data
- The `./data` directory is mounted to `/app/data` in the container so cached JSON persists between restarts.
- `data/cards.json` and `data/checklist.json` are gitignored by default.
## Deployment ## Deployment
- **Vercel**: Zero-config for Next.js. Add `NEXT_PUBLIC_POKEMON_TCG_API_KEY` in project Environment Variables. - **Vercel**: Zero-config for Next.js. Add `NEXT_PUBLIC_POKEMON_TCG_API_KEY` in project Environment Variables.