Skip to content

Three UI cleanups from the library and the top bar - #641

Merged
thcp merged 2 commits into
mainfrom
fix/ui-cleanup-636
Sep 20, 2026
Merged

thcp merged 2 commits into
mainfrom
fix/ui-cleanup-636

Conversation

@thcp

@thcp thcp commented Sep 20, 2026

Copy link
Copy Markdown
Collaborator

Closes #636

Thanks to @wastedbits for going through the interface properly and writing each
thing down. This is the three items I said yes to in that thread.

The bullets in the Extract chips

Gone. Each one was a dot in the button's own text colour, so it repeated what
the button was already saying: a chip changes its border, background and text
colour when it is selected. Six in a row read as a bulleted list rather than a
row of controls.

The green dot on every library row

Now shown only when it means something. A finished import is the resting state
of every row in a settled library, so a green dot on all of them marked nothing
out. It was a cheap status display in the early versions and the app outgrew it.

Importing, waiting in the queue, and unavailable all keep their dot, and they
are easier to pick out now that they are the only rows wearing one. The element
stays in the DOM because updateTrackStatus flips it live without rebuilding
the row.

The notification bell

Moved into the library rail, under We Recommend. The top bar is the import and
split controls, so a bell parked at the end of it read as part of that job.
Everything else in the rail is app-wide rather than track-wide, which is what a
notification is.

The panel that bell opens needed more than a move. It is fixed rather than
absolute now, and positioned from JS, because .sidebar is overflow: hidden
and narrows to the rail's 66px when the library is collapsed. An absolutely
positioned panel is clipped to nothing in that state. placeNotifPanel puts it
level with the bell and clear of the rail, the same approach the search dropdown
and the metronome popover already use, and clamps it on a window too short to
hang it off the bell at all.

Horizontal placement measures the rail rather than the button, since the button
is 40px centred in a 66px column and the two edges are not the same place.

Not changed, on purpose

The hamburger and the library button, and the note thumbnails on library rows.
Both are answered in the thread. The short version: I tried the double-click
approach to toggling sections before and reverted it because it was not obvious
enough, and the note glyph is the fallback thumbnail, which earns its place when
you have imported more than one version of the same song.

Testing

175 Playwright, i18n coverage across all ten tables, JS syntax and unit tests,
ruff, bandit. uv.lock untouched. Two new tests, both negative-controlled:
restoring either old behaviour fails them.

Thales added 2 commits September 20, 2026 07:58
From #636, the three items I agreed to in that thread. The hamburger and the
note thumbnails are deliberately unchanged, for the reasons given there.

Drop the bullet from each Extract chip. It was a dot in the button's own text
colour, so it said nothing the button was not already saying: a chip changes
border, background and text colour when it is selected. Six of them in a row
read as a bulleted list rather than a row of controls.

Show the library status dot only when it has something to say. A finished
import is the resting state of every row in a settled library, so a green dot
on all of them marked nothing out. Importing, waiting in the queue and
unavailable keep it, and are easier to pick out now that they are the only rows
wearing one. The element stays in the DOM because updateTrackStatus flips it
live without a re-render.

Move the notification bell into the library rail. The top bar is the import and
split controls, so a bell parked at the end of it read as part of that job.
Everything else in the rail is app-wide rather than track-wide, which is what a
notification is.

The panel it opens is fixed rather than absolute, and placed from JS. It cannot
hang off its own wrapper: .sidebar is overflow:hidden and narrows to the rail's
66px when the library is collapsed, which clips an absolutely positioned panel
to nothing in that state. placeNotifPanel puts it level with the bell and clear
of the rail, the same way the search dropdown and the metronome popover are
already placed, and clamps it on a window too short to hang it off the bell at
all.

Horizontal placement measures the rail, not the button. The button is 40px
centred in a 66px column, so measuring its own right edge tucks the panel back
under the rail by the difference.

Both new tests are negative-controlled: restoring either old behaviour fails
them.
Not part of #636. It is here because it fails trivy on every branch, including
this one, and the fix does not belong in a UI change.

anyio's TLSStream encodes host names with IDNA 2003, which can be made to
disagree with IDNA 2008 and spoof a certificate. Fixed in 4.14.2; the lock pins
4.13.0.

Nothing in StemDeck opens a TLSStream. anyio arrives transitively: starlette
uses it for task groups and thread offloading rather than for sockets, and
httpx, which does use it for TLS, is a dev dependency present for FastAPI's
TestClient. The server speaks plain HTTP on localhost, and the two things that
fetch over TLS, yt-dlp and audio-separator, bring their own HTTP stacks.

Ignored rather than fixed because the fix is not a one-line bump. Regenerating
the lock for it also rewrites platform markers across a dozen packages,
including the Intel macOS paths pyproject gates by hand, and any uv.lock change
sends every existing desktop install to a full download instead of an in-app
update. The entry says to take the bump the next time the lock moves anyway.

Verified with the same scanner CI runs: uv.lock and Cargo.lock both clean,
exit 0.
@thcp
thcp merged commit 7713d56 into main Sep 20, 2026
10 checks passed
@thcp
thcp deleted the fix/ui-cleanup-636 branch September 20, 2026 07:16
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.

[Bug]: Usability: UI cleanup

1 participant