npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dreamdesk/player

v0.2.0

Published

A Winamp-style music player for React, built on @dreamdesk/ui: playlist, 7-band EQ with presets, skins, and a visualizer.

Readme

@dreamdesk/player

A lightweight, static web music player with a retro Winamp vibe. No build step required — just open the page and play.

Quick start

  • Open index.html in a modern browser.
  • Drop your audio files into public/tracks/.
  • Optionally edit public/tracks/manifest.json to control the playlist:
    • Simple: ["song.mp3", "another.mp3"]
    • Detailed: [{"file":"song.mp3","title":"Song","artist":"Artist"}]

If no manifest is found, a small default list is shown.

Controls

  • Play/Pause/Stop/Prev/Next
  • Shuffle and Repeat
  • Volume and Balance
  • Equalizer (7‑band) with presets

File structure

  • index.html — UI and component markup
  • styles.css — styles for the player and docks
  • player.js — audio engine, UI wiring, animations, and playlist/eq logic
  • public/ — static assets
    • img/ — images
    • tracks/ — audio files and manifest.json

Tuning the minimize animation

Minimize/unminimize animations are defined in player.js (search for customMinimize and the minimize sync helper). Adjust the CSS transition durations there if you want different timing.

License

MIT

React package

The player is also a React component, @dreamdesk/player, built on @dreamdesk/ui (formerly dreamdesk-ui).

npm install @dreamdesk/player @dreamdesk/ui react react-dom
import { Player } from "@dreamdesk/player";
import "@dreamdesk/player/css";

<Player
  initialTracks={[{ title: "Track", artist: "Artist", src: "/track.mp3" }]}
  onSkinChange={(id) => localStorage.setItem("skin", id)}
/>

It needs @dreamdesk/ui 3.1 or later (use it instead of the older dreamdesk-ui, not alongside it). @dreamdesk/ui, react and react-dom are peer dependencies, so your app provides them and ends up with a single copy of each.

Like Winamp: click a track to select it (Ctrl/⌘ or Shift for several) and double-click to play; REM, SEL and MISC manage the playlist; click the display to cycle the visualizer (bars, oscilloscope, off); right-click the player for its menu, including skins.

| Prop | | |---|---| | initialTracks | { title, artist, src }[] to start with | | skin / onSkinChange | "tokyo-3-sunset" or "pastelcore"; called when the visitor picks one | | defaultFullscreen / onFullscreenChange | start expanded (playlist and EQ open); called when it changes | | defaultVisualizerMode / onVisualizerModeChange | "bars", "scope" or "off"; called when it changes | | initialX, initialY / onMove | where the window starts; called after it's dragged | | icon, disableSnap, onClose | passed to the @dreamdesk/ui window |

The on…Change callbacks are there so a host can remember the visitor's choices. Build the package with npm run build; the output goes to dist/.

Releasing

Bump version in package.json in a PR and merge it, then create a GitHub Release tagged vX.Y.Z (gh release create v0.1.2 --generate-notes). The Release to npm workflow checks the tag matches the version, runs lint and tests, and publishes @dreamdesk/player to npm through trusted publishing (no npm token).

Tests

npm test           # Vitest (happy-dom)
npm run coverage   # tests + coverage report (HTML in coverage/)

happy-dom has no Web Audio, so src/__tests__/fakeAudio.ts provides a small fake AudioContext that records how nodes are connected; src/__tests__/setup.ts installs it, stubs media playback and fetch. The Player tests swap @dreamdesk/ui's Window for a stand-in that records its props. CI runs the build and tests on every PR.