Pulse is one Custom Element for every framework. It reads its own width — a disc at 96 px, a hero card at 760 — wears nine moods that re-light every player on the page, and listens to the music it plays: the real spectrum, sixty times a second.
A1 — The object
TC 00:00:00:00
01 — One element
70 BPM · 33⅓ RPM
Shot 01
One element.
A Custom Element that renders itself — in any framework, or none.
Shot 02
Every size.No breakpoints.
It reads its own width: a disc at 96 px, a hero card at 760 px.
Shot 03
Nine moods.
One attribute re-lights the room — and every player in it.
Shot 04
It listensback.
The real spectrum, sixty times a second, written into the groove.
Pick one and the whole room changes key — the players on this page, the mini player following you, even this wall. It’s remembered for your next visit.
Moods heard 0/9
Auto
$ <pulse-player variant="auto">
A
B
Interlude
Flip therecord.
Side B is the part you hear before you see it.
B1Follows you0:45
Scroll away. It comes with you.
<pulse-fab> shares the same audio session as every player on the page. It appears when the music starts, can be dragged anywhere, snaps to the nearest corner and remembers where you left it — even across pages.
Twenty-four bands of the real spectrum, sixty times a second, from one Web Audio analyser shared by every visual — the ambient EQ, the FAB’s halo, and this landscape. Each line is a moment that just passed.
Idle — drop the needleEnergy 0.00Bass 0.00
// The same frames that drive this page. One analyser, zero copies.const off = engine.onFrame(({ bands, energy }) => {
// bands: Float32Array(24) · energy: 0..1
canvas.draw(bands)
})
No audio? No problem: when the analyser can’t run (cross-origin media, no Web Audio), frames are synthesised from playback so visuals never freeze — and they flag syntheticso you can tell.
B3Speaks every framework0:50
One element. Speaks HTMLVueReactSvelteAngularevery framework
The engine and the player are framework-free. Thin, typed wrappers give Vue, React and Svelte their own idioms; Angular and plain HTML use the element as-is. Same audio, same events, same types.
<scripttype="module">
import'@pulse-music/web-component'
</script>
<pulse-player ambient-eq>
<pulse-tracksrc="/projector-screen.mp3"title="Projector Screen"artist="HoliznaCC0"cover="/projector-screen.jpg"></pulse-track>
</pulse-player>
<!-- Optional floating mini player, same audio session -->
<pulse-fab></pulse-fab>
Focus the player and type. Or press a key below. Then watch what assistive technology is told — read live from the player’s own accessibility attributes.
Accessibility tree, live
Keyboard first
Every control is reachable, shortcuts work from anywhere inside the player.
Screen readers
Real buttons and an ARIA slider with spoken time — “1:12 of 2:40”.
Lock screen
Media Session: title, artwork and controls on phones and keyboards.
Reduced motion
Spins, ripples and springs step aside when you ask the OS for calm.
Any language
Every label is replaceable through one labels property.
Checked in CI
axe-core runs WCAG 2.2 AA checks on every change.
C1The reel0:15
Fifteen seconds, cut to the beat.
This page’s motion as a film, rendered frame by frame from code to “Projector Screen”. No editing software, no stock footage. Sound on.
00 — Needle dropTC 00:00:00:00
The grid this page moves on70.06 BPMBeat · 856 msEighth · 428Sixteenth · 214Thirty-second · 107
A tonearm swings in and drops onto a spinning record. The headline slams in word by word; the letters of “plays” rise and fall with the music. The player card opens from the full stop and folds from 760 to 96 pixels wide, then four moods wipe across it. The spectrum turns into a ridgeline landscape, curls into the grooves of a record that flips to side B, and the reel ends on the Pulse logo as the turntable brakes.
C2Pressings0:35
Open source. Pressed in public.
MIT-licensed, typed end to end, tested in real browsers. Every change goes through lint, unit, end-to-end and accessibility checks before it’s pressed.