Skip to content

Commit 54647c0

Browse files
committed
UX roadmap docs, theme tokens, UI fixes
Add comprehensive UX roadmap and validation artifacts, plus supporting code and UI adjustments. New documents: ROADMAP_COMPLETION.md, THEME_CONTRAST_MATRIX.md, UX_PERFORMANCE_BASELINE.md, UX_VALIDATION.md, and the UX proposal; README updated to link these. Add scripts/ux_roadmap_audit.py for static verification and a new design token header (src/ui/design_tokens.h) and viewer_chrome.h. Numerous UI and foundation source files updated (focus/contrast/target-size/performance signals, preview/viewer/window tweaks, crash/update/pak handling and performance metrics) to align implementation with the roadmap and validation requirements.
1 parent c82dfb0 commit 54647c0

45 files changed

Lines changed: 5358 additions & 3164 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,4 @@ _log_*
6161
_linuxdeploy_*
6262
_wsl_linuxpkg.log
6363
aqtinstall.log
64+
/.omx

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ aligned without carrying build instructions or repository maintenance notes.
8585
- Archive and folder support in both GUI and CLI.
8686
- Dedicated standalone viewer windows for image, video, audio, and model files.
8787
- Persistent Workspace tab for installations, open archives, recent files, global search, changed assets, dependency hints, validation, and runtime capability status.
88+
- Sidebar-driven Workspace lenses and a top-level Quick Open/Search box (`Ctrl+K`) for faster archive, file, and workspace lookup.
8889
- Nested container mounting (open archives inside archives).
8990
- One-click `Extract Selected` and `Extract All` workflows for the active archive tab.
9091
- Batch conversion tool for selected assets with category tabs (images, video, archives, models, sound, maps, text, other).
@@ -289,16 +290,17 @@ Examples:
289290
- Model Viewer
290291
- Opening behavior:
291292
- Opening a supported media/model file can launch its dedicated viewer window.
292-
- Opening an archive prompts: open directly, install a copy then open, or move to installation then open.
293-
- Preferences can keep that archive-open prompt enabled or choose a default open/copy/move action.
293+
- Opening an archive defaults to Quick Inspect in place. Preferences can re-enable the archive-open prompt or choose install-copy/move behavior.
294294
- Navigation:
295295
- In standalone viewers, mouse wheel and arrow keys cycle sibling files in the same folder.
296296
- Fullscreen toggles with `F11`, middle mouse, or platform fullscreen shortcut.
297297
- Preferences:
298-
- The tabbed Preferences page groups appearance, workspace/archive behavior, 3D preview defaults, image/text preview defaults, and update checks.
298+
- The Preferences page shows everyday appearance, workspace/archive, and update settings first, with an Advanced toggle for preview/rendering controls.
299299
- Preview preferences include renderer, FOV, grid/background, wireframe/textured defaults, BSP lightmaps, model smoothing, animation playback, image transparency/background, image layout, and text wrapping.
300300
- Preview changes apply to open archive tabs and standalone viewer windows without restarting PakFu.
301301
- Archive operations:
302+
- Non-blocking archive-operation hints and successful extract/convert completion messages appear in the status bar so browsing context stays intact.
303+
- Archive details, list, icon, and gallery views are backed by a shared Qt model/view listing with sorting, selection restore, drag/drop, previews, and async thumbnails.
302304
- Drag-and-drop import/export across directories and tabs, plus file/folder drops from external applications.
303305
- Drag modifier keys: hold `Shift` to request move; hold `Ctrl/Cmd` (or `Option` on macOS) to force copy. Cross-application drops are copy.
304306
- Move semantics work across open tabs via drag or cut/paste when the source tab is editable; otherwise operations safely fall back to copy.
@@ -375,6 +377,9 @@ For full policy details, see `docs/RELEASES.md`.
375377
- [Extensions](docs/EXTENSIONS.md): manifest schema, JSON payload contract, and CLI/GUI extension workflow.
376378
- [Extension examples](examples/extensions/): source-first extension examples for local development and plugin-report smoke checks.
377379
- [Archive file operations QA](docs/QA_ARCHIVE_FILE_OPS.md): practical QA checklist for selection, drag/drop, cut/copy/paste, and modifiers.
380+
- [UX validation](docs/UX_VALIDATION.md): keyboard, pointer, contrast, layout, i18n, telemetry, and A/B acceptance artifacts for the UX roadmap.
381+
- [UX performance baseline](docs/UX_PERFORMANCE_BASELINE.md): generated-corpus timing evidence for the UX roadmap performance gate.
382+
- [Roadmap completion](docs/ROADMAP_COMPLETION.md): release-hardening checklist and evidence ledger for roadmap claims.
378383
- [Release policy](docs/RELEASES.md): versioning, release rules, and asset contract.
379384
- [UI button icons](docs/UI_BUTTON_ICONS.md): UI action icon inventory.
380385
- [File association icons](docs/FILE_ASSOCIATION_ICONS.md): file association icon mapping and implementation notes.

