77b39e5684
Wholesale replacement of the player view markup + a verbatim mockup CSS block scoped to .now-playing. Previous approach kept restyling legacy classes which left a layered, inconsistent result. This is a clean snap: same DOM structure as the mockup, same CSS rules, mapped onto existing JS-touched IDs. Markup - One <section class="now-playing"> with vinyl-stage on left and track-masthead on right - Vinyl spins via data-playstate and contains album art as the circular center label (existing #album-art img preserved) - SVG tonearm pivots in/out by data-playstate - Track masthead: .kicker (copper italic mono), large italic-serif .track-title, italic .track-byline, mono .track-album - Meta grid: 2 cells (State / Source) with mono labels + italic serif values - 30 .spectrum bars between metadata and transport - .transport: progress-row (timecode + .progress-track + timecode) and .controls (3 .btn-trans buttons + .vu-cluster) - Volume slider, mute button, visualizer toggle moved to a .visually-hidden block — they remain functional for JS / a11y but no longer compete for visual real estate. Volume control happens via the always-visible mini player. VU cluster (mockup-faithful) - 140x60 VU meter with conic-gradient grid background, copper needle, "VU" label - Stacked readout: "OUT <strong>SYS</strong>" / "VOL <strong>72%</strong>" - Click anywhere on cluster toggles mute (calls toggleMute()) - When muted: needle turns rust, readout strong turns rust, OUT label switches to MUTE JS hooks - updatePlaybackState already sets :root[data-playstate] (drives spin + tonearm) - Volume tick now updates #vu-vol and #vu-out - updateMuteIcon updates #vu-out + .vu-cluster.muted class Scoping - All new CSS is .now-playing-prefixed so other tabs and dialogs are untouched - Legacy .progress-bar:hover scaleY and ::after scale(0) are defeated with !important inside .now-playing