polish(immersive): improve panel styling and add canvas visualizer

- Replace emoji icons with Lucide icons in placeholder panels
- Add styled "Coming Soon" badges
- Create animated canvas visualizer (reacts to isPlaying state)
- Visualizer shows frequency bars with smooth animation
This commit is contained in:
vicrodh committed 2026-01-30 17:07:19 -06:00
1 parent 9ea9d66681
commit 4fea0dee17
3 files changed
+179 -43

No files matched your search

@@ -1,5 +1,5 @@
<script lang="ts">
import { t } from '$lib/i18n';
import { Radio } from 'lucide-svelte';
interface Props {
trackId?: number;
@@ -8,15 +8,18 @@
let { trackId, artistId }: Props = $props();
// TODO: Implement suggestions fetching in Phase 4
// TODO: Implement suggestions - Artist Radio, Track Radio, Similar Tracks
let isLoading = $state(false);
</script>
<div class="suggestions-panel">
<div class="placeholder">
<span class="placeholder-icon">📻</span>
<span class="placeholder-text">{$t('player.suggestionsComingSoon') || 'Suggestions coming soon'}</span>
<div class="placeholder-icon">
<Radio size={40} strokeWidth={1.5} />
</div>
<span class="placeholder-text">Suggestions</span>
<span class="placeholder-hint">Artist Radio, Track Radio, Similar Tracks...</span>
<span class="coming-soon">Coming Soon</span>
</div>
</div>
@@ -35,24 +38,36 @@
flex-direction: column;
align-items: center;
justify-content: center;
gap: 12px;
gap: 16px;
height: 100%;
min-height: 200px;
color: var(--alpha-40, rgba(255, 255, 255, 0.4));
}
.placeholder-icon {
font-size: 32px;
opacity: 0.5;
opacity: 0.4;
}
.placeholder-text {
font-size: 16px;
font-weight: 500;
font-size: 18px;
font-weight: 600;
color: var(--alpha-50, rgba(255, 255, 255, 0.5));
}
.placeholder-hint {
font-size: 13px;
color: var(--alpha-30, rgba(255, 255, 255, 0.3));
}
.coming-soon {
margin-top: 8px;
padding: 6px 14px;
background: var(--alpha-10, rgba(255, 255, 255, 0.1));
border-radius: 20px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--alpha-40, rgba(255, 255, 255, 0.4));
}
</style>