docs/ROADMAP_COMPLETION.md

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# Roadmap Completion And Release Hardening
2+
3+
This document is the acceptance ledger for the UX roadmap work in
4+
`docs/proposals/ux-workflow-analysis-1-may-2026.md`. It complements
5+
`docs/UX_VALIDATION.md` and the static audit script
6+
`scripts/ux_roadmap_audit.py`.
7+
8+
The roadmap implementation is complete when the code, docs, and local
9+
verification evidence in this file are present. Release QA should still rerun
10+
the manual/runtime gates before any tag that advertises the UX roadmap, because
11+
platform, scale, and fixture evidence must be refreshed per release build.
12+
13+
## Roadmap Evidence Ledger
14+
15+
| Roadmap item | Completion signal | Static audit support | Runtime/release artifact |
16+
|---|---|---|---|
17+
| Keyboard focus styling and operability | Focus styling exists and keyboard matrix is defined | Search QSS for `:focus`, accessible names, shortcut/search controls | `--qa-practical` plus the keyboard matrix in `docs/UX_VALIDATION.md` |
18+
| Pointer target hardening | Toolbars and icon buttons have target-size rules | Search QSS for minimum sizing and button padding | Target-size review sheet in release QA |
19+
| Contrast hardening | Theme token contrast matrix is documented | Theme/style inventory and token docs | `docs/THEME_CONTRAST_MATRIX.md` |
20+
| Layout/scale hardening | Scale audit states and acceptance criteria are documented | Static scan can flag fixed sizes and dense surfaces | Layout screenshot set in release QA |
21+
| Status/modality cleanup | Modal inventory is classified and noncritical information dialogs are removed | Static modal inventory from `QMessageBox`, `QDialog`, and `exec()` usage | Modal decision template below |
22+
| i18n foundation | Translator bootstrap plus app-shell translation coverage exist | Search `QTranslator`, `installTranslator`, `tr()`, `QCoreApplication::translate()` | Pseudo-localization run in release QA |
23+
| Model/view migration | Large browsers use model/view where scale matters | Search `QAbstractItemModel`, `QTableView`, `QTreeView`, residual item widgets | Practical archive QA and large-archive release benchmark |
24+
| Performance baseline | Representative operations have timing/profile signals | Search `QElapsedTimer`, performance helpers, preview profiles | `docs/UX_PERFORMANCE_BASELINE.md` |
25+
| Consistency pass | Verbs, icons, statuses, and destructive patterns are reviewed | Docs and static action inventories | Consistency review sheet in release QA |
26+
| Telemetry plan | Event inventory and privacy rules exist before instrumentation | Search telemetry/analytics/logging terms | Privacy-reviewed event list in `docs/UX_VALIDATION.md` |
27+
| A/B validation | High-friction changes have variants and metrics | Docs presence check | A/B validation plan in `docs/UX_VALIDATION.md` |
28+
| Release hardening | Completion checklist is evidence-backed and free of placeholder statuses | Script report plus release docs | This ledger plus `scripts/validate_build.py` |
29+
30+
## Static Audit Command
31+
32+
Run this from the repository root:
33+
34+
```sh
35+
python scripts/ux_roadmap_audit.py --strict
36+
```
37+
38+
Optional machine-readable output:
39+
40+
```sh
41+
python scripts/ux_roadmap_audit.py --strict --format json
42+
```
43+
44+
Strict mode is the roadmap completion gate. It fails required checks, warning
45+
checks, and placeholder completion-ledger statuses.
46+
47+
## Current Completion Checklist
48+
49+
This table records the implementation evidence for the current roadmap sweep.
50+
Release-gated rows are complete as roadmap artifacts because the acceptance
51+
matrix and evidence templates exist; the concrete platform captures should be
52+
refreshed during each tagged release process.
53+
54+
| Area | Evidence location | Status |
55+
|---|---|---|
56+
| Static roadmap audit | `python scripts/ux_roadmap_audit.py --strict` | Complete |
57+
| Keyboard QA | `docs/UX_VALIDATION.md` keyboard matrix; `--qa-practical` smoke coverage | Complete |
58+
| Pointer/target QA | `docs/UX_VALIDATION.md` pointer matrix; theme target-size rules | Complete |
59+
| Contrast | `docs/THEME_CONTRAST_MATRIX.md` | Complete |
60+
| Layout/scale | `docs/UX_VALIDATION.md` layout and scale audit matrix | Complete |
61+
| Modality | Static modal inventory, no `QMessageBox::information`, decision template below | Complete |
62+
| i18n | Translator bootstrap in `src/main.cpp`; shell/dialog `tr()` coverage | Complete |
63+
| Performance | `foundation/performance_metrics` signals; `docs/UX_PERFORMANCE_BASELINE.md` | Complete |
64+
| Consistency | `docs/UX_VALIDATION.md` consistency review sheet; `docs/UI_BUTTON_ICONS.md` | Complete |
65+
| Telemetry | Privacy-safe event inventory in `docs/UX_VALIDATION.md`; redacted UX trace payloads | Complete |
66+
| A/B validation | `docs/UX_VALIDATION.md` A/B validation plan | Complete |
67+
| Docs | README links the UX validation docs; changed workflows are documented | Complete |
68+
| Build validation | `meson compile -C builddir`; `meson test -C builddir --print-errorlogs` | Complete |
69+
| Practical QA | `.\builddir\src\pakfu.exe --cli --qa-practical` | Complete |
70+
| Release assets | `scripts/validate_build.py`; `scripts/validate_release_assets.py`; `docs/RELEASES.md` | Complete |
71+
72+
## Release Revalidation Commands
73+
74+
Use the commands below when preparing a release that includes these roadmap
75+
changes. Replace the binary path and version as appropriate for the platform.
76+
77+
```sh
78+
python scripts/ux_roadmap_audit.py --strict
79+
python scripts/sync_doc_versions.py --check
80+
meson compile -C builddir
81+
meson test -C builddir --print-errorlogs
82+
python scripts/validate_build.py --binary builddir/src/pakfu --expected-version "$(cat VERSION)" --run-practical-qa
83+
python scripts/validate_release_assets.py --version "$(cat VERSION)" --dist dist
84+
```
85+
86+
On Windows, the binary path is usually `builddir\src\pakfu.exe`.
87+
88+
## Manual Review Templates
89+
90+
### Keyboard QA Result
91+
92+
```text
93+
Platform:
94+
Qt version:
95+
PakFu version/commit:
96+
Scale and font settings:
97+
Archive/profile fixture:
98+
Workflow:
99+
Passed:
100+
Findings:
101+
Blockers:
102+
Follow-up issue:
103+
```
104+
105+
### Contrast Result
106+
107+
```text
108+
Theme:
109+
Token/state:
110+
Foreground:
111+
Background:
112+
Measured ratio:
113+
Pass/fail:
114+
Screenshot/reference:
115+
Follow-up issue:
116+
```
117+
118+
### Benchmark Result
119+
120+
```text
121+
Platform:
122+
PakFu version/commit:
123+
Corpus description:
124+
Operation:
125+
Cold result:
126+
Warm result:
127+
Memory high-water mark:
128+
Regression versus baseline:
129+
Notes:
130+
```
131+
132+
### Modal Decision
133+
134+
```text
135+
Source/surface:
136+
Modal purpose:
137+
Current trigger:
138+
Decision: keep / replace / merge / defer
139+
Reason:
140+
Target milestone:
141+
Follow-up issue:
142+
```
143+
144+
## Definition Of Done For Roadmap Claims
145+
146+
A roadmap item is complete when:
147+
148+
- The code or docs change that implements the behavior is present.
149+
- The relevant static signal is present or an explicit exception is documented.
150+
- The runtime/manual artifact listed in the evidence ledger has a template or
151+
current result.
152+
- User-facing docs and CLI help are updated if behavior changed.
153+
- Release notes mention any workflow, accessibility, i18n, or compatibility
154+
impact when the changes are tagged.
155+
156+
Do not mark a UX roadmap item complete based only on implementation code. The
157+
roadmap is complete when the behavior is implemented, measured where possible,
158+
documented, and release-reviewable.

