Skip to content

Commit d046f69

Browse files
authored
Add files via upload
1 parent b757052 commit d046f69

20 files changed

Lines changed: 1000 additions & 305 deletions

CHANGELOG.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
11
# Changelog
22

3+
## [0.7.0] — 2026-03-18
4+
5+
### Fixed
6+
- **Tiny settings labels** — all `text-[10px]` instances in Settings replaced with `text-xs` for readable, consistent label sizing throughout the settings page
7+
- **Invalid platform/status saved silently**`update_game` now validates `platform` (must be `steam`, `epic`, `gog`, or `custom`) and `status` (must be `none`, `backlog`, `playing`, `completed`, `dropped`, or `on_hold`) and returns a descriptive error instead of persisting garbage values
8+
- **Import library accepts bad data**`import_library` now validates each game before inserting: skips entries with empty or >255 char names, ratings outside 0–10, and unrecognised platform strings
9+
- **Launcher threads run forever** — background process-polling threads for Steam/Epic/GOG/custom now have a hard 86 400-second (24-hour) cap; previously a game that never launched would leave a thread running indefinitely
10+
- **Batch status dropdown invisible on dark background** — the floating `BatchActionBar` status select now forces a dark background (`bg-[#1a1825]`) with matching dark option elements so the text is readable on all platforms
11+
- **Batch rating input shows number spinners** — the rating field in the batch action bar no longer renders browser-native up/down spinners; uses CSS to suppress them on all engines
12+
- **Batch rating not clamped** — entering a value outside 1–10 in the batch rating field is now rejected on every keystroke; the input clamps to `[1, 10]` immediately
13+
- **Export missing sessions and notes**`export_library` previously only exported games; the JSON export now uses a v2 `FullExport` envelope (`{ version, games, sessions, notes }`) so all play history and notes are preserved; `import_library` detects v1 (plain array) vs v2 automatically and restores sessions and notes, skipping any whose `game_id` no longer exists
14+
- **Playtime not recorded for short sessions** — three root causes fixed: GOG/custom process polling interval reduced from 30 s to 5 s; Steam/Epic `game_start` timer now begins only after the target PID is found (not at launch time, which inflated playtime by up to 3 minutes); sessions ≥ 30 seconds are now saved (previous threshold was > 0 minutes, silently dropping any session under 1 minute)
15+
- **Game card action buttons invisible on light covers** — overlay buttons changed from `bg-black/40` to `bg-black/70` with an explicit `border border-white/10 shadow-lg`, ensuring they are always legible regardless of cover brightness
16+
- **Fire icon appears squished**`FireIcon` completely redrawn as a proper three-layer SVG flame; size on game cards raised from 12 px to 18 px, and on list rows from 10 px to 15 px
17+
- **Spin wheel inner hub dominates the empty wheel** — removed the large dark center circle entirely; pie slices now extend from the exact center point, giving the wheel a clean look even with a single entry
18+
- **Spin wheel empty state spinner icon** — removed the decorative rotating icon from the empty state overlay; the empty state now shows text only
19+
- **Spin winner card pushes "Spin the Wheel" button upward** — the right panel is now split into a fixed top section (wheel + button, `shrink-0`) and a separate scrollable bottom section (winner card + history); the button never moves regardless of how much content appears below it
20+
- **Directory traversal in cover file copy**`set_game_cover` now rejects symlinks (via `symlink_metadata`), validates the file extension against an allowlist (`jpg`, `jpeg`, `png`, `webp`), and checks magic bytes before copying; previously any file path including sensitive system files could be copied into the app data directory
21+
- **N+1 query pattern in scanner** — Steam, Epic, and GOG scan loops previously fired one `SELECT` per discovered game to check for duplicates; each scanner now bulk-fetches all existing IDs into a `HashMap`/`HashSet` before the loop and does in-memory lookups, reducing scan overhead from O(n) queries to a single query per platform
22+
- **Playtime chart renders as a solid block** — the "Last 12 Weeks" chart used `preserveAspectRatio="none"` on its SVG, which stretched all bars to fill the full container width and merged them into an indistinguishable block; replaced with a div-based flexbox chart where bars grow from the bottom, labels show every other week, and a Framer Motion `scaleY` entrance animation staggers each bar in
23+
24+
### Added
25+
- **Command palette** (`Ctrl+K`) — centered overlay with a fuzzy search that matches any game by name; results show cover thumbnail and platform badge; keyboard navigation (↑ ↓ Enter Escape); also surfaces six quick actions (Add Game, Library, Favorites, Stats, Spin, Settings); `Ctrl+K` again or Escape closes it
26+
- **Batch multi-select** — hold-click the checkbox that appears on any game card (top-left, visible on hover) or list row to build a selection; a floating `BatchActionBar` slides up from the bottom showing the selection count, a status dropdown, a rating input, an "add tag" field, and a Delete button; all changes apply to every selected game in one transaction; × clears the selection
27+
- **Weekly playtime chart** — new "Playtime — Last 12 Weeks" SVG bar chart on the Stats page; each bar represents one ISO week; bars animate in on mount; hovering a bar shows the exact playtime and week label in a tooltip; data comes from the `sessions` table
28+
- **Lowest Rated section** — Stats page shows a ranked list of up to 5 games rated ≤ 4 with their scores highlighted in red
29+
- **Most Neglected section** — Stats page shows up to 5 games with zero recorded playtime, sorted by how long they have been in the library, with a "Added X days ago" label
30+
- **Screenshot lightbox navigation** — left / right chevron buttons let you page through all screenshots without closing the lightbox; an "X / Y" counter in the top-right corner tracks position; `ArrowLeft` / `ArrowRight` keyboard support added; navigation wraps around at both ends
31+
- **Playtime reminder on startup** — if Playtime Reminders is enabled in settings, the app checks on launch for the game you have not played in the longest time (minimum 30-day threshold); emits a toast-style notification with the game name and number of days since last session
32+
- **Window position and size memory** — the app saves the window's last position (`window_x`, `window_y`) and size (`window_width`, `window_height`) to the database on close and restores them exactly on next launch; only restores if coordinates are on-screen (≥ 0)
33+
- **Playtime Reminders toggle** — new toggle in Settings → Behavior; persisted as `playtime_reminders` in the settings table; defaults to enabled
34+
- **"Game Started" play button confirmation** — after clicking Play in the game detail panel, the button transitions to a green "Game Started" state with a checkmark for 3 seconds using `AnimatePresence`, giving clear visual feedback that the launch command was sent
35+
36+
### Changed
37+
- **Sidebar active link** now has a clear left-edge accent bar (`border-l-2 border-accent-500`) plus a subtle background fill and bold white text; previously only the text color changed on the active route
38+
- **Fire icon on high-rated games** now pulses with a Framer Motion breathing animation (scale 1 → 1.2 → 1, 2-second loop) on both game cards and list rows
39+
- **Game card hover overlay** buttons now stagger in (opacity 0→1, y 10→0) with a 50 ms per-button delay instead of appearing all at once
40+
- **Rating buttons on game cards** moved above the game title (previously rendered below the title, partially obscured by the status badge)
41+
- **Spin wheel clock tick marks** removed from the static overlay SVG; the outer ring and pointer triangle are kept; the wheel looks cleaner with no decorative minute-hand lines
42+
- Version bumped to **0.7.0**
43+
44+
45+
46+
47+
48+
49+
50+
---
51+
352
## [0.6.0] — 2026-03-17
453

