fix(plex): the player's stage follows the tablet toolbar, and its bands stay out of a double-tap

- The stage is sized in dvh (80dvh × 1.25 windowed, 100dvh fullscreen); the viewport-units
  contract no longer exempts the player.
- A tap that reveals the bands keeps them pointer-events-none for the double-tap window, so the
  second tap of a skip at the bottom is not a seek.
- An arrow on the volume slider wakes the bands, and a keyboard focus in a band holds them
  (`holdOnFocus`, `:focus-visible` only, so a clicked button does not pin the bar).
- Next stays mounted (disabled) while the next episode's detail loads, keeping the focus.
This commit is contained in:
2026-09-27 14:34:31 +02:00
parent 922d589b09
commit 76eead976f
4 changed files with 129 additions and 20 deletions
@@ -18,14 +18,9 @@ function sources(): Array<[string, string]> {
return walk(new URL("../", import.meta.url), "");
}
// The Plex player's stage is sized with the 80vh × 1.25 zoom trick. It changes in S3f, where the
// players are re-fitted for touch and verified by playing them on the tablet.
const PENDING_S3F = new Set(["components/PlexPlayer.tsx"]);
describe("viewport units", () => {
it("are dynamic: no h-screen / min-h-screen, no static vh", () => {
const hits = sources()
.filter(([name]) => !PENDING_S3F.has(name))
.filter(([, src]) => /\b(?:min-|max-)?h-screen\b|\d(?:\.\d+)?vh\b/.test(src))
.map(([name]) => name);
expect(hits).toEqual([]);