Search icon added to mobile header. Tapping opens an inline search bar
below the header. Typing searches artists/albums/songs via Navidrome
search3 API with 300ms debounce. X button closes and returns to Home.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- initProgressScrub() adds touchstart/move/end + mousedown drag to both
the player bar and NP overlay progress bars
- CSS transition disabled during scrub so fill follows finger instantly
- updateProgress() skips DOM updates while _scrubbing is active so
timeupdate events don't fight the drag position
- Works on both bars with a shared _initBarScrub helper
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Added same-origin check so the SW only caches its own static assets.
Cross-origin requests (Navidrome API, NovaSonic backend) pass through
directly — SW interference was causing 'failed to fetch' in the PWA.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chain activate: clear old caches → claim clients → navigate all windows.
client.navigate(url) forces a full reload so users always get the new
version without manually closing/reopening the PWA.
Also removed sw.js from PRECACHE (browser fetches SW directly, no need to cache it).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
flex-direction:row put the tab strip and icon buttons side-by-side,
both fighting for 100% width, making them overflow and appear huge.
Column stacks the Bibliothek/Entdecken tabs on top, icon row below.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cache-first meant users were stuck on old versions until manual cache clear.
Network-first fetches live, updates cache, falls back to cache when offline.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add touchstart/touchend on .player bar: swipe up ≥40px or fast flick opens np-overlay
- Replace cors() package with explicit middleware that sets Access-Control-Allow-Origin/Methods/Headers and Access-Control-Allow-Private-Network (needed for Chrome when backend is on private network or behind proxy)
- Remove cors npm dependency from backend
- Bump cache to ns-v20
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- player-art: border-radius 50% (circle), vinyl ring shadow, centre dot appears while spinning
- Mobile player height: 62px -> 74px, cover: 36px -> 46px
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- MUSIC_PATH is now used 1:1 inside the container (no /music remapping)
- config.js 404-safe with inline fallback defaults
- Prefill uses .trim() so empty strings don't overwrite fields
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace blob: manifest (ignored by Chrome) with static manifest.json
- Replace data: URL icon with real icon.svg file
- Link manifest and apple-touch-icon directly in <head>
- Remove blob/data URL generation from app.js
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- setPositionState synced every second via updateProgress so the notification shows progress bar and timestamps
- seekto handler enables dragging the notification progress bar
- seekbackward/seekforward handlers enable 10s skip buttons
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove max-width/gap/padding from bottom nav so buttons fill full screen width
- Add NS_BACKEND_URL to config.js entrypoint and autofill backend-url field on setup screen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Frontend reads window.NS_SERVER_URL from config.js (injected at container start via docker-entrypoint.sh) and pre-fills the setup screen
- Removed triggerNaviScan from frontend and backend (Navidrome auto-scans on file change)
- Removed NAVIDROME_USER/PASS from backend and compose
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>