Repository navigation
GUI: the page scrolls past the player bar when a list has explicit songs #878
Description
What happened
In the desktop app the whole page can scroll down past the player bar, into an empty black area. It happens when the open list has explicit songs (the ones with the E badge). How far the page scrolls depends on where those songs are in the list, and it changes as I scroll the list. With no explicit songs there is still a 1 px scroll, so a page scrollbar always shows at the right edge of the window.
What I expect: the page itself never scrolls. Only the panels inside it scroll.
Steps to reproduce
- Start the desktop app (or
spotatui-gui) and open a long playlist that has explicit songs further down the list. - Scroll the mouse wheel over the track list, or drag the scrollbar at the right edge of the window.
- See the whole page move up, with black space under the player bar.
Frontend
Desktop app (the browser GUI has it too)
Source
Spotify
spotatui version
main at 39b0237 (the E badge from #838 is not in a release yet)
OS
Windows 11
How you installed spotatui
Built from source
Cause
Each explicit row has hidden screen-reader text next to its E badge: <span className="sr-only">{s.explicit}</span> in gui/src/TrackTable.tsx line 158. The .sr-only rule in gui/src/style.css (line 40) sets position: absolute but no top or left. The track list has no positioned parent, so the hidden text stays at its place in the list but the list's scroll box does not clip it, and the document grows to hold it. The two live regions in gui/src/Toast.tsx (lines 28 and 31) use the same rule. They sit just under the shell and add the 1 px.
I measured it in Chromium with a 1290x800 window and an 80-track playlist where every 7th song is explicit:
| Variant | document.documentElement.scrollHeight |
|---|---|
| Now | 4853 px |
| The explicit text hidden | 801 px |
With top: 0; left: 0 on .sr-only |
800 px |
Where to look
gui/src/style.cssline 40: the.sr-onlyrule.gui/src/TrackTable.tsxline 158: the hidden "Explicit" text.gui/src/Toast.tsxlines 28 and 31: the two live regions.gui/e2e/scenes.shot.tsline 94: thelibrary playlistscene, which opens a playlist from thefilmScoresfixture ingui/e2e/fixtures.ts(line 762).
Possible solution
- Add
top: 0;andleft: 0;to.sr-onlyingui/src/style.css. The text stays 1 px and clipped, so nothing changes on screen, and screen readers still read it in DOM order. - Add an e2e check: open a playlist with explicit songs below the visible part of the list, and assert that
document.documentElement.scrollHeightequalswindow.innerHeight. ThefilmScoresfixture has only 4 songs, so make a longer table for this check.
Things to avoid:
- Don't set
overflow: hiddenonbodyor.shell. That hides the symptom, and the real cause stays. - Don't remove the hidden text. Screen readers need it.
Done when
- In the desktop app, a long playlist with explicit songs does not let the page scroll, and no page scrollbar shows.
- The new e2e check fails without the CSS change and passes with it.
npm run lint,npm run format:check,npm run typecheckandnpm testpass ingui/.
Activity
spotatui commentedon Oct 16, 2026
🎧 spotatui triage
Auto-triaged with
claude-opus-5-5.Label:
bugLikely area: GUI frontend (gui/ web page): track table styling
Summary
In the desktop app and the browser GUI, the whole page can scroll past the player bar into an empty black area when the open track list has explicit songs. The reporter traces it to the hidden "Explicit" screen-reader text added with the E badge (#838). The
.sr-onlyrule setsposition: absolutewith notoporleft, so the hidden text escapes the list's scroll box and makes the document taller. The E badge is still unreleased, so release builds are not affected yet.Key points
top: 0; left: 0on .sr-only.top: 0; left: 0to .sr-only, plus an e2e check that scrollHeight equals innerHeight. Do not use overflow: hidden on body, and do not remove the hidden text.Where to look
gui/src/style.css: Defines the .sr-only rule at line 40. It has position: absolute but no top or left.gui/src/TrackTable.tsx: Line 158 renders the hidden Explicit span next to the E badge on each explicit row.gui/src/Toast.tsx: Lines 28 and 31 are the two sr-only live regions under the shell that the reporter links to the 1 px scroll.Possible duplicates: none found
Compared against 50 open and 100 recently closed issues.
niukanen1 commentedon Oct 17, 2026
Taking this one
fix(gui): anchor sr-only text so the page cannot scroll past the play…