Welcome to Vanilla Breeze
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
Canvas-based audio visualization that pairs with any <audio> element via the for attribute. Supports bars, waveform, and circle modes.
A companion component that draws canvas-based audio visualizations. It connects to any <audio> element by ID via the for attribute — mirroring the <label for=""> pattern.
Separated from <audio-player> so it can be independently positioned, omitted, or paired with a plain <audio> element.
Classic frequency bar chart equalizer. Press play to see the visualization.
<audio-player> <audio id="demo-track" controls> <source src="track.mp3" type="audio/mpeg"> <p><a href="track.mp3" download>Download track</a></p> </audio></audio-player><audio-visualizer for="demo-track" data-mode="bars"></audio-visualizer>
Time-domain oscilloscope line.
<audio-player> <audio id="wave-track" controls> <source src="track.mp3" type="audio/mpeg"> <p><a href="track.mp3" download>Download track</a></p> </audio></audio-player><audio-visualizer for="wave-track" data-mode="waveform"></audio-visualizer>
Radial frequency display.
<audio-player> <audio id="circle-track" controls> <source src="track.mp3" type="audio/mpeg"> <p><a href="track.mp3" download>Download track</a></p> </audio></audio-player><audio-visualizer for="circle-track" data-mode="circle"></audio-visualizer>
The visualizer works alongside <audio-player> — just give the inner <audio> an ID.
<audio-player> <audio id="my-track" controls> <source src="track.mp3" type="audio/mpeg"> <p><a href="track.mp3" download>Download</a></p> </audio></audio-player><audio-visualizer for="my-track" data-mode="bars"></audio-visualizer>
| Attribute | Required | Default | Description |
|---|---|---|---|
for | Yes | -- | ID of the target <audio> element |
data-mode | No | bars | Visualization style: bars, waveform, circle |
data-fft-size | No | 256 | AnalyserNode FFT size (power of 2, 32-32768) |
| Property | Default | Description |
|---|---|---|
--audio-visualizer-color | var(--color-primary) | Bar / waveform draw color |
--audio-visualizer-bg | var(--color-surface-sunken) | Canvas background |
--audio-visualizer-height | 80px | Canvas block size |
--audio-visualizer-radius | var(--radius-m) | Canvas border radius |
audio-visualizer { --audio-visualizer-color: oklch(70% 0.25 145); --audio-visualizer-bg: oklch(10% 0.02 260); --audio-visualizer-height: 120px; --audio-visualizer-radius: var(--radius-l);}
IntersectionObserver when not visibleprefers-reduced-motion: reduce is set; audio continues playingAudioContext is unavailable, renders nothing and throws no errorsWithout JS, the visualizer renders nothing — the <audio> plays normally. The visualizer is pure enhancement with no impact on audio functionality.
The :not(:defined) CSS rule hides the element before JS loads, preventing a flash of unstyled content.
aria-hidden="true" — purely decorativeprefers-reduced-motion<audio> — Native audio element<audio-player> — Platform audio player component