- Render audio in PostDetailPage (was only rendering in feed NoteCard)
- Add volume slider to VideoPlayer and AudioVisualizer (hover to reveal)
- Move shared volume state and handlers into usePlayerControls
- Replace hardcoded purple canvas colors with hsl(var(--primary))
- Replace bg-black with bg-background on AudioVisualizer container
- Add AudioVisualizer component: mirrors VideoPlayer chrome exactly (same overlay controls, progress bar, hide-on-idle, scroll-pause) with a canvas sinewave and author avatar in the centre
- Wire audio into NoteCard (kind 1 notes), FileMetadataContent (kind 1063), and ComposeBox preview
- Extract shared utilities: formatTime, usePlayerControls hook, and mediaUrls (regexes + mimeFromExt) to eliminate duplication across VideoPlayer, AudioVisualizer, NoteCard, NoteContent, ComposeBox, and EmbeddedNote
- Fix ComposeBox: audio URLs now get correct imeta MIME tags and are excluded from link-embed detection