From 61b8bf4815ba967e7851647bd93d557df3498f79 Mon Sep 17 00:00:00 2001 From: caadiq Date: Mon, 12 Jan 2026 18:00:41 +0900 Subject: [PATCH] =?UTF-8?q?PC=20=EA=B3=A1=20=EC=83=81=EC=84=B8:=20?= =?UTF-8?q?=ED=94=84=EB=A6=AC=EB=AF=B8=EC=97=84=20=EB=94=94=EC=9E=90?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/pc/public/TrackDetail.jsx | 261 +++++++++++-------- 1 file changed, 147 insertions(+), 114 deletions(-) diff --git a/frontend/src/pages/pc/public/TrackDetail.jsx b/frontend/src/pages/pc/public/TrackDetail.jsx index e6d08ae..8c6dd52 100644 --- a/frontend/src/pages/pc/public/TrackDetail.jsx +++ b/frontend/src/pages/pc/public/TrackDetail.jsx @@ -2,7 +2,7 @@ import { useState, useMemo } from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { motion } from 'framer-motion'; -import { Clock, User, Music, Mic2, Play, ExternalLink, ChevronRight } from 'lucide-react'; +import { Clock, User, Music, Mic2, Play, ExternalLink, ChevronRight, Disc3 } from 'lucide-react'; import { getTrack } from '../../../api/public/albums'; import { formatDate } from '../../../utils/date'; @@ -43,96 +43,116 @@ function TrackDetail() { initial={{ opacity: 0 }} animate={{ opacity: 1 }} transition={{ duration: 0.3 }} - className="py-16" > -
- {/* 브레드크럼 네비게이션 */} -
- - 앨범 - - / - - {track.album?.title} - - / - {track.title} -
+ {/* 히어로 섹션 - 그라데이션 배경 */} +
+
+ {/* 브레드크럼 네비게이션 */} +
+ + 앨범 + + + + {track.album?.title} + + + {track.title} +
- {/* 트랙 정보 헤더 */} -
- {/* 앨범 커버 */} - navigate(`/album/${encodeURIComponent(track.album?.title || albumName)}`)} - > - {track.album?.title} - + {/* 트랙 정보 헤더 */} +
+ {/* 앨범 커버 */} + +
navigate(`/album/${encodeURIComponent(track.album?.title || albumName)}`)} + > + {track.album?.title} +
+ {/* 재생 느낌의 오버레이 */} +
+ +
+
- {/* 트랙 정보 */} - -
- {track.is_title_track === 1 && ( - - TITLE + {/* 트랙 정보 */} + +
+ {track.is_title_track === 1 && ( + + TITLE + + )} + + Track {String(track.track_number).padStart(2, '0')} - )} - - Track {String(track.track_number).padStart(2, '0')} - -
- -

{track.title}

- - {/* 메타 정보 */} -
+
+ +

{track.title}

+ + {/* 앨범 정보 카드 */} - - {track.album?.title} - - {track.duration && ( -
- - {track.duration} + +
+

{track.album?.album_type}

+

{track.album?.title}

- )} -
+ + - {/* 뮤직비디오 링크 */} - {track.music_video_url && ( - - - 뮤직비디오 보기 - - - )} -
+ {/* 재생 시간 & 뮤비 */} +
+ {track.duration && ( +
+ + {track.duration} +
+ )} + {track.music_video_url && ( + + + 뮤직비디오 + + + )} +
+ +
+
- {/* 크레딧 & 가사 영역 */} + {/* 메인 콘텐츠 */} +
{/* 왼쪽: 크레딧 + 수록곡 */}
@@ -142,40 +162,43 @@ function TrackDetail() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.2, duration: 0.4 }} - className="bg-gray-50 rounded-2xl p-6" + className="bg-gradient-to-br from-gray-50 to-gray-100 rounded-2xl p-6 border border-gray-100" > -

크레딧

-
+

+
+ 크레딧 +

+
{track.lyricist && ( -
-
- +
+
+
-
-

작사

-

{track.lyricist}

+
+

작사

+

{track.lyricist}

)} {track.composer && ( -
-
- +
+
+
-
-

작곡

-

{track.composer}

+
+

작곡

+

{track.composer}

)} {track.arranger && ( -
-
- +
+
+
-
-

편곡

-

{track.arranger}

+
+

편곡

+

{track.arranger}

)} @@ -188,30 +211,37 @@ function TrackDetail() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.3, duration: 0.4 }} - className="bg-white border border-gray-100 rounded-2xl p-6" + className="bg-white rounded-2xl p-6 border border-gray-100 shadow-sm" > -

수록곡

+

+
+ 수록곡 +

{track.otherTracks?.map((t) => ( - + {String(t.track_number).padStart(2, '0')} {t.title} {t.is_title_track === 1 && ( - + T )} @@ -228,16 +258,19 @@ function TrackDetail() { transition={{ delay: 0.25, duration: 0.4 }} className="col-span-2" > -
-

가사

+
+

+
+ 가사 +

{track.lyrics ? ( -
+
{track.lyrics}
) : ( -
- -

가사 정보가 없습니다

+
+ +

가사 정보가 없습니다

)}