Skip to content

Bar

  • Classic (Spotify-style) mode. mode: 'waveform' | 'classic''classic' lays the bar out in three columns: now-playing on the left, transport centred over a full-width seek bar, secondary controls on the right. 'waveform' (default) keeps the existing full-width waveform layout.
  • Shuffle. showShuffle adds a shuffle toggle to the transport and shuffle sets its initial state (random queue advance on next / auto-advance).
  • Simplified layout config to two modes. mode supersedes the old layout / waveform combination; wide gives waveform mode a full-width size.
  • Queue + collapse accessibility. The queue button now exposes aria-haspopup / aria-expanded (open/closed state is announced) and closes on Escape, returning focus to the trigger; the collapse button keeps its aria-expanded in sync.
  • maxWidth config option — superseded by mode / wide sizing.
  • Volume slider collapsed to a tiny stub when the host page styles range inputs. The vertical slider is a horizontal range input rotated -90°. A generic input[type="range"] { width: 100% } on the host page (specificity 0,1,1) out-specified the bar’s .wb-volume-slider rule (0,1,0), shrinking the slider to the 40px popup width — a 40px stub after rotation. The bar’s slider rules are now scoped under .wb-volume-popup (0,2,0, plus a pinned flex-shrink: 0) so the bar’s own sizing wins regardless of host form-control styles.
  • Raised the @arraypress/waveform-player peer dependency floor to ^1.7.2, which ships the native accessible (keyboard / ARIA) seek slider. In external mode the player dispatches waveformplayer:request-seek on keyboard seek — already handled by the bar — so keyboard seeking on inline player surfaces now routes through the bar with no code changes here.
  • Cross-page state seed — when a new external WaveformPlayer instance is discovered after the bar is already playing (typical SPA / page-navigation flow: hit Play on a card → navigate to the product page → inline player mounts), the bar now immediately seeds the newly-discovered player with setPlayingState() and setProgress() so its canvas reflects the live bar state without waiting for the next timeupdate tick.
  • External WaveformPlayer integration — when @arraypress/waveform-player 1.6+ instances are mounted with audioMode: 'external' (data-audio-mode="external"), WaveformBar now discovers them automatically and treats them as synchronized visual surfaces. Click the inline player’s play button → playback happens in the bar; the bar’s progress mirrors into the inline canvas in real time.

    No configuration needed — the bar scans for matching players on init + MutationObserver tick, and listens for waveformplayer:request-play, waveformplayer:request-pause, and waveformplayer:request-seek events at the document level. Any inline player whose URL matches the currently-playing track gets setPlayingState(true) and setProgress(...) calls pumped to it.

    <!-- Same element doubles as a bar trigger (data-wb-play) AND an
    inline visual surface (data-waveform-player + audio-mode). -->
    <div data-waveform-player
    data-audio-mode="external"
    data-url="song.mp3"
    data-waveform-style="bars"
    data-wb-play
    data-wb-url="song.mp3"
    data-wb-title="..."></div>

Fully additive. Stores / pages that don’t render any external-mode WaveformPlayer instances behave exactly as before — the discovery scan returns an empty Map, the pump methods short-circuit. Existing [data-wb-play] triggers without the player markup continue to work unchanged.

  • Removed configPath option (dead code from experimental feature that was never functional in a published release)
  • Fixed waveform-bar-icons.css missing base .wbi class — icons now render correctly
  • Fixed broken comment block and duplicate .wbi-heart-filled rule in icons CSS
  • Removed debug console.log from session restore