Diamond Diamond

ui · 6 variants · 1 categories

Audio Player

Audio player wrapper — minimal, podcast row, waveform, live radio, playlist, pill.

npx "@rueda.dev/gems-diamond" add audio-player
§01

Display

6 variants
0:00
minimal
On the discipline of shipping
EP 03 · 12 MIN
podcast
0:00
waveform
Now playing
Diamond FM · Radio
LIVE
radio
playlist
0:00
pill

Usage Guide

How to wire up this component in your app — props, callbacks, customization, and the conventions Diamond shares across the library.

Two ways to drive playback

  • Autonomous — pass src and the component renders a hidden <audio>, tracks time via native events, and lets you seek by clicking the progress bar / waveform.
  • Controlled — pass playing, progress, currentTime, duration and handle onPlayPauseToggle, onSeek. Useful for demos with no real audio, or when you orchestrate playback from a global store.
  • Hybrid — pass src and selectively override any display prop. The override wins.

Playback API

PropTypeDescription
srcstringAudio URL. When set, renders a real <audio> and manages playback.
loopbooleanLoop natively.
autoPlaybooleanTry to autoplay on mount (subject to browser policy).
volumenumber (0..1)Clamped and applied to the underlying element.
mutedbooleanMute natively.
preload"none" | "metadata" | "auto"Default 'metadata'.
onEnded / onTimeUpdate / onPlayingChangecallbacksNative lifecycle, surfaced.

Playlist variant

tracks accepts { id, title, duration?, src? }. Selecting a track swaps the source automatically. defaultActiveTrackId = uncontrolled, activeTrackId = controlled.

<AudioPlayer
  variant="playlist"
  defaultActiveTrackId={1}
  tracks={[
    { id: 1, title: "Intro", src: "/audio/01.mp3", duration: "0:42" },
    { id: 2, title: "Body", src: "/audio/02.mp3", duration: "3:18" },
  ]}
  onSelectTrack={(id) => analytics.track("track-changed", { id })}
/>

Universal patterns

Every Diamond component shares the same prop conventions, so once you learn one you can predict the others.

  • variant — discriminated union of every visual option. Categories shown above are docs-only metadata; the prop is a flat string union.
  • accent — any CSS color string. Overrides --diamond-accent just for that instance via inline style. Cascades into hover, ring, and selection states.
  • asChild (when present) — renders the underlying primitive via @radix-ui/react-slot, letting you compose with <Link>, motion.button, etc.
  • className — merged with internal Tailwind classes via cn(). Use it to override layout, spacing, or colors.
  • Native HTML attributes (onClick, aria-*, data-*, ref, etc.) flow through to the root element without any whitelist.
  • Diamond is the skin: zero domain state, zero fetch, zero providers. You wire data and reactions in your app code; the components just render and emit events.