554
### Fixed

README.md

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ Track, organize, rate and launch every game you own — Steam, Epic, GOG, and cu
1010
<p>
1111
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-7c3aed?style=flat-square" alt="MIT License"/></a>
1212
<img src="https://img.shields.io/badge/Platform-Windows%2010%2F11-0078D4?style=flat-square&logo=windows" alt="Windows"/>
13-
<img src="https://img.shields.io/badge/Version-0.6.0-22c55e?style=flat-square" alt="v0.6.0"/>
13+
<img src="https://img.shields.io/badge/Version-0.7.0-22c55e?style=flat-square" alt="v0.7.0"/>
1414
<a href="https://tauri.app"><img src="https://img.shields.io/badge/Built%20with-Tauri%202-FFC131?style=flat-square" alt="Tauri 2"/></a>
1515
<img src="https://img.shields.io/badge/React-18-61DAFB?style=flat-square&logo=react" alt="React 18"/>
1616
<img src="https://img.shields.io/badge/Rust-backend-CE422B?style=flat-square&logo=rust" alt="Rust"/>
1717
</p>
1818

1919
<p>
2020
<a href="https://zsync.eu/zgamelib/"><strong>🌐 Website</strong></a> &nbsp;·&nbsp;
21-
<a href="https://zsync.eu/zgamelib/app/ZGameLib_0.6.0_x64_en-US.msi"><strong>⬇ Download MSI</strong></a> &nbsp;·&nbsp;
22-
<a href="https://zsync.eu/zgamelib/app/ZGameLib_0.6.0_x64-setup.exe"><strong>⬇ Download EXE</strong></a> &nbsp;·&nbsp;
21+
<a href="https://zsync.eu/zgamelib/app/ZGameLib_0.7.0_x64_en-US.msi"><strong>⬇ Download MSI</strong></a> &nbsp;·&nbsp;
22+
<a href="https://zsync.eu/zgamelib/app/ZGameLib_0.7.0_x64-setup.exe"><strong>⬇ Download EXE</strong></a> &nbsp;·&nbsp;
2323
<a href="https://github.com/TheHolyOneZ/ZGameLib"><strong>GitHub</strong></a>
2424
</p>
2525

