react-sonority v0.2.1
<Sonority />
A Flexible, Headless React Audio Player.
Features
- 🎵 Single track and playlist support
- 🎨 Fully customizable styling (headless)
- 🔄 Queue management and track navigation
- 🎛️ Volume, seek, and playback speed controls
- 🔁 Repeat and shuffle functionality
- 📱 Responsive and accessible
- 🎯 TypeScript support
- 🧩 Compound component architecture
- 🎨 Fully composable rendering
Installation
npm
npm install react-sonority @radix-ui/react-select @radix-ui/react-slider @radix-ui/react-tooltip @radix-ui/react-progress @radix-ui/react-dropdown-menuyarn
yarn add react-sonority @radix-ui/react-select @radix-ui/react-slider @radix-ui/react-tooltip @radix-ui/react-progress @radix-ui/react-dropdown-menuQuick Start
import { Sonority, useSonority } from 'react-sonority';
import { Play as PlayIcon, Pause as PauseIcon } from "lucide-react";
function AudioPlayer() {
const { state } = useSonority();
return (
<Sonority variant="playlist" className="p-4">
{/* Play/Pause Control */}
<Sonority.Control.Play>
{state.isPlaying ? <PauseIcon /> : <PlayIcon />}
</Sonority.Control.Play>
{/* Track Information */}
<Sonority.Current.Track className="text-xl" />
<Sonority.Current.Artist className="text-sm" />
{/* Progress Bar */}
<Sonority.Control.Seek className="w-full" />
{/* Volume Controls */}
<Sonority.Control.Mute />
<Sonority.Control.Volume className="w-24" />
{/* Track Definition */}
<Sonority.Playlist name="Rock'n'Roll">
<Sonority.Track
src="./ohio.mp3"
title="Ohio"
artist="The Black Keys"
/>
<Sonority.Track
src="./out-on-the-weekend.mp3"
title="Out on the Weekend"
artist="Neil Young"
/>
<Sonority.Track
src="./the-hardest-cut.mp3"
title="The Hardest Cut"
artist="Spoon"
/>
</Sonority.Playlist>
</Sonority>
);
}Comprehensive API Reference
<Sonority />
The root component that provides audio context and state management.
Props
variant:"single" | "playlist"className: Additional CSS classeschildren: React nodes
<Sonority.Track />
Represents an audio track with extensive metadata support.
Track Properties
id: Unique identifiersrc: Audio file pathtitle: Track titleartist?: Artist nameimage?: Album artworksrc: Image URLalt?: Alternative text
album?: Album namewrittenBy?: Composer or writergenre?: Music genreyear?: Release yearduration?: Track length
Subcomponents
<Sonority.Track.Title>: Render track title<Sonority.Track.Artist>: Render artist name<Sonority.Track.Cover>: Render track image<Sonority.Track.Album>: Render album name<Sonority.Track.WrittenBy>: Render composer<Sonority.Track.Genre>: Render genre<Sonority.Track.Year>: Render release year<Sonority.Track.Duration>: Render track length<Sonority.Track.CustomProperty>: Render custom metadata
<Sonority.Current />
Displays current track information with flexible rendering.
Subcomponents
<Sonority.Current.Track>: Current track title<Sonority.Current.Artist>: Current track artist<Sonority.Current.Cover>: Current track image<Sonority.Current.Album>: Current album name<Sonority.Current.WrittenBy>: Current track composer<Sonority.Current.Genre>: Current track genre<Sonority.Current.Year>: Current track release year
<Sonority.Control />
Audio control components with various interactions.
Subcomponents
<Sonority.Control.Play>: Play/Pause toggle<Sonority.Control.Previous>: Previous track<Sonority.Control.Next>: Next track<Sonority.Control.Seek>: Progress slider<Sonority.Control.Volume>: Volume control<Sonority.Control.Shuffle>: Toggle shuffle mode<Sonority.Control.Repeat>: Toggle repeat modes<Sonority.Control.Mute>: Toggle audio muting<Sonority.Control.Speed>: Playback speed control with prop:- options:
{ min: number, max: number, initial: number, steps: number, variant: string }
Speed Control
The Speed control supports three variants:
// Range slider
<Sonority.Control.Speed
options={{
min: float,
max: float,
step: float,
variant: "range"
}}
className="w-full"
/>
// Select dropdown
<Sonority.Control.Speed
options={{
variant: "select"
}}
className="p-2 border rounded"
/>
// Button group
<Sonority.Control.Speed
options={{
variant: "buttons"
}}>
{({ speeds, currentSpeed, setSpeed }) => (
<div className="flex gap-2">
{speeds.map(speed => (
<button
key={speed}
onClick={() => setSpeed(speed)}
className={currentSpeed === speed ? 'active' : ''}>
{speed}x
</button>
))}
</div>
)}
</Sonority.Control.Speed>Speed Control Options
min: Minimum speed (default: 0)max: Maximum speed (default: 2)step: Speed increment (default: 0.5)variant: "range" | "select" | "buttons"default: Default speed value (default: 1)
Mute Control
import
// Basic usage
<Sonority.Control.Mute />
// With custom content
<Sonority.Control.Mute>
{isMuted ? 'Unmute' : 'Mute'}
</Sonority.Control.Mute>
// With initial state
<Sonority.Control.Mute initialMuted={true} />Advanced Usage Examples
Flexible Track Rendering
<Sonority.Track {...trackData}>
<div className="flex items-center">
<Sonority.Track.Cover className="w-16 h-16 mr-4" />
<div>
<Sonority.Track.Title className="font-bold" />
<Sonority.Track.Artist className="text-gray-600" />
<Sonority.Track.CustomProperty
name="mood"
className="italic text-gray-500"
/>
</div>
</div>
</Sonority.Track>Custom Playlist with Subcomponents
<Sonority variant="playlist">
<Sonority.Playlist id="my-playlist">
{tracks.map(track => (
<Sonority.Track
key={track.id}
{...track}
className="hover:bg-gray-100 transition-colors"
>
<div className="flex justify-between items-center">
<Sonority.Track.Title />
<Sonority.Track.Duration className="text-sm text-gray-500" />
</div>
</Sonority.Track>
))}
</Sonority.Playlist>
</Sonority>Styling and Customization
Sonority is completely headless with no default styles. Use className props or CSS-in-JS solutions for styling.
Data Attributes
data-sonority-component: Component typedata-sonority-variant: Component variantdata-sonority-current: Current trackdata-sonority-playing: Playback state
Browser Support
Compatible with all modern browsers:
- Chrome/Edge (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers (iOS/Android latest)
TypeScript Support
Full TypeScript type definitions included.
License
MIT © LucaIsMyName
For more detailed examples and community support, visit our GitHub Repository.
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago