feat(now-playing): mount real waveform visualizer in NowPlaying card (mode C) + Fill container-sizing mode

Replace the 20 synthetic bars with a contained WaveformVisualizer driven by the live player, pointed at the current track; add a Fill mode (CSS-only, defaults off) sizing the canvas to its container; place the lava-lamp icon to popover on the card.
This commit is contained in:
daniel-c-harvey
2026-06-17 12:15:49 -04:00
parent 9009f2c8cf
commit 05486a61af
5 changed files with 58 additions and 50 deletions
@@ -73,6 +73,17 @@ public partial class WaveformVisualizer : ComponentBase, IAsyncDisposable
/// </summary>
[Parameter] public double PlaybackPosition { get; set; }
/// <summary>
/// Container-sizing mode (phase-12 §6c). Default <c>false</c> keeps the full-viewport mount the
/// engine has always used (fixed, inset 0, clipped above the player bar) — Mix's mode-A full-bleed
/// and the ambient mode-B mounts are unchanged. Set <c>true</c> for a contained mount (mode C, the
/// NowPlaying card): the canvas fills its nearest positioned ancestor instead of the viewport, with
/// no footer clip. This is a CSS/layout toggle only — the renderer already sizes the backing store to
/// the canvas's own box (a ResizeObserver on the canvas, never <c>window</c>), so the JS module is
/// identical in both modes; <c>Fill</c> only changes which box that canvas occupies.
/// </summary>
[Parameter] public bool Fill { get; set; }
// Bridge-level diagnostics. Mirrors the JS-side DEBUG flag in WaveformVisualizer.ts: when true the
// datum-fetch / subscription / playback-coupling seams log to the browser console (prefixed
// `[WaveformVisualizer]`, same as the JS logs so the two interleave into one timeline). These pinpoint