Repository navigation
Three UI cleanups from the library and the top bar - #641
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
updateTrackStatusflips it live without rebuildingthe 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
.sidebarisoverflow: hiddenand narrows to the rail's 66px when the library is collapsed. An absolutely
positioned panel is clipped to nothing in that state.
placeNotifPanelputs itlevel 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.lockuntouched. Two new tests, both negative-controlled:restoring either old behaviour fails them.