@@ -43,8 +43,8 @@ Track, organize, rate and launch every game you own — Steam, Epic, GOG, and cu
4343

4444
| Installer | Format | Notes |
4545
|-----------|--------|-------|
46-
| [ZGameLib_0.6.0_x64_en-US.msi](https://zsync.eu/zgamelib/app/ZGameLib_0.6.0_x64_en-US.msi) | `.msi` | **Recommended** — Windows Installer |
47-
| [ZGameLib_0.6.0_x64-setup.exe](https://zsync.eu/zgamelib/app/ZGameLib_0.6.0_x64-setup.exe) | `.exe` | NSIS alternative installer |
46+
| [ZGameLib_0.7.0_x64_en-US.msi](https://zsync.eu/zgamelib/app/ZGameLib_0.7.0_x64_en-US.msi) | `.msi` | **Recommended** — Windows Installer |
47+
| [ZGameLib_0.7.0_x64-setup.exe](https://zsync.eu/zgamelib/app/ZGameLib_0.7.0_x64-setup.exe) | `.exe` | NSIS alternative installer |
4848

4949
> **Windows SmartScreen:** On first launch you may see *"Windows protected your PC"* — click **More info → Run anyway**. This is expected for unsigned indie apps.
5050
@@ -133,6 +133,17 @@ Track, organize, rate and launch every game you own — Steam, Epic, GOG, and cu
133133
- **Exe health badge** — amber warning icon on cards when the executable is missing
134134
- Loading skeleton grid while library loads
135135

136+
**Command Palette** (`Ctrl+K`)
137+
- Centered overlay with fuzzy search across all game names
138+
- Results show cover thumbnail and platform badge; keyboard navigation (↑ ↓ Enter Escape)
139+
- Six built-in quick actions: Add Game · Library · Favorites · Stats · Spin · Settings
140+
141+
**Batch Multi-Select**
142+
- Checkbox appears top-left on game cards (visible on hover or when selected) and in list rows
143+
- Select multiple games; a **BatchActionBar** slides up from the bottom
144+
- Apply a status, set a rating (clamped 1–10), or add a tag to all selected games at once
145+
- Delete all selected games with one click; × clears the selection
146+
136147
**Weekly Playtime Goal**
137148
- Set a weekly playtime target in hours at the top of the Library page
138149
- Animated progress bar with current week's playtime
@@ -213,7 +224,7 @@ A slide-in drawer (500 px wide) that opens without navigating away from your lib
213224
**Screenshots Tab** *(label shows count, e.g. "Screenshots (6)")*
214225
- Fetches all Steam screenshots for the game
215226
- Masonry grid layout
216-
- Full-screen lightbox
227+
- Full-screen lightbox with left / right navigation, "X / Y" counter, and `ArrowLeft` / `ArrowRight` keyboard support
217228
- Per-screenshot actions: Copy Path · Open File · Open Folder · Export
218229

219230
**History Tab** *(label shows count, e.g. "History (3)")*
@@ -348,6 +359,9 @@ All stat cards are **clickable** — each navigates to the Library with the rele
348359
- **Rating distribution** — horizontal bar chart showing game count per rating (1–10)
349360
- **Completion rate** — circular SVG progress ring (completed / total)
350361
- **Top 5 rated games** — ranked list with cover thumbnails and star display
362+
- **Playtime — Last 12 Weeks** — bar chart grouped by ISO week; bars grow from bottom with staggered entrance animation; hover for exact hours; weeks labeled every other column to avoid crowding
363+
- **Lowest Rated** — up to 5 games with a rating ≤ 4, scores highlighted in red
364+
- **Most Neglected** — up to 5 games with zero recorded playtime, sorted by time in library, with "Added X days ago" label
351365
- Staggered entrance animations
352366

353367
</td>
@@ -415,6 +429,8 @@ All themes are implemented as **CSS custom properties** (`--accent-200` through
415429
- **Close to tray** — ✕ hides the window rather than exiting
416430
- **Launch on Windows startup** — writes `HKEY_CURRENT_USER\...\Run\ZGameLib` via the Windows registry
417431
- **Start minimized** — launches directly to tray without showing the window
432+
- **Window position memory** — window position and size are saved on close and restored exactly on next launch
433+
- **Playtime reminder** — on startup, a notification is shown if your longest-neglected game (≥ 30 days since last play) is detected; can be toggled off in Settings → Behavior
418434

419435
---
420436

@@ -443,8 +459,9 @@ All themes are implemented as **CSS custom properties** (`--accent-200` through
443459
| <kbd>/</kbd> | Focus the search bar on any page |
444460
| <kbd>N</kbd> | Open the Add Game modal |
445461
| <kbd>F</kbd> | Toggle favorite on the currently open game |
446-
| <kbd>Escape</kbd> | Close the detail panel or any overlay |
462+
| <kbd>Escape</kbd> | Close the detail panel, command palette, or any overlay |
447463
| <kbd>?</kbd> | Show / hide the keyboard shortcuts help overlay |
464+
| <kbd>Ctrl</kbd> + <kbd>K</kbd> | Open the command palette (fuzzy game search + 6 quick actions) |
448465
| <kbd>Ctrl</kbd> + <kbd>Enter</kbd> | Save a new note in the notes editor |
449466

450467
---
@@ -595,7 +612,7 @@ All themes are implemented as **CSS custom properties** (`--accent-200` through
595612
games: Game[]
596613
selectedGameId: string | null
597614
search: string
598-
sortKey: 'name' | 'rating' | 'last_played' | 'date_added' | 'playtime_mins'
615+
sortKey: 'name' | 'rating' | 'last_played' | 'date_added' | 'playtime_mins' | 'sort_order'
599616
sortAsc: boolean
600617
viewMode: 'grid' | 'list'
601618
filters: {
@@ -607,12 +624,14 @@ filters: {
607624
}
608625
hiddenIds: string[] // duplicate-hidden game IDs
609626
showHidden: boolean // toggle visibility of hidden games
627+
selectedIds: string[] // batch multi-select
610628

611629
// Actions
612630
setGames · updateGame · removeGame · addGame
613631
setSelectedGameId · setSearch · setSortKey · setSortAsc
614632
setViewMode · setFilter · resetFilters
615633
hideGames · toggleShowHidden · restoreAllHidden
634+
toggleSelected · clearSelected
616635
```
617636

618637
</details>
@@ -631,6 +650,7 @@ customStatuses: StatusConfig[] // user-defined status list
631650
logs: LogEntry[] // max 500 entries, levels: info | ok | warn | error
632651
logPanelOpen: boolean
633652
pendingUpdate: Update | null
653+
isCommandPaletteOpen: boolean // Ctrl+K overlay
634654

635655
// Actions
636656
addToast · removeToast
@@ -639,6 +659,7 @@ openConfirm · closeConfirm
639659
setCustomStatuses
640660
addLog · clearLogs · setLogPanelOpen
641661
setPendingUpdate
662+
setCommandPaletteOpen
642663
```
643664

644665
</details>
@@ -716,6 +737,7 @@ Index: `game_id`
716737
| `start_minimized` | `true` \| `false` | `false` | Launch to tray silently |
717738
| `close_to_tray` | `true` \| `false` | `true` | ✕ hides rather than exits |
718739
| `autostart` | `true` \| `false` | `false` | Register in Windows startup |
740+
| `playtime_reminders` | `true` \| `false` | `true` | Show neglected-game reminder on startup |
719741

720742
---
721743

@@ -808,8 +830,9 @@ ZGameLib/
808830
│ │ │
809831
│ │ ├── library/
810832
│ │ │ ├── GameCard.tsx # 3:4 cover, overlay Play/Fav/Folder, platform badge, 🔥 on ≥8
811-
│ │ │ ├── GameGrid.tsx # Responsive CSS grid, handles both view modes
833+
│ │ │ ├── GameGrid.tsx # Responsive CSS grid, handles both view modes + BatchActionBar
812834
│ │ │ ├── GameListRow.tsx # Compact row: thumbnail, name+status, tags, playtime, rating
835+
│ │ │ ├── BatchActionBar.tsx # Floating bottom bar for batch status/rating/tag/delete actions
813836
│ │ │ ├── PinnedRow.tsx # Horizontal strip of pinned games shown above the main grid
814837
│ │ │ └── RecentlyPlayed.tsx # Horizontal scrollable carousel (max 12 games)
815838
│ │ │
@@ -829,6 +852,7 @@ ZGameLib/
829852
│ │ ├── StarRating.tsx # Interactive 10-star rating widget
830853
│ │ ├── Icons.tsx # 40+ custom SVG icons
831854
│ │ ├── GameContextMenu.tsx # Right-click portal menu: Play, Folder, Fav, Pin, Copy, Details
855+
│ │ ├── CommandPalette.tsx # Ctrl+K overlay: fuzzy game search + 6 quick actions
832856
│ │ ├── Toast.tsx # Bottom-right toasts (3.5 s auto-dismiss, max visible)
833857
│ │ ├── LogPanel.tsx # Right-side scan log (max 500 entries, auto-scroll)
834858
│ │ ├── EmptyState.tsx # Centered placeholder with action button
@@ -915,8 +939,8 @@ Output directory: `src-tauri/target/release/bundle/`
915939

916940
```
917941
bundle/
918-
├── msi/ ZGameLib_0.6.0_x64_en-US.msi
919-
└── nsis/ ZGameLib_0.6.0_x64-setup.exe
942+
├── msi/ ZGameLib_0.7.0_x64_en-US.msi
943+
└── nsis/ ZGameLib_0.7.0_x64-setup.exe
920944
921945
```
922946

image.png

78.5 KB
Loading

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "zgamelib",
33
"private": true,
4-
"version": "0.6.0",
4+
"version": "0.7.0",
55
"type": "module",
66
"scripts": {
77
"dev": "cargo tauri dev",

0 commit comments

Comments
 (0)