@namespace DeepDrftPublic.Client.Controls @using DeepDrftPublic.Client.Services @inject MixVisualizerControlState ControlState @* The Mix visualizer controls (lava reframe Wave R4). SEVEN continuous RadialKnobs — scroll speed, gradient rotation speed, lava gravity, lava heat, blob density, collision strength, waveform width — each its own dedicated control with a Material-icon caption (no more R2 temp-remapping: no knob caption misrepresents its function). The bar lives INLINE in the mix-detail controls area and ANIMATES open/closed in place via CSS transition off the @Expanded flag — it reads as the controls collapsing/expanding, NOT a floating popover/drawer (§7b). It owns NO JS interop: it mutates the shared, session-scoped MixVisualizerControlState and raises its Changed event. The backdrop bridge (MixWaveformVisualizer) subscribes to that event and pushes the affected dial to the WebGL module. That keeps the JS module handle single-owned by the bridge and this component purely presentational. None of these is a seek surface (read-only contract §D). RadialKnob has no icon slot (its Label renders as SVG text) and no aria attribute-capture, so each control's Material icon rides beside its knob as an adjacent MudIcon caption and the accessible name rides on the wrapping group div (§7d). HoldValue stays false so the knobs are live — ValueChanged fires continuously during drag, preserving the Changed/NotifyChanged seam. Aesthetic: the bar matches the session-hero NowPlaying overlay (§7e) — a translucent dark glass surface with overlay-label captions and Color.Secondary accents, so it reads as of-a-piece with the hero rather than a generic MudBlazor panel. *@
@code { ///