Repository navigation
ZGameLib (0.8.0)
·
15 commits
to main
since this release
[0.8.0] — 2026-03-19
Added
Collections (F-020)
- Collections page — create, rename, delete, and describe collections; grid/list view toggle; search bar to filter by name
- Collection description — click-to-edit description/notes field per collection; stored in
collections.description(backwards-compatibleALTER TABLE) - Collection detail view — click a collection to see its games with search and grid/list toggle
- Right-click context menu on collections — rename / delete directly from the collections page
- Game context menu → Collections submenu — right-click any game anywhere → hover Collections → submenu shows all collections with checkmarks; click to add or remove; a game can belong to multiple collections simultaneously
- Remove from Collection — when viewing a collection's game list, right-click a game → orange "Remove from Collection" option
- Batch operations → Add to Collection — select multiple games →
+ Collectionbutton in theBatchActionBar→ pick a collection to add all selected games at once - Full export v3 — export now includes
collectionsandcollection_gamesarrays; import is fully backwards-compatible (#[serde(default)]); old v1/v2 exports still import correctly
IGDB Metadata (F-006)
- Settings → Integrations — IGDB Client ID and Client Secret fields with a clear 6-step setup guide: create a Twitch Developer app at
dev.twitch.tv/console, set OAuth Redirect URL tohttp://localhost, set Category to Other, copy Client ID and Client Secret - Fetch IGDB button in Game Detail — fetches genre, developer, publisher, and release year for the open game; populates description if empty
- IGDB metadata card in Game Detail Info tab — shown when any IGDB field is present; modern 2×2 flex-wrap grid with custom SVG icons (gamepad · code · building · calendar) for each field; adapts to any panel width
- (i) info button in metadata card header — hover or click reveals: "Data sourced from IGDB by game name. If another title shares a similar name, the wrong match may have been returned"
- Clear IGDB data button (trash icon) in metadata card header — removes all IGDB fields and sets an
igdb_skippedflag on the game igdb_skippedflag (ALTER TABLE games ADD COLUMN igdb_skipped INTEGER) — persisted in SQLite; once set, the bulk scan silently skips the game and the individual fetch button shows a confirmation dialog before proceeding- Bulk IGDB scan button (sparkle icon) in library Topbar — fetches IGDB data for every game that has none and is not flagged; spins while running with a live
X/Ycounter badge; reloads the game list on completion; if no credentials are configured shows an error toast pointing to Settings → Integrations
Notes — Markdown Preview (I-026)
- Notes in Game Detail now have a per-note preview/edit toggle (eye and pencil SVG icons)
- Preview renders full Markdown using
react-markdown+rehype-sanitizewith prose styling
Tags — Undo Deletion (I-012)
- Removing a tag in Game Detail now starts a 5-second countdown instead of deleting immediately — tag shows strikethrough at 45% opacity with a
↩undo indicator - Click the pending tag to cancel the deletion; after 5 seconds the removal is committed
Statistics — Library Growth Chart (F-036)
- Library Growth section on the Stats page — stacked bar chart showing how many games were added per calendar month, bars colored by platform using the existing
PLATFORM_COLORS_HEXpalette, legend at the bottom; data comes from the newget_library_growthbackend command
Custom Theme Creator (F-041)
- Create Theme button in Settings → General → Theme — opens an inline editor to build a fully custom theme from scratch
- Accent color picker — native color input plus 14 preset swatches; HSL shade generation auto-derives all 8 accent levels (200–900) with a live shade strip preview
- Background and sidebar color pickers — 10 dark preset swatches; sidebar auto-derived from background with manual override
- Live preview — the entire app updates in real time as colors are adjusted; a miniature sidebar+content mockup is also shown in the editor
- Save, edit, delete — custom themes appear alongside built-in themes with hover controls (pencil to edit, trash to delete); stored in the
custom_themessettings key as JSON - Theme utility module (
src/lib/theme.ts) — shared HSL math, shade generation, and CSS variable injection used by both Settings and Layout
Unsaved Settings Guard (I-029)
- Dirty detection — Settings page tracks whether any field has changed since the last save using a JSON snapshot comparison
- Navigation interception — Sidebar and Command Palette check the dirty flag before navigating away from Settings; if unsaved changes exist, navigation is blocked and a modal appears
- Unsaved Changes modal — glass-morphism dialog with accent-colored info icon, spring animation, and two options: Discard (reverts to saved state and navigates) or Save & Leave (persists changes then navigates)
Fixed
- Collections submenu click closes context menu — root cause:
CollectionsSubmenuwas rendered viacreatePortaltodocument.body, which placed it outsidemenuRef's DOM tree; the outside-clickmousedownhandler detected submenu clicks as "outside" and closed the menu before the button registered. Fix: restorecreatePortal(needed sofixedpositioning works correctly outside thebackdrop-filterparent), adddata-ctx-submenu="true"attribute to the portaled div, and update the handler to checktarget.closest("[data-ctx-submenu]")before closing - Collections submenu not appearing on hover — root cause:
CollectionsSubmenuwas afixedchild of the main menu div which usesbackdrop-filter(viaglass-strong);backdrop-filtercreates a new CSS containing block forfixedchildren, so the submenu's viewport coordinates were applied relative to the parent, placing it off-screen. Fix: restoredcreatePortalso the submenu renders outside the backdrop-filter ancestor - IGDB metadata card swallowed / not resizing — removed
overflow-hiddenfrom the card wrapper (was clipping the tooltip and preventing content growth); replacedgrid grid-cols-2withflex flex-wrapwith percentage widths so cells reflow gracefully at any panel width; addedbreak-wordsto values
Changed
- Version bumped to 0.8.0
- Database additions (all backwards-compatible
ALTER TABLE):games.genre TEXTgames.developer TEXTgames.publisher TEXTgames.release_year INTEGERgames.igdb_skipped INTEGER NOT NULL DEFAULT 0- New table
collections (id, name, created_at, description) - New table
collection_games (collection_id, game_id)with cascade delete - New setting
custom_themes— JSON array of user-created themes (id, name, accent, bg, sidebar)