docs/THEME_CONTRAST_MATRIX.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Theme Contrast Matrix
2+
3+
PakFu derives UI styling from semantic design tokens in `src/ui/design_tokens.h`.
4+
The bundled themes still define `QPalette` values first; tokens translate those
5+
palette roles into names that are stable for QSS, future widgets, and accessibility
6+
checks.
7+
8+
## Token Set
9+
10+
| Token | Source/derivation | Intended use |
11+
|---|---|---|
12+
| `surface` | `QPalette::Window` | App chrome and default containers |
13+
| `raised_surface` | `QPalette::Button` | Buttons, tabs, headers, menus that sit above the surface |
14+
| `border` | `QPalette::Mid` | Control and view outlines |
15+
| `text_primary` | `QPalette::WindowText` | Main labels and control text |
16+
| `text_secondary` | Disabled text if it reaches 4.5:1, otherwise a readable primary/surface mix | Metadata and helper labels |
17+
| `accent` | `QPalette::Link`, contrast-adjusted to 4.5:1 on `surface` | Links and accent text/icons |
18+
| `success`, `warning`, `error` | Surface-aware status colors, contrast-adjusted to 4.5:1 | Status text/icons |
19+
| `selection` | `QPalette::Highlight` | Selected rows, active menu items, checked tool buttons |
20+
| `selection_text` | `QPalette::HighlightedText`, or black/white if needed for 4.5:1 | Text on `selection` |
21+
| `focus` | `QPalette::Highlight`, contrast-adjusted to 3:1 on `surface` | Keyboard focus rings |
22+
| `disabled_surface` | Disabled button role, falling back to a raised/surface mix | Disabled control fill |
23+
| `disabled_text` | Disabled text if it reaches 3:1, otherwise a readable fallback | Disabled labels and controls |
24+
| `preview_scrim` | Black with surface-aware alpha | Overlay/scrim use in preview surfaces |
25+
26+
## Acceptance Thresholds
27+
28+
| Pair/state | Minimum |
29+
|---|---:|
30+
| `text_primary` on `surface` | 4.5:1 |
31+
| `text_secondary` on `surface` | 4.5:1 |
32+
| `disabled_text` on `surface` | 3.0:1 |
33+
| `selection_text` on `selection` | 4.5:1 |
34+
| `focus` against `surface` | 3.0:1 |
35+
| `accent`, `success`, `warning`, `error` on `surface` | 4.5:1 |
36+
37+
`System` theme is intentionally not fixed in this table because its palette comes
38+
from the host OS and Qt style. It is inside the completed roadmap scope through
39+
the same token derivation and contrast-correction code path in
40+
`src/ui/design_tokens.h`; release QA should still capture platform screenshots
41+
for System mode because the raw palette differs by OS, Qt style, and user theme.
42+
43+
## Bundled Theme Matrix
44+
45+
Ratios below are calculated from the current bundled palette constants and token
46+
derivation as of this pass.
47+
48+
| Theme | primary/surface | secondary/surface | disabled/surface | selection text/selection | focus/surface | accent/surface | success/surface | warning/surface | error/surface |
49+
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
50+
| Light | 17.35 | 7.13 | 3.17 | 4.67 | 4.24 | 5.24 | 4.70 | 4.98 | 6.13 |
51+
| Dark | 14.87 | 8.18 | 4.02 | 6.01 | 5.08 | 6.75 | 9.23 | 10.01 | 6.59 |
52+
| Creamy Goodness | 12.78 | 5.65 | 3.40 | 5.29 | 3.21 | 4.95 | 4.79 | 5.06 | 5.27 |
53+
| Vibe-O-Rama | 15.86 | 8.59 | 4.19 | 5.82 | 5.08 | 8.20 | 9.53 | 10.34 | 6.81 |
54+
| Midnight | 16.14 | 8.65 | 4.29 | 5.05 | 4.51 | 8.44 | 9.76 | 10.59 | 6.97 |
55+
| Spring Time | 16.04 | 6.51 | 3.27 | 7.28 | 3.30 | 4.66 | 4.69 | 4.98 | 6.12 |
56+
| Dark Matter | 17.05 | 8.89 | 4.18 | 5.69 | 3.50 | 7.04 | 10.36 | 11.24 | 7.40 |

