Skip to content

ZGameLib (0.8.0)

Choose a tag to compare

@TheHolyOneZ TheHolyOneZ released this 19 Mar 13:15
· 15 commits to main since this release
ad504a6

[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-compatible ALTER 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 → + Collection button in the BatchActionBar → pick a collection to add all selected games at once
  • Full export v3 — export now includes collections and collection_games arrays; 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 to http://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_skipped flag on the game
  • igdb_skipped flag (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/Y counter 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-sanitize with 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_HEX palette, legend at the bottom; data comes from the new get_library_growth backend 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_themes settings 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: CollectionsSubmenu was rendered via createPortal to document.body, which placed it outside menuRef's DOM tree; the outside-click mousedown handler detected submenu clicks as "outside" and closed the menu before the button registered. Fix: restore createPortal (needed so fixed positioning works correctly outside the backdrop-filter parent), add data-ctx-submenu="true" attribute to the portaled div, and update the handler to check target.closest("[data-ctx-submenu]") before closing
  • Collections submenu not appearing on hover — root cause: CollectionsSubmenu was a fixed child of the main menu div which uses backdrop-filter (via glass-strong); backdrop-filter creates a new CSS containing block for fixed children, so the submenu's viewport coordinates were applied relative to the parent, placing it off-screen. Fix: restored createPortal so the submenu renders outside the backdrop-filter ancestor
  • IGDB metadata card swallowed / not resizing — removed overflow-hidden from the card wrapper (was clipping the tooltip and preventing content growth); replaced grid grid-cols-2 with flex flex-wrap with percentage widths so cells reflow gracefully at any panel width; added break-words to values

Changed

  • Version bumped to 0.8.0
  • Database additions (all backwards-compatible ALTER TABLE):
    • games.genre TEXT
    • games.developer TEXT
    • games.publisher TEXT
    • games.release_year INTEGER
    • games.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)