| <!DOCTYPE html> |
| <html lang="ko"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Melodify - ์์
์คํธ๋ฆฌ๋ฐ ์๋น์ค</title> |
| <link rel="icon" type="image/x-icon" href="/static/favicon.ico"> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet"> |
| <script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script> |
| <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> |
| <script src="https://unpkg.com/feather-icons"></script> |
| <style> |
| @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap'); |
| |
| body { |
| font-family: 'Noto Sans KR', sans-serif; |
| background: linear-gradient(135deg, #ff6b6b, #ff8e8e, #ffafcc); |
| min-height: 100vh; |
| color: #fff; |
| text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); |
| } |
| |
| .glass-effect { |
| background: rgba(255, 255, 255, 0.15); |
| backdrop-filter: blur(10px); |
| -webkit-backdrop-filter: blur(10px); |
| border: 1px solid rgba(255, 255, 255, 0.25); |
| } |
| |
| .song-card:hover { |
| transform: translateY(-5px); |
| transition: all 0.3s ease; |
| box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2); |
| } |
| |
| .progress-bar { |
| height: 4px; |
| background: rgba(255, 255, 255, 0.3); |
| border-radius: 2px; |
| overflow: hidden; |
| } |
| |
| .progress-fill { |
| height: 100%; |
| background: #ff6b6b; |
| width: 30%; |
| } |
| |
| .player-controls button:hover { |
| background: rgba(255, 255, 255, 0.3); |
| border-radius: 50%; |
| } |
| |
| .volume-slider { |
| -webkit-appearance: none; |
| width: 100px; |
| height: 4px; |
| background: rgba(255, 255, 255, 0.3); |
| border-radius: 2px; |
| outline: none; |
| } |
| |
| .volume-slider::-webkit-slider-thumb { |
| -webkit-appearance: none; |
| appearance: none; |
| width: 12px; |
| height: 12px; |
| border-radius: 50%; |
| background: #fff; |
| cursor: pointer; |
| } |
| |
| .active-tab { |
| border-bottom: 2px solid #ff6b6b; |
| color: #ff6b6b !important; |
| font-weight: 600; |
| text-shadow: none; |
| } |
| |
| .genre-chip { |
| transition: all 0.2s ease; |
| } |
| |
| .genre-chip:hover { |
| background: #ff6b6b; |
| color: white; |
| text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); |
| } |
| |
| .playlist-card { |
| transition: all 0.3s ease; |
| } |
| |
| .text-improved { |
| text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); |
| } |
| |
| .text-bold { |
| font-weight: 600; |
| } |
| |
| .playlist-card:hover .playlist-overlay { |
| opacity: 1; |
| } |
| |
| .playlist-overlay { |
| opacity: 0; |
| transition: opacity 0.3s ease; |
| } |
| |
| |
| @media (max-width: 768px) { |
| .sidebar { |
| transform: translateX(-100%); |
| position: fixed; |
| z-index: 40; |
| height: 100vh; |
| } |
| |
| .sidebar.open { |
| transform: translateX(0); |
| } |
| |
| .mobile-menu-button { |
| display: block; |
| } |
| } |
| </style> |
| </head> |
| <body class="min-h-screen flex flex-col"> |
| |
| <nav class="glass-effect fixed w-full z-50"> |
| <div class="container mx-auto px-4 py-3 flex items-center justify-between"> |
| <div class="flex items-center space-x-2"> |
| <i data-feather="music" class="text-pink-500"></i> |
| <span class="text-xl font-bold">Melodify</span> |
| </div> |
| |
| <div class="hidden md:flex items-center space-x-6"> |
| <a href="index.html" class="text-white hover:text-pink-300 transition">ํ</a> |
| <a href="#" class="text-white hover:text-pink-300 transition">๊ฒ์</a> |
| <a href="library.html" class="text-white hover:text-pink-300 transition">๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ</a> |
| </div> |
| |
| <div class="flex items-center space-x-4"> |
| <div class="relative hidden md:block"> |
| <input type="text" placeholder="์์
, ์ํฐ์คํธ, ์จ๋ฒ ๊ฒ์..." |
| class="bg-gray-800 text-white px-4 py-2 rounded-full focus:outline-none focus:ring-2 focus:ring-pink-500 w-64"> |
| <i data-feather="search" class="absolute right-3 top-2.5 text-gray-400"></i> |
| </div> |
| |
| <button class="md:hidden mobile-menu-button"> |
| <i data-feather="menu"></i> |
| </button> |
| |
| <div class="flex items-center space-x-2 cursor-pointer"> |
| <img src="http://static.photos/people/40x40/1" alt="ํ๋กํ" class="w-8 h-8 rounded-full"> |
| <span class="hidden md:block">์ฌ์ฉ์๋</span> |
| </div> |
| </div> |
| </div> |
| </nav> |
|
|
| |
| <div class="sidebar glass-effect w-64 p-6 md:hidden fixed inset-y-0 left-0 transform transition duration-300 ease-in-out"> |
| <div class="flex justify-between items-center mb-8"> |
| <div class="flex items-center space-x-2"> |
| <i data-feather="music" class="text-pink-500"></i> |
| <span class="text-xl font-bold">Melodify</span> |
| </div> |
| <button class="close-sidebar"> |
| <i data-feather="x"></i> |
| </button> |
| </div> |
| |
| <div class="space-y-6"> |
| <a href="#" class="block text-white hover:text-pink-300 transition">ํ</a> |
| <a href="#" class="block text-white hover:text-pink-300 transition">๊ฒ์</a> |
| <a href="#" class="block text-white hover:text-pink-300 transition">๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ</a> |
| |
| <div class="pt-6 border-t border-gray-700"> |
| <h3 class="text-gray-400 uppercase text-xs tracking-wide mb-4">๋ด ํ๋ ์ด๋ฆฌ์คํธ</h3> |
| <div class="space-y-3"> |
| <a href="#" class="block text-white hover:text-pink-300 transition">์ธ์ ์์
</a> |
| <a href="#" class="block text-white hover:text-pink-300 transition">์์
์ฉ ํ๋ ์ด๋ฆฌ์คํธ</a> |
| <a href="#" class="block text-white hover:text-pink-300 transition">์ด๋ํ ๋</a> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <main class="flex-1 container mx-auto px-4 pt-24 pb-32"> |
| |
| <section class="mb-12" data-aos="fade-up"> |
| <div class="glass-effect rounded-2xl p-8 md:p-12 flex flex-col md:flex-row items-center"> |
| <div class="md:w-1/2 mb-6 md:mb-0"> |
| <h1 class="text-4xl md:text-5xl font-bold mb-4">๋น์ ๋ง์ ์ํ ์์
</h1> |
| <p class="text-xl text-gray-300 mb-6">์๋ฐฑ๋ง ๊ณก์ ์์
์ ๋ฌด์ ํ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ๊ณ , ๊ฐ์ธ ๋ง์ถค ์ถ์ฒ์ ๋ฐ์๋ณด์ธ์.</p> |
| <button class="bg-pink-600 hover:bg-pink-700 text-white px-6 py-3 rounded-full font-medium transition"> |
| ์ง๊ธ ์์ํ๊ธฐ |
| </button> |
| </div> |
| <div class="md:w-1/2 flex justify-center"> |
| <img src="http://static.photos/music/500x500/1" alt="์์
์คํธ๋ฆฌ๋ฐ" class="rounded-2xl w-full max-w-md"> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-12" data-aos="fade-up"> |
| <div class="flex justify-between items-center mb-6"> |
| <h2 class="text-2xl font-bold">์ธ๊ธฐ ์์
</h2> |
| <div class="flex space-x-2"> |
| <button class="px-4 py-2 rounded-full glass-effect text-sm active-tab">์ธ๊ธฐ์</button> |
| <button class="px-4 py-2 rounded-full glass-effect text-sm">์ต์ ์</button> |
| <button class="px-4 py-2 rounded-full glass-effect text-sm">์ฅ๋ฅด๋ณ</button> |
| </div> |
| </div> |
| |
| <div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4"> |
| |
| <div class="song-card glass-effect rounded-xl p-4 cursor-pointer"> |
| <div class="relative mb-4"> |
| <img src="http://static.photos/music/300x300/1" alt="์์
์จ๋ฒ" class="w-full rounded-lg"> |
| <button class="absolute bottom-2 right-2 bg-purple-600 p-3 rounded-full hover:bg-purple-700 transition"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </div> |
| <h3 class="font-medium truncate">๋
ธ๋ ์ ๋ชฉ</h3> |
| <p class="text-gray-400 text-sm truncate">์ํฐ์คํธ ์ด๋ฆ</p> |
| </div> |
| |
| |
| <div class="song-card glass-effect rounded-xl p-4 cursor-pointer"> |
| <div class="relative mb-4"> |
| <img src="http://static.photos/music/300x300/2" alt="์์
์จ๋ฒ" class="w-full rounded-lg"> |
| <button class="absolute bottom-2 right-2 bg-purple-600 p-3 rounded-full hover:bg-purple-700 transition"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </div> |
| <h3 class="font-medium truncate">๋์ค ํ์</h3> |
| <p class="text-gray-400 text-sm truncate">ํ ์คํ</p> |
| </div> |
| |
| <div class="song-card glass-effect rounded-xl p-4 cursor-pointer"> |
| <div class="relative mb-4"> |
| <img src="http://static.photos/music/300x300/3" alt="์์
์จ๋ฒ" class="w-full rounded-lg"> |
| <button class="absolute bottom-2 right-2 bg-purple-600 p-3 rounded-full hover:bg-purple-700 transition"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </div> |
| <h3 class="font-medium truncate">๊ฐ์ฑ ๋ฐ๋ผ๋</h3> |
| <p class="text-gray-400 text-sm truncate">๋ฐ๋ผ๋ ๊ฐ์</p> |
| </div> |
| |
| <div class="song-card glass-effect rounded-xl p-4 cursor-pointer"> |
| <div class="relative mb-4"> |
| <img src="http://static.photos/music/300x300/4" alt="์์
์จ๋ฒ" class="w-full rounded-lg"> |
| <button class="absolute bottom-2 right-2 bg-purple-600 p-3 rounded-full hover:bg-purple-700 transition"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </div> |
| <h3 class="font-medium truncate">ํํฉ ๋นํธ</h3> |
| <p class="text-gray-400 text-sm truncate">๋ํผ ์ด๋ฆ</p> |
| </div> |
| |
| <div class="song-card glass-effect rounded-xl p-4 cursor-pointer"> |
| <div class="relative mb-4"> |
| <img src="http://static.photos/music/300x300/5" alt="์์
์จ๋ฒ" class="w-full rounded-lg"> |
| <button class="absolute bottom-2 right-2 bg-purple-600 p-3 rounded-full hover:bg-purple-700 transition"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </div> |
| <h3 class="font-medium truncate">์ผ๋ ํธ๋ก๋</h3> |
| <p class="text-gray-400 text-sm truncate">EDM ์ํฐ์คํธ</p> |
| </div> |
| |
| <div class="song-card glass-effect rounded-xl p-4 cursor-pointer"> |
| <div class="relative mb-4"> |
| <img src="http://static.photos/music/300x300/6" alt="์์
์จ๋ฒ" class="w-full rounded-lg"> |
| <button class="absolute bottom-2 right-2 bg-purple-600 p-3 rounded-full hover:bg-purple-700 transition"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </div> |
| <h3 class="font-medium truncate">๋ฝ ์ค ๋กค</h3> |
| <p class="text-gray-400 text-sm truncate">๋ฝ ๋ฐด๋</p> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-12" data-aos="fade-up"> |
| <h2 class="text-2xl font-bold mb-6">์ฅ๋ฅด๋ณ ํ์</h2> |
| |
| <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4"> |
| <div class="genre-chip glass-effect rounded-xl p-6 text-center cursor-pointer"> |
| <i data-feather="music" class="w-8 h-8 mx-auto mb-2 text-purple-400"></i> |
| <p>ํ</p> |
| </div> |
| |
| <div class="genre-chip glass-effect rounded-xl p-6 text-center cursor-pointer"> |
| <i data-feather="activity" class="w-8 h-8 mx-auto mb-2 text-purple-400"></i> |
| <p>ํํฉ</p> |
| </div> |
| |
| <div class="genre-chip glass-effect rounded-xl p-6 text-center cursor-pointer"> |
| <i data-feather="heart" class="w-8 h-8 mx-auto mb-2 text-purple-400"></i> |
| <p>R&B</p> |
| </div> |
| |
| <div class="genre-chip glass-effect rounded-xl p-6 text-center cursor-pointer"> |
| <i data-feather="zap" class="w-8 h-8 mx-auto mb-2 text-purple-400"></i> |
| <p>์ผ๋ ํธ๋ก๋</p> |
| </div> |
| |
| <div class="genre-chip glass-effect rounded-xl p-6 text-center cursor-pointer"> |
| <i data-feather="star" class="w-8 h-8 mx-auto mb-2 text-purple-400"></i> |
| <p>๋ฝ</p> |
| </div> |
| |
| <div class="genre-chip glass-effect rounded-xl p-6 text-center cursor-pointer"> |
| <i data-feather="mic" class="w-8 h-8 mx-auto mb-2 text-purple-400"></i> |
| <p>๋ฐ๋ผ๋</p> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-12" data-aos="fade-up"> |
| <h2 class="text-2xl font-bold mb-6">์ถ์ฒ ํ๋ ์ด๋ฆฌ์คํธ</h2> |
| |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> |
| <div class="playlist-card glass-effect rounded-xl overflow-hidden cursor-pointer"> |
| <div class="relative"> |
| <img src="http://static.photos/music/600x600/10" alt="ํ๋ ์ด๋ฆฌ์คํธ" class="w-full h-48 object-cover"> |
| <div class="playlist-overlay absolute inset-0 bg-black bg-opacity-40 flex items-center justify-center"> |
| <button class="bg-pink-600 p-4 rounded-full hover:bg-pink-700 transition"> |
| <i data-feather="play" class="w-6 h-6"></i> |
| </button> |
| </div> |
| </div> |
| <div class="p-4"> |
| <h3 class="font-medium mb-1 text-bold">ํด์์ ์ํ ํ๋ ์ด๋ฆฌ์คํธ</h3> |
| <p class="text-gray-200 text-sm">30๊ณก ยท 2์๊ฐ</p> |
| </div> |
| </div> |
| |
| <div class="playlist-card glass-effect rounded-xl overflow-hidden cursor-pointer"> |
| <div class="relative"> |
| <img src="http://static.photos/music/600x600/11" alt="ํ๋ ์ด๋ฆฌ์คํธ" class="w-full h-48 object-cover"> |
| <div classๆ playlist-overlay absolute inset-0 bg-black bg-opacity-40 flex items-center justify-center"> |
| <button class="bg-pink-600 p-4 rounded-full hover:bg-pink-700 transition"> |
| <i data-feather="play" class="w-6 h-6"></i> |
| </button> |
| </div> |
| </div> |
| <div class="p-4"> |
| <h3 class="font-medium mb-1 text-bold">์๋์ง ์ถฉ์ ์์
</h3> |
| <p class="text-gray-200 text-sm">25๊ณก ยท 1์๊ฐ 30๋ถ</p> |
| </div> |
| </div> |
| |
| <div class="playlist-card glass-effect rounded-xl overflow-hidden cursor-pointer"> |
| <div class="relative"> |
| <img src="http://static.photos/music/600x600/12" alt="ํ๋ ์ด๋ฆฌ์คํธ" class="w-full h-48 object-cover"> |
| <div class="playlist-overlay absolute inset-0 bg-black bg-opacity-40 flex items-center justify-center"> |
| <button class="bg-pink-600 p-4 rounded-full hover:bg-pink-700 transition"> |
| <i data-feather="play" class="w-6 h-6"></i> |
| </button> |
| </div> |
| </div> |
| <div class="p-4"> |
| <h3 class="font-medium mb-1 text-bold">์ง์ค๋ ฅ์ ๋์ด๋ ์์
</h3> |
| <p class="text-gray-200 text-sm">20๊ณก ยท 1์๊ฐ 15๋ถ</p> |
| </div> |
| </div> |
| </div> |
| </section> |
| </main> |
|
|
| |
| <div class="fixed bottom-0 left-0 right-0 glass-effect p-4"> |
| <div class="container mx-auto flex items-center justify-between"> |
| <div class="flex items-center space-x-4 w-1/4"> |
| <img src="http://static.photos/music/60x60/1" alt="ํ์ฌ ์ฌ์ ์ค" class="w-12 h-12 rounded"> |
| <div> |
| <p class="font-medium text-sm truncate text-bold">ํ์ฌ ์ฌ์ ์ค์ธ ๋
ธ๋</p> |
| <p class="text-gray-200 text-xs">์ํฐ์คํธ</p> |
| </div> |
| <button> |
| <i data-feather="heart" class="w-4 h-4 text-gray-300 hover:text-pink-400"></i> |
| </button> |
| </div> |
| |
| <div class="flex flex-col items-center w-2/4"> |
| <div class="player-controls flex items-center space-x-6 mb-2"> |
| <button> |
| <i data-feather="shuffle" class="w-4 h-4 text-gray-400 hover:text-white"></i> |
| </button> |
| <button> |
| <i data-feather="skip-back" class="w-5 h-5 hover:text-white"></i> |
| </button> |
| <button class="bg-white p-3 rounded-full hover:bg-gray-200"> |
| <i data-feather="play" class="w-5 h-5 text-black"></i> |
| </button> |
| <button> |
| <i data-feather="skip-forward" class="w-5 h-5 hover:text-white"></i> |
| </button> |
| <button> |
| <i data-feather="repeat" class="w-4 h-4 text-gray-400 hover:text-white"></i> |
| </button> |
| </div> |
| |
| <div class="w-full flex items-center space-x-3"> |
| <span class="text-xs text-gray-300">1:23</span> |
| <div class="progress-bar flex-1"> |
| <div class="progress-fill"></div> |
| </div> |
| <span class="text-xs text-gray-300">4:15</span> |
| </div> |
| </div> |
| |
| <div class="flex items-center justify-end space-x-4 w-1/4"> |
| <button> |
| <i data-feather="list" class="w-4 h-4 hover:text-white"></i> |
| </button> |
| <div class="flex items-center space-x-2"> |
| <i data-feather="volume-2" class="w-4 h-4"></i> |
| <input type="range" min="0" max="100" value="80" class="volume-slider"> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <script> |
| |
| AOS.init({ |
| duration: 800, |
| easing: 'ease-in-out', |
| once: true |
| }); |
| |
| |
| feather.replace(); |
| |
| |
| document.querySelector('.mobile-menu-button').addEventListener('click', function() { |
| document.querySelector('.sidebar').classList.add('open'); |
| }); |
| |
| document.querySelector('.close-sidebar').addEventListener('click', function() { |
| document.querySelector('.sidebar').classList.remove('open'); |
| }); |
| |
| |
| const playButtons = document.querySelectorAll('.song-card button, .playlist-overlay button'); |
| const playerPlayButton = document.querySelector('.player-controls button:nth-child(3)'); |
| let isPlaying = false; |
| |
| playButtons.forEach(button => { |
| button.addEventListener('click', function() { |
| |
| const card = this.closest('.song-card') || this.closest('.playlist-card'); |
| const title = card.querySelector('h3').textContent; |
| const artist = card.querySelector('p').textContent; |
| const imgSrc = card.querySelector('img').src; |
| |
| document.querySelector('.fixed.bottom-0 img').src = imgSrc; |
| document.querySelector('.fixed.bottom-0 .font-medium').textContent = title; |
| document.querySelector('.fixed.bottom-0 .text-gray-400').textContent = artist; |
| |
| |
| playerPlayButton.innerHTML = '<i data-feather="pause" class="w-5 h-5 text-black"></i>'; |
| feather.replace(); |
| isPlaying = true; |
| }); |
| }); |
| |
| |
| playerPlayButton.addEventListener('click', function() { |
| if (isPlaying) { |
| this.innerHTML = '<i data-feather="play" class="w-5 h-5 text-black"></i>'; |
| } else { |
| this.innerHTML = '<i data-feather="pause" class="w-5 h-5 text-black"></i>'; |
| } |
| feather.replace(); |
| isPlaying = !isPlaying; |
| }); |
| |
| |
| const likeButton = document.querySelector('.fixed.bottom-0 button:nth-child(3)'); |
| likeButton.addEventListener('click', function() { |
| const heartIcon = this.querySelector('i'); |
| if (heartIcon.classList.contains('text-gray-400')) { |
| heartIcon.classList.remove('text-gray-400'); |
| heartIcon.classList.add('text-red-500'); |
| } else { |
| heartIcon.classList.remove('text-red-500'); |
| heartIcon.classList.add('text-gray-400'); |
| } |
| }); |
| |
| |
| const tabButtons = document.querySelectorAll('.flex.space-x-2 button'); |
| tabButtons.forEach(button => { |
| button.addEventListener('click', function() { |
| tabButtons.forEach(btn => btn.classList.remove('active-tab')); |
| this.classList.add('active-tab'); |
| }); |
| }); |
| </script> |
| </body> |
| </html> |
|
|