Sticky catalog search bar, and let anyone seek within a music track #5

Merged
kyuno merged 2 commits from feature/sticky-search-and-music-seek into master 2026-09-16 07:21:15 +02:00
Owner

Summary

  • The library/artist/album search bar now sticks to the top of the page while scrolling a long grid (position: sticky).
  • Listen-party progress bar is no longer read-only - click/drag to seek, same "anyone, no host check" model musicPlaystate already has (a seek is reversible and doesn't change what's playing, unlike voteSkip's majority gate). New MusicQueueService.seek + musicSeek socket event; client drag handlers mirror the video player's own seek bar.

Test plan

  • npm run typecheck / npm test / npm run build on both projects (128/128 server tests)
  • New tests specifically prove the old auto-advance timer is cleared before a seek re-arms it (the bug a naive implementation would have shipped) and that a non-host member can seek
  • Not verified live in a browser - no Emby login reachable from this sandbox

🤖 Generated with Claude Code

## Summary - The library/artist/album search bar now sticks to the top of the page while scrolling a long grid (`position: sticky`). - Listen-party progress bar is no longer read-only - click/drag to seek, same "anyone, no host check" model `musicPlaystate` already has (a seek is reversible and doesn't change *what's* playing, unlike `voteSkip`'s majority gate). New `MusicQueueService.seek` + `musicSeek` socket event; client drag handlers mirror the video player's own seek bar. ## Test plan - [x] `npm run typecheck` / `npm test` / `npm run build` on both projects (128/128 server tests) - [x] New tests specifically prove the old auto-advance timer is cleared before a seek re-arms it (the bug a naive implementation would have shipped) and that a non-host member can seek - [ ] Not verified live in a browser - no Emby login reachable from this sandbox 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-15 23:27:36 +02:00
Sticky catalog search bar, and let anyone seek within a music track
Some checks failed
Publier l'image Docker / test (pull_request) Failing after 4s
Publier l'image Docker / publish (pull_request) Has been skipped
fafee359b9
Two small, unrelated requests handled together.

The search bar (tiles.ts's shared .searchBar, used by views/library/
artist/album) scrolled away with the page - asked to stay reachable
while scrolling a long grid. position: sticky; top: 0 on the input
itself; base.css's own generic input rule already gives it an opaque
background, which is what keeps tiles scrolling underneath from
showing through once it's stuck - nothing else needed changing.

Seeking within the current music track was explicit, deliberate scope
this session's own "participative playlist" work had cut - the
progress bar was marked read-only specifically because MusicQueueService
had no seek concept, just play/pause/advance. The permission model was
already decided by that class's own documented reasoning for why
*anyone* can pause/resume (reversible, doesn't change what's playing) -
a seek is exactly that same shape, continuous instead of binary, so it
gets the same treatment, not voteSkip's majority gate.

MusicQueueService.seek mirrors setPaused's own elapsed-time math
(clamped into [0, durationSeconds]), with one real difference: setPaused's
resume branch gets away with calling scheduleAdvance directly only
because pausing already cleared the timer first - scheduleAdvance
itself never clears a prior one. Seeking while still playing has no
such guarantee, so skipping that clear first would leave the OLD timer
(counting down against the old position) running alongside the new
one, eventually firing playNext at the wrong moment. New musicSeek
socket event, no host check (same as musicPlaystate). Client-side,
MusicBar's progress track gained the same pointerdown/move/up
drag-to-seek handlers the video player's seek bar already has - no host
branch to port this time, since a listen party has none - plus a
local, optimistic activeDriver.currentTime write before broadcasting,
for the same instant-feedback reason the video player's own
seekFromPointerEvent does that.

Verified: full typecheck/test/build on both projects (128/128 server
tests - new coverage for seek's clamping, its paused-vs-playing
branches, and a real-timer test proving the old advance timer is
cleared rather than left running alongside a re-armed one - the exact
bug the naive "just call scheduleAdvance again" version would have
shipped). No server needed for the sticky search bar - checked by
reading .mainContent's own layout directly (no nested scroll container
between it and the document, confirming position: sticky resolves
against the page scroll as intended).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-16 07:21:00 +02:00
Merge remote-tracking branch 'origin/master' into feature/sticky-search-and-music-seek
Some checks failed
Publier l'image Docker / test (pull_request) Failing after 4s
Publier l'image Docker / publish (pull_request) Has been skipped
7bf8197bfe
# Conflicts:
#	README.md
#	docs/architecture.md
kyuno merged commit b41437e23e into master 2026-09-16 07:21:15 +02:00
kyuno deleted branch feature/sticky-search-and-music-seek 2026-09-16 07:21:16 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/watchparty#5
No description provided.