| <!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 active-tab">๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ</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="index.html" class="block text-white hover:text-pink-300 transition">ํ</a> |
| <a href="#" class="block text-white hover:text-pink-300 transition">๊ฒ์</a> |
| <a href="library.html" class="block text-white hover:text-pink-300 transition active-tab">๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ</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-8" data-aos="fade-up"> |
| <div class="flex items-center justify-between"> |
| <h1 class="text-3xl font-bold">๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ</h1> |
| <button class="glass-effect px-4 py-2 rounded-full flex items-center space-x-2"> |
| <i data-feather="plus" class="w-4 h-4"></i> |
| <span>์ ํ๋ ์ด๋ฆฌ์คํธ</span> |
| </button> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-12" data-aos="fade-up"> |
| <h2 class="text-2xl font-bold mb-6">์ข์์ ํ์ํ ์์
</h2> |
| |
| <div class="glass-effect rounded-2xl p-6"> |
| <div class="overflow-x-auto"> |
| <table class="w-full"> |
| <thead> |
| <tr class="border-b border-gray-700"> |
| <th class="pb-3 text-left text-gray-400">#</th> |
| <th class="pb-3 text-left text-gray-400">์ ๋ชฉ</th> |
| <th class="pb-3 text-left text-gray-400">์ํฐ์คํธ</th> |
| <th class="pb-3 text-left text-gray-400">์จ๋ฒ</th> |
| <th class="pb-3 text-left text-gray-400">์ถ๊ฐํ ๋ ์ง</th> |
| <th class="pb-3 text-left text-gray-400"></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr class="border-b border-gray-700 hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4">1</td> |
| <td class="py-4 font-medium">๊ฐ์ฑ ๋ฐ๋ผ๋</td> |
| <td class="py-4 text-gray-300">๋ฐ๋ผ๋ ๊ฐ์</td> |
| <td class="py-4 text-gray-300">๊ฐ์ฑ ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">3์ผ ์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| <tr class="border-b border-gray-700 hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4">2</td> |
| <td class="py-4 font-medium">๋์ค ํ์</td> |
| <td class="py-4 text-gray-300">ํ ์คํ</td> |
| <td class="py-4 text-gray-300">๋์ค ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">1์ฃผ ์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| <tr class="border-b border-gray-700 hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4">3</td> |
| <td class="py-4 font-medium">ํํฉ ๋นํธ</td> |
| <td class="py-4 text-gray-300">๋ํผ ์ด๋ฆ</td> |
| <td class="py-4 text-gray-300">ํํฉ ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">2์ฃผ ์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| <tr class="hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4">4</td> |
| <td class="py-4 font-medium">์ผ๋ ํธ๋ก๋</td> |
| <td class="py-4 text-gray-300">EDM ์ํฐ์คํธ</td> |
| <td class="py-4 text-gray-300">์ผ๋ ํธ๋ก๋ ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">3์ฃผ ์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </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/20" 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">15๊ณก ยท 1์๊ฐ 10๋ถ</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/21" 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์๊ฐ 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/22" 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์๊ฐ 45๋ถ</p> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| |
| <section class="mb-12" data-aos="fade-up"> |
| <h2 class="text-2xl font-bold mb-6">์ต๊ทผ ์ฌ์ํ ์์
</h2> |
| |
| <div class="glass-effect rounded-2xl p-6"> |
| <div class="overflow-x-auto"> |
| <table class="w-full"> |
| <thead> |
| <tr class="border-b border-gray-700"> |
| <th class="pb-3 text-left text-gray-400">์ ๋ชฉ</th> |
| <th class="pb-3 text-left text-gray-400">์ํฐ์คํธ</th> |
| <th class="pb-3 text-left text-gray-400">์จ๋ฒ</th> |
| <th class="pb-3 text-left text-gray-400">์ฌ์ ์๊ฐ</th> |
| <th class="pb-3 text-left text-gray-400"></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr class="border-b border-gray-700 hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4 font-medium">๊ฐ์ฑ ๋ฐ๋ผ๋</td> |
| <td class="py-4 text-gray-300">๋ฐ๋ผ๋ ๊ฐ์</td> |
| <td class="py-4 text-gray-300">๊ฐ์ฑ ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">์ค๋</td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| <tr class="border-b border-gray-700 hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4 font-medium">๋์ค ํ์</td> |
| <td class="py-4 text-gray-300">ํ ์คํ</td> |
| <td class="py-4 text-gray-300">๋์ค ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">์ด์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| <tr class="border-b border-gray-700 hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="py-4 font-medium">ํํฉ ๋นํธ</td> |
| <td class="py-4 text-gray-300">๋ํผ ์ด๋ฆ</td> |
| <td class="py-4 text-gray-300">ํํฉ ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">2์ผ ์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| <tr class="hover:bg-white hover:bg-opacity-10 cursor-pointer"> |
| <td class="ๆ font-medium">์ผ๋ ํธ๋ก๋</td> |
| <td class="py-4 text-gray-300">EDM ์ํฐ์คํธ</td> |
| <td class="py-4 text-gray-300">์ผ๋ ํธ๋ก๋ ์จ๋ฒ</td> |
| <td class="py-4 text-gray-300">3์ผ ์ </td> |
| <td class="py-4"> |
| <button class="text-pink-400 hover:text-pink-300"> |
| <i data-feather="play" class="w-4 h-4"></i> |
| </button> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| </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-ๆ 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> |
| <ๆ 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, table button'); |
| const playerPlayButton = document.querySelector('.player-controls button:nth-child(3)'); |
| let isPlaying = false; |
| |
| playButtons.forEach(button => { |
| button.addEventListener('click', function() { |
| |
| const row = this.closest('tr'); |
| if (row) { |
| const title = row.querySelector('td:nth-child(1)').textContent; |
| const artist = row.querySelector('td:nth-child(2)').textContent; |
| |
| 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'); |
| } |
| }); |
| </script> |
| </body> |
| </html> |