fix(library): keep the A-Z jump strip above the mini player

The last few letters of the A-Z index sat behind the mini player and bottom
nav, where they could not be tapped — most visible on an album's track list or
the music library, since that is where audio is usually already playing.

AlphabetScrollBar sized itself as window.innerHeight minus a hardcoded
bottomGap: 5rem, 7rem or 11rem, chosen by platform and by whether the mini
player was showing. That arithmetic dates from when the mini player and bottom
nav were position: fixed overlays. They have been in-flow flex siblings below
the scroller since BottomUi (DR-009), so the scroller's own bottom edge *is*
the top of the mini player and can simply be measured.

The guess was also short on every device with a navigation or gesture bar,
because --safe-bottom is padded inside BottomUi (DR-112) and no guess knew
about it. Measured against a 800px viewport: the strip overran the scrollport
by ~45px with the nav alone, ~18px with the mini player and ~50px in remote
mode, burying one to three letters.

The floor is now the nearest scrollable ancestor's bottom edge. That ancestor
is resolved by computed overflow-y rather than closest("main"): the root shell
scrolls in a plain div, and a miss fell back to the viewport silently, which
would reinstate the bug on any route outside /library. Observing that scroller
for resize is also what re-measures when the mini player appears, so the
component no longer subscribes to player or platform stores at all.

The floor rule is extracted to alphabetStrip.ts so it can be tested; the three
overlap cases above fail against the old arithmetic and pass against the new.

TRACES: UR-007 | DR-262 | UT-235, UT-236, UT-237
This commit is contained in:
2026-08-25 22:47:08 +02:00
parent 1d6487774c
commit 8a2b484e36
6 changed files with 191 additions and 44 deletions
+9
View File
@@ -13,6 +13,15 @@ For how long each fixed defect had been shipping before it was found, see
### 🐛 Fixes
- **The A-Z jump strip no longer runs under the mini player.** On a long
alphabetical list — an album's tracks, the music library — the last few
letters sat behind the mini player and bottom nav, where they could not be
tapped. The strip was sizing itself against the window minus a hardcoded guess
at how tall those bars are, which stopped being true when they became part of
the normal layout instead of floating over it, and was always short by the
height of your phone's navigation bar. It now measures the list it belongs to
and stops exactly where that list stops, whatever is below. (UR-007 → DR-262)
- **Subtitles sit on the picture instead of on a black bar.** Every line arrived
in an opaque box, which is what Android hands back when no captioning
preferences have been set. The box is gone; the text keeps its own outline so