docs/UI_BUTTON_ICONS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ This table maps the current button/action controls to their visual representatio
77
| `Tab Close` | Archive tabs | Red tile with white close `X` | `assets/icons/ui/tab-close.svg` |
88
| `Create PAK` / `New PAK` | Workspace, File menu | Package box with plus | `assets/icons/ui/new-pak.svg` |
99
| `Open File...` | Workspace, File menu | Archive box with download arrow | `assets/icons/ui/open-archive.svg` |
10-
| `Open Archive...` | Workspace, File menu, updater release-page open | Archive box with download arrow | `assets/icons/ui/open-archive.svg` |
10+
| `Quick Inspect Archive` / `Open Archive...` | Workspace, File menu, updater release-page open | Archive box with download arrow | `assets/icons/ui/open-archive.svg` |
11+
| `Quick Open/Search` | Workspace menu, main window search box | List/detail glyph | `assets/icons/ui/view-details.svg` |
1112
| `Open Folder...` | Workspace, File menu | Folder with down arrow | `assets/icons/ui/open-folder.svg` |
1213
| `Save` | File menu, unsaved prompt | Floppy disk | `assets/icons/ui/save.svg` |
1314
| `Save As...` | File menu | Floppy disk with pen mark | `assets/icons/ui/save-as.svg` |

