curio.
no. 06 · music

Polaroid

The album cover pinned like a photo; it straightens up on hover.

Install

npx shadcn@latest add https://curio-components.vercel.app/r/polaroid.json

First curio component? Also add @import "./curio.css"; to your global CSS. See installation.

Usage

import { Polaroid } from '@/components/curio/music/polaroid'

const track = {
  title: 'Slow Tides',
  artist: 'The Quiet Hours',
  art: '/cover.jpg',
  url: 'https://open.spotify.com/...',
  isPlaying: true,
}

export function NowPlaying() {
  return <Polaroid track={track} />
}

Props

PropTypeDefaultDescription
trackTrack-Title, artist, album, art, url, isPlaying, playedAt.
captionstring-Text under the photo.

Source

This is exactly what the command copies into your project.

components/curio/music/polaroid.tsx
import { trackStatus, type Track } from '../lib/types'

// the cover pinned like a photo; straightens up on hover
export function Polaroid({ track: t, caption }: { track: Track; caption?: string }) {
  return (
    <a href={t.url} target="_blank" rel="noopener noreferrer" className="group flex items-center gap-6">
      <div
        className="w-[132px] shrink-0 -rotate-3 p-2 pb-7 shadow-[0_12px_28px_-10px_rgba(0,0,0,0.35)] transition-transform duration-300 group-hover:-translate-y-1 group-hover:rotate-0"
        style={{ background: '#fbfbf8' }}
      >
        {t.art ? (
          // eslint-disable-next-line @next/next/no-img-element
          <img src={t.art} alt={`${t.title} by ${t.artist}`} className="block aspect-square w-full object-cover" />
        ) : (
          <span className="block aspect-square w-full bg-neutral-200" />
        )}
        <div className="mt-2 truncate text-center text-[11px] text-neutral-500">
          {caption ?? (t.isPlaying ? 'Now playing' : 'On repeat')}
        </div>
      </div>
      <div className="min-w-0">
        <div className="text-xs" style={{ color: 'var(--curio-muted)' }}>
          <span suppressHydrationWarning>{trackStatus(t)}</span>
        </div>
        <div className="mt-1 text-[22px] font-medium leading-tight tracking-[-0.03em] transition-colors group-hover:text-[var(--curio-accent)]" style={{ color: 'var(--curio-fg)' }}>
          {t.title}
        </div>
        <div className="mt-0.5 text-[14px]" style={{ color: 'var(--curio-muted)' }}>
          {t.artist}
        </div>
      </div>
    </a>
  )
}