ROOT CAUSE: AudioPlayer was the only component holding the <audio>
element, and it was only mounted when expanded=true. The MiniPlayer
(default state after Play) had no audio element at all. So clicking
Play set the store state but no audio was ever loaded or played.
Fix: New AudioEngine component holds the single <audio> element and
all playback logic. Mounted globally in App.tsx whenever an item is
loaded — independent of MiniPlayer/AudioPlayer UI state.
Store: New seekRequest (counter-based) lets external UI request seeks
without direct audio element access. New playerError surfaces errors
across MiniPlayer (red progress bar) and AudioPlayer (banner).
AudioPlayer + MiniPlayer reduced to pure UI components that interact
through the store. They can mount/unmount freely without affecting
playback.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>