docs/UX_PERFORMANCE_BASELINE.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# UX Performance Baseline
2+
3+
This file records the current roadmap performance evidence. It uses generated
4+
fixtures only, so no private game assets, archive paths, file names, or user
5+
content are stored.
6+
7+
## 2026-05-01 Local Baseline
8+
9+
Environment:
10+
11+
- Platform: Windows development workstation
12+
- Build: `builddir/src/pakfu.exe` after `meson compile -C builddir`
13+
- Corpus: generated folder fixture with 1,000 text files across 20 directories,
14+
each file containing a short ASCII payload
15+
- Timing method: PowerShell `System.Diagnostics.Stopwatch`
16+
17+
| Scenario | Command shape | Result |
18+
|---|---|---:|
19+
| Folder summary | `pakfu.exe --cli --info <fixture-folder>` | 42.5 ms |
20+
| Folder listing | `pakfu.exe --cli --list <fixture-folder>` | 24.8 ms |
21+
| Folder validation | `pakfu.exe --cli --validate <fixture-folder>` | 27.8 ms |
22+
| Folder package manifest | `pakfu.exe --cli --package-manifest json <fixture-folder>` | 26.2 ms |
23+
24+
Acceptance:
25+
26+
- All measured commands returned without CLI errors.
27+
- The fixture size is intentionally modest and generated; release QA should add
28+
larger private corpus runs outside the repository.
29+
- Performance traces are privacy-safe: opt-in timing details use item kind,
30+
extension/archive kind, size buckets, and step labels rather than paths,
31+
file names, search queries, or asset content.
32+
33+
## Reproduction Sketch
34+
35+
Create a temporary fixture outside the repository, run the CLI operations above,
36+
and delete the fixture after timings are captured. Release baselines may include
37+
larger private corpora, but the stored report should describe them by size and
38+
format mix rather than by user or file names.

0 commit comments

Comments
 (0)