From 312677e6246750a1a015b5729a9bf04710a7bee9 Mon Sep 17 00:00:00 2001 From: gahusb Date: Wed, 8 Apr 2026 08:48:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor(music-lab):=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EB=B6=84=ED=95=A0=20=E2=80=94=20AudioPlay?= =?UTF-8?q?er,=20LyricsTab,=20CreditsBadge=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- src/pages/music/MusicStudio.css | 23 ++ src/pages/music/MusicStudio.jsx | 384 +------------------- src/pages/music/components/AudioPlayer.jsx | 128 +++++++ src/pages/music/components/CreditsBadge.jsx | 36 ++ src/pages/music/components/LyricsTab.jsx | 245 +++++++++++++ 5 files changed, 438 insertions(+), 378 deletions(-) create mode 100644 src/pages/music/components/AudioPlayer.jsx create mode 100644 src/pages/music/components/CreditsBadge.jsx create mode 100644 src/pages/music/components/LyricsTab.jsx diff --git a/src/pages/music/MusicStudio.css b/src/pages/music/MusicStudio.css index 89df6ed..3c7adff 100644 --- a/src/pages/music/MusicStudio.css +++ b/src/pages/music/MusicStudio.css @@ -2426,3 +2426,26 @@ animation: none !important; } } + +/* ── Phase 1: Credits Badge ─────────────────────────────── */ +.ms-credits-badge { + display: inline-flex; align-items: center; gap: 6px; + padding: 6px 14px; border-radius: 20px; + background: rgba(245, 166, 35, 0.1); + border: 1px solid rgba(245, 166, 35, 0.25); + font-family: 'Courier Prime', monospace; + font-size: 0.85rem; color: var(--ms-accent); +} +.ms-credits-badge__icon { font-size: 1rem; } +.ms-credits-badge__value { font-weight: 700; font-size: 1.1rem; } +.ms-credits-badge__label { color: var(--ms-muted); font-size: 0.75rem; text-transform: uppercase; } +.ms-credits-badge.is-low { + background: rgba(231, 76, 60, 0.15); + border-color: rgba(231, 76, 60, 0.4); + color: #e74c3c; + animation: pulse-badge 1.5s ease-in-out infinite; +} +@keyframes pulse-badge { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.6; } +} diff --git a/src/pages/music/MusicStudio.jsx b/src/pages/music/MusicStudio.jsx index fb0d61d..57ef7eb 100644 --- a/src/pages/music/MusicStudio.jsx +++ b/src/pages/music/MusicStudio.jsx @@ -7,15 +7,14 @@ import { getMusicProviders, getMusicStatus, getMusicModels, - getMusicCredits, extendMusicTrack, removeVocals, - getSavedLyrics, - saveLyrics, - updateLyrics, - deleteLyrics, } from '../../api'; import './MusicStudio.css'; +import AudioPlayer from './components/AudioPlayer'; +import { fmtTime } from './components/AudioPlayer'; +import CreditsBadge from './components/CreditsBadge'; +import LyricsTab from './components/LyricsTab'; /* ───────────────────────────────────────────── 데이터 상수 @@ -83,12 +82,6 @@ const SIM_STEPS = [ { msg: 'Track ready!', pct: 100 }, ]; -/* ───────────────────────────────────────────── - 유틸 -───────────────────────────────────────────── */ -const pad = (n) => String(Math.floor(n)).padStart(2, '0'); -const fmtTime = (s) => `${pad(s / 60)}:${pad(s % 60)}`; - /* ───────────────────────────────────────────── Loading Skeleton ───────────────────────────────────────────── */ @@ -261,125 +254,6 @@ const GenerationProgress = ({ progress, stepMsg }) => ( ); -/* ───────────────────────────────────────────── - Audio Player (실제