Skip to content

Usability pass, accessibility fixes, and themed scrollbars - #42

Merged
Phantom-VK merged 4 commits into
mainfrom
feat/rebuild-11-usability
Aug 21, 2026
Merged

Usability pass, accessibility fixes, and themed scrollbars#42
Phantom-VK merged 4 commits into
mainfrom
feat/rebuild-11-usability

Conversation

@Phantom-VK

Copy link
Copy Markdown
Owner

Summary

  • Fixed a bug where a tokenizer's "used by N models" count silently dropped to zero the moment its download finished, caused by a probe helper's placeholder value being passed straight through instead of the caller's real model list.
  • Fixed two accessibility gaps found during a live usability pass: progress bars had no accessible name (so a screen reader announced a bare percentage with no indication of what it was tracking), and the app had no live region anywhere, so async completion messages never announced to screen reader users.
  • Fixed a live region that existed but never actually worked: it unmounted and remounted on every job instead of staying mounted and having its content change, which meant the completion announcement it existed for never fired.
  • Fixed a progress bar reporting a different value to assistive tech than what was shown on screen for over-100% cases (VRAM/context overflow).
  • Restyled scrollbars to use the app's theme tokens instead of the OS default white/grey, so they adapt across light/dark and strengthen under high-contrast mode automatically.

Test plan

  • cd frontend && npm run typecheck && npm run test && npm run build (97 vitest passing, clean build)
  • python -m pytest -q (325 passing)
  • Verified all fixes live against the real desktop app (not just a browser tab), including a real tokenizer download and a real file-analysis job
  • Verified scrollbar theming visually in both light and dark themes

…ompletes

The per-resource probe functions always return model_ids=() since they
have no model list to draw from; download_tokenizer passed that placeholder
straight through instead of restoring the caller's original model_ids,
so a resource's "used by N models" count silently dropped to zero the
moment its download finished.
Ran each view end to end (mouse, keyboard, and a real download/analysis
job, not just static review) and fixed what a screen reader user would
actually hit:

- Every progress bar now has an accessible name (context usage per row,
  VRAM utilization, analysis progress, tokenizer download) instead of
  announcing a bare percentage with no indication of what it's tracking.
- The parser's status line is a polite live region, so "Done" / "Cleared"
  messages announce on their own instead of only being readable by
  navigating back to that line manually.

Everything else exercised in the pass -- motion, focus return on dialogs
and selects, empty/error states, keyboard traversal -- held up correctly.
…nce right

The parser's status region unmounted and remounted on every job (setStatus(null)
at the start, a fresh node with the final text at the end), so the completion
message it exists to announce never actually fired -- a screen reader only
picks up a mutation inside an already-present live region, not one that
appears already populated. It now stays mounted with no visual footprint
when empty, and only its content toggles.

ContextBar's aria-valuenow was the raw percentage while aria-valuemax stayed
fixed at 100, so an over-context bar (VRAM/context usage past 100%) could
expose a clamped value to assistive tech that disagreed with the number on
screen. valuenow is now clamped into the declared 0-100 range and
aria-valuetext carries the exact displayed percentage.
…default

Scrollbars were left at the browser default (opaque white track, grey
thumb), which reads as a stray system widget dropped onto an otherwise
fully themed surface. They now use --muted-foreground at partial opacity
for the thumb and a transparent track, so they adapt automatically across
light/dark and strengthen under prefers-contrast: more for free, since
that's the same token the rest of the app already tunes for contrast.
@Phantom-VK Phantom-VK self-assigned this Aug 21, 2026
@Phantom-VK
Phantom-VK merged commit 128e99c into main Aug 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant