add series grouping, cover upload, and multi-zip download to games library

- Series grouping: a top-level folder with no .zip but game subfolders is
  now treated as a GameSeries. Clicking a series drills into it with a
  breadcrumb; a game-count badge distinguishes series cards from game cards.
  Series fall back to the first game's cover when no series-level cover exists.
- Cover upload: new POST /api/game-cover endpoint writes cover.jpg or
  widecover.jpg directly into the game/series folder (re-encoded via sharp).
  A kebab menu on GameDetailModal opens an Edit Images panel showing previews
  and upload/replace buttons for both cover and wide cover.
- Multi-zip download: Game.zipFiles replaces zipPath and includes all .zip
  files in the folder. A single zip shows the existing download button; multiple
  zips render a split button — primary action downloads the first file, a
  dropdown arrow lists all files by name.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Garret Patti
2026-04-05 12:49:42 -04:00
parent b254907cca
commit 122d7aa332
5 changed files with 739 additions and 160 deletions

View File

@@ -13,7 +13,15 @@ export interface Game {
title: string
coverUrl: string | null
wideCoverUrl: string | null
zipPath: string
zipFiles: string[]
}
export interface GameSeries {
id: string
title: string
coverUrl: string | null
wideCoverUrl: string | null
games: Game[]
}
export type MediaType = 'video' | 'image' | 'other'