Cards cardmusic
Mini Music Player
Compact player widget with controls and progress bar.
Preview
Usage
Copy the full block below to use this component with its imports.
astro
---
import { MiniMusicPlayer } from 'astro-component-kit';
---
<MusicPlayerMini title="Moonlight" artist="Astro Orchestra" progress={60} /> ---
import { MiniMusicPlayer } from 'astro-component-kit';
---
<MusicPlayerMini title="Moonlight" artist="Astro Orchestra" progress={60} /> Manual Installation
If you are not using the npm package, create a new file src/components/lib/MiniMusicPlayer.astro and paste the following code:
astro
---
/**
* MusicPlayerMini — Compact player widget with controls and progress bar.
*
* @param {string} title - The song track title.
* @param {string} artist - The artist or band name.
* @param {string} coverUrl - Optional string matching the album cover image URL.
* @param {number} progress - The song progress representation (0 to 100). Default is 40.
*/
interface Props {
title: string;
artist: string;
coverUrl?: string;
progress?: number;
}
const { title, artist, coverUrl, progress = 40 } = Astro.props;
---
<div class="music-mini">
<div class="music-mini__art" style={coverUrl ? `background-image: url('${coverUrl}'); background-size: cover;` : ''}></div>
<div class="music-mini__track">
<h4 class="music-mini__title">{title}</h4>
<p class="music-mini__artist">{artist}</p>
<div class="music-mini__progress" role="progressbar" aria-valuenow={progress} aria-valuemin="0" aria-valuemax="100">
<div class="music-mini__bar" style={`width: ${progress}%;`}></div>
</div>
</div>
<button class="music-mini__play" type="button" aria-label="Play track">▶</button>
</div>
<style>
.music-mini {
display: flex; align-items: center; gap: var(--sp-4, 1rem);
background: var(--c-bg-elev, #111);
padding: var(--sp-3, 0.75rem);
border-radius: var(--r-md, 14px); border: 1px solid var(--c-border, #333);
width: 100%; max-width: 320px;
}
.music-mini__art {
width: 50px; height: 50px;
background-color: var(--c-primary-light, #818cf8);
border-radius: var(--r-sm, 8px); flex-shrink: 0;
}
.music-mini__track { flex: 1; }
.music-mini__title { font-size: 0.85rem; color: var(--c-text-1, #fff); margin: 0; }
.music-mini__artist { font-size: 0.7rem; color: var(--c-text-2, #64748b); margin: 0; }
.music-mini__progress {
height: 3px; background: rgba(255,255,255,0.1);
border-radius: 2px; margin-top: 8px; position: relative; overflow: hidden;
}
.music-mini__bar {
position: absolute; left: 0; top: 0; height: 100%;
background: var(--c-primary, #6366f1); border-radius: 2px;
}
.music-mini__play {
font-size: 1.2rem; cursor: pointer; color: var(--c-text-1, #fff);
background: none; border: none; padding: 0.25rem; display: grid; place-items: center;
}
.music-mini__play:hover { color: var(--c-primary-light, #818cf8); }
</style> ---
/**
* MusicPlayerMini — Compact player widget with controls and progress bar.
*
* @param {string} title - The song track title.
* @param {string} artist - The artist or band name.
* @param {string} coverUrl - Optional string matching the album cover image URL.
* @param {number} progress - The song progress representation (0 to 100). Default is 40.
*/
interface Props {
title: string;
artist: string;
coverUrl?: string;
progress?: number;
}
const { title, artist, coverUrl, progress = 40 } = Astro.props;
---
<div class="music-mini">
<div class="music-mini__art" style={coverUrl ? `background-image: url('${coverUrl}'); background-size: cover;` : ''}></div>
<div class="music-mini__track">
<h4 class="music-mini__title">{title}</h4>
<p class="music-mini__artist">{artist}</p>
<div class="music-mini__progress" role="progressbar" aria-valuenow={progress} aria-valuemin="0" aria-valuemax="100">
<div class="music-mini__bar" style={`width: ${progress}%;`}></div>
</div>
</div>
<button class="music-mini__play" type="button" aria-label="Play track">▶</button>
</div>
<style>
.music-mini {
display: flex; align-items: center; gap: var(--sp-4, 1rem);
background: var(--c-bg-elev, #111);
padding: var(--sp-3, 0.75rem);
border-radius: var(--r-md, 14px); border: 1px solid var(--c-border, #333);
width: 100%; max-width: 320px;
}
.music-mini__art {
width: 50px; height: 50px;
background-color: var(--c-primary-light, #818cf8);
border-radius: var(--r-sm, 8px); flex-shrink: 0;
}
.music-mini__track { flex: 1; }
.music-mini__title { font-size: 0.85rem; color: var(--c-text-1, #fff); margin: 0; }
.music-mini__artist { font-size: 0.7rem; color: var(--c-text-2, #64748b); margin: 0; }
.music-mini__progress {
height: 3px; background: rgba(255,255,255,0.1);
border-radius: 2px; margin-top: 8px; position: relative; overflow: hidden;
}
.music-mini__bar {
position: absolute; left: 0; top: 0; height: 100%;
background: var(--c-primary, #6366f1); border-radius: 2px;
}
.music-mini__play {
font-size: 1.2rem; cursor: pointer; color: var(--c-text-1, #fff);
background: none; border: none; padding: 0.25rem; display: grid; place-items: center;
}
.music-mini__play:hover { color: var(--c-primary-light, #818cf8); }
</style>
Quick Info
- Category
- Cards
- Filename
MiniMusicPlayer.astro- Dependencies
- None — pure Astro + CSS
- Tags
- cardmusic