@charset "utf-8"; @import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,300;0,400;0,600;0,700;1,300;1,800&display=swap"); @import url("bootstrap.min.css"); * { box-sizing: border-box; } html, body { height: 100%; margin: 0; padding: 0; } body { display: flex; flex-direction: column; justify-content: center; align-items: center; background-color: #000; color: #fff; font-family: "Poppins", sans-serif; overflow-x: hidden; } /* Loading Screen */ .loading-screen { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, #000 0%, #111 100%); display: flex; align-items: center; justify-content: center; z-index: 9999; transition: opacity 0.5s ease, visibility 0.5s ease; } .loading-screen.fade-out { opacity: 0; visibility: hidden; } .loading-content { text-align: center; animation: fadeInUp 0.8s ease; } .loading-artwork { width: 120px; height: 120px; margin: 0 auto 30px; position: relative; border-radius: 15px; overflow: hidden; } .loading-artwork-placeholder { width: 100%; height: 100%; background: linear-gradient(45deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%); border-radius: 15px; } .loading-pulse { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, transparent 30%, rgba(255, 255, 255, 0.1) 50%, transparent 70%); animation: shimmer 2s infinite; } .loading-title { font-size: 28px; font-weight: 700; margin-bottom: 10px; text-transform: uppercase; letter-spacing: 2px; } .loading-subtitle { font-size: 16px; color: #ccc; margin-bottom: 30px; } .loading-bar { width: 200px; height: 4px; background: rgba(255, 255, 255, 0.1); border-radius: 2px; margin: 0 auto; overflow: hidden; } .loading-progress { height: 100%; background: linear-gradient(90deg, #fff 0%, #ccc 100%); border-radius: 2px; animation: loadingProgress 2s ease-in-out infinite; } /* Skeleton Loading Animations */ .song-skeleton, .artist-skeleton, .history-song-skeleton, .history-artist-skeleton { background: linear-gradient( 90deg, rgba(255, 255, 255, 0.1) 25%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.1) 75% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: 4px; display: inline-block; width: 100%; height: 1em; } .artist-skeleton { width: 70%; } .history-song-skeleton { width: 80%; } .history-artist-skeleton { width: 60%; } /* Artwork Loading */ .loading-artwork-main { position: relative; } .artwork-loading-spinner { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 40px; height: 40px; border: 3px solid rgba(255, 255, 255, 0.1); border-top: 3px solid #fff; border-radius: 50%; animation: spin 1s linear infinite; opacity: 0; transition: opacity 0.3s ease; } .loading-artwork-main.loading .artwork-loading-spinner { opacity: 1; } /* Button Loading */ .btn-play { position: relative; overflow: hidden; } .btn-loading-spinner { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 20px; height: 20px; border: 2px solid rgba(0, 0, 0, 0.1); border-top: 2px solid #000; border-radius: 50%; animation: spin 1s linear infinite; opacity: 0; transition: opacity 0.3s ease; } .btn-play.loading .btn-loading-spinner { opacity: 1; } .btn-play.loading i, .btn-play.loading span { opacity: 0; } /* Lyrics Loading */ .lyrics-loading-dot { position: absolute; top: 8px; right: 8px; width: 6px; height: 6px; background: #fff; border-radius: 50%; animation: pulse 1.5s infinite; opacity: 0; } .lyrics.loading .lyrics-loading-dot { opacity: 1; } .lyrics-loading { padding: 20px 0; } .lyrics-skeleton-line { height: 16px; background: linear-gradient( 90deg, rgba(255, 255, 255, 0.1) 25%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.1) 75% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: 4px; margin-bottom: 12px; } .lyrics-skeleton-line.short { width: 60%; } /* History Cover Loading */ .cover-historic { position: relative; } .cover-loading-spinner { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 24px; height: 24px; border: 2px solid rgba(255, 255, 255, 0.1); border-top: 2px solid #fff; border-radius: 50%; animation: spin 1s linear infinite; opacity: 0; transition: opacity 0.3s ease; } .cover-historic.loading .cover-loading-spinner { opacity: 1; } .cover-site { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #000; z-index: 1; } #bgCover { height: 100%; width: 100%; position: absolute; background-repeat: no-repeat; background-size: cover; background-position: center; filter: blur(30px) brightness(0.3); -webkit-filter: blur(30px) brightness(0.3); transition: all 0.5s ease; transform: scale(1.1); z-index: 1; } .bg-mask { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.9) 100%); z-index: 2; } main { position: relative; z-index: 3; width: 100%; max-width: 1100px; padding: 30px; opacity: 0; animation: fadeInUp 0.8s ease 0.5s forwards; } .container { width: 100%; } /* Spotify-style Player Interface */ .player-interface { display: flex; align-items: center; gap: 60px; width: 100%; } /* Left Side: Artwork */ .player-left { flex-shrink: 0; } .main-artwork { width: 450px; height: 450px; position: relative; border-radius: 20px; overflow: hidden; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6); transition: transform 0.3s ease; border: 1px solid rgba(255, 255, 255, 0.3); } .main-artwork:hover { transform: scale(1.02); } #currentCoverArt { width: 100%; height: 100%; background: url("../img/cover.png") no-repeat center; background-size: cover; transition: background-image 1s ease; } /* Right Side: Song Info and Controls */ .player-right { flex: 1; display: flex; flex-direction: column; justify-content: center; min-width: 0; } /* Song Information */ .song-info { margin-bottom: 40px; text-align: left; } .current-song { font-size: 48px; font-weight: 700; text-transform: uppercase; margin: 0 0 15px 0; letter-spacing: 1px; line-height: 1.2; /* Line clamp for 2 lines */ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } .current-artist { font-size: 24px; font-weight: 400; color: #ccc; margin: 0; text-transform: capitalize; line-height: 1.2; /* Line clamp for 1 line */ display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } /* Player Controls */ .player-controls { display: flex; flex-direction: column; gap: 30px; align-items: flex-start; } .btn-play { background: linear-gradient(135deg, #fff 0%, #f0f0f0 100%); border: none; color: #000; padding: 18px 45px; font-size: 20px; font-weight: 700; cursor: pointer; border-radius: 50px; transition: all 0.3s ease; box-shadow: 0 8px 25px rgba(255, 255, 255, 0.2); display: flex; align-items: center; gap: 12px; min-width: 160px; justify-content: center; height: 60px; } .btn-play:hover { transform: translateY(-2px); box-shadow: 0 12px 35px rgba(255, 255, 255, 0.3); } .btn-play:active { transform: translateY(0); } /* Volume Control */ .volume-control { display: flex; align-items: center; gap: 18px; width: 100%; max-width: 400px; } .volume-icon { font-size: 22px; color: #ccc; } .volume-slide { flex: 1; } .volume-indicator { font-size: 16px; color: #ccc; min-width: 55px; text-align: right; } /* Action Buttons */ .action-buttons { display: flex; gap: 18px; flex-wrap: wrap; } .btn-secondary { background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); color: #fff; padding: 14px 24px; font-size: 15px; font-weight: 600; cursor: pointer; border-radius: 25px; transition: all 0.3s ease; text-decoration: none; display: flex; align-items: center; gap: 10px; position: relative; } .btn-secondary:hover { background: rgba(255, 255, 255, 0.2); border-color: rgba(255, 255, 255, 0.4); color: #fff; text-decoration: none; transform: translateY(-1px); } /* Range Input Styling */ input[type="range"] { -webkit-appearance: none; background: transparent; width: 100%; height: 7px; } input[type="range"]:focus { outline: none; } input[type="range"]::-webkit-slider-runnable-track { width: 100%; height: 7px; cursor: pointer; background: rgba(255, 255, 255, 0.3); border-radius: 4px; } input[type="range"]::-webkit-slider-thumb { height: 20px; width: 20px; border-radius: 50%; background: #fff; cursor: pointer; -webkit-appearance: none; margin-top: -6px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); } input[type="range"]::-moz-range-track { width: 100%; height: 7px; cursor: pointer; background: rgba(255, 255, 255, 0.3); border-radius: 4px; border: none; } input[type="range"]::-moz-range-thumb { border: none; height: 20px; width: 20px; border-radius: 50%; background: #fff; cursor: pointer; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); } /* Modal Styling */ .modal-content { background-color: rgba(0, 0, 0, 0.95); color: #fff; border-radius: 15px; border: 1px solid rgba(255, 255, 255, 0.2); } .modal-header { border-bottom: 1px solid rgba(255, 255, 255, 0.2); } .modal-footer { border-top: 1px solid rgba(255, 255, 255, 0.2); } .modal-content .btn-primary { background: linear-gradient(135deg, #fff 0%, #f0f0f0 100%); color: #000; border: none; border-radius: 25px; font-weight: 600; } .close { color: #fff; opacity: 0.8; } .close:hover { color: #fff; opacity: 1; } /* History Modal Styles */ .modal-lg { max-width: 600px; } .history-list { display: flex; flex-direction: column; gap: 15px; } .history-item { display: flex; align-items: center; gap: 15px; padding: 15px; background: rgba(255, 255, 255, 0.05); border-radius: 10px; transition: all 0.3s ease; } .history-item:hover { background: rgba(255, 255, 255, 0.1); } .cover-historic { width: 80px; height: 80px; background: url("../img/cover.png") no-repeat center; background-size: cover; border-radius: 10px; flex-shrink: 0; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); } .music-info { flex: 1; text-align: left; min-width: 0; } .music-info .song { font-size: 18px; font-weight: 600; margin-bottom: 8px; text-transform: uppercase; color: #fff; line-height: 1.2; /* Line clamp for 2 lines in history */ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } .music-info .artist { font-size: 16px; color: #ccc; text-transform: capitalize; line-height: 1.2; /* Line clamp for 1 line in history */ display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } /* Modal backdrop for better contrast */ .modal-backdrop { background-color: rgba(0, 0, 0, 0.8); } /* Responsive Design */ @media (max-width: 768px) { main { max-width: 100%; padding: 15px; } .player-interface { flex-direction: column; gap: 30px; text-align: center; } .player-right { align-items: center; } .song-info { text-align: center; margin-bottom: 30px; } .player-controls { align-items: center; width: 100%; } .main-artwork { width: 280px; height: 280px; } .current-song { font-size: 28px; } .current-artist { font-size: 18px; } .action-buttons { justify-content: center; width: 100%; } .btn-secondary { flex: 1; justify-content: center; max-width: 150px; } } @media (max-width: 480px) { .main-artwork { width: 250px; height: 250px; } .current-song { font-size: 24px; } .current-artist { font-size: 16px; } .action-buttons { flex-direction: column; gap: 12px; } .btn-secondary { max-width: none; } } /* Loading Animations */ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } @keyframes spin { 0% { transform: translate(-50%, -50%) rotate(0deg); } 100% { transform: translate(-50%, -50%) rotate(360deg); } } @keyframes pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 1; } } @keyframes loadingProgress { 0% { width: 0%; } 50% { width: 70%; } 100% { width: 100%; } } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Animation Classes */ .animated { animation-duration: 1s; animation-fill-mode: both; } .flipInY { animation-name: flipInY; } .bounceInLeft { animation-name: bounceInLeft; } .slideInRight { animation-name: slideInRight; } @keyframes flipInY { from { transform: perspective(400px) rotateY(90deg); opacity: 0; } 40% { transform: perspective(400px) rotateY(-20deg); } 60% { transform: perspective(400px) rotateY(10deg); } 80% { transform: perspective(400px) rotateY(-5deg); } to { transform: perspective(400px); opacity: 1; } } @keyframes bounceInLeft { from, 60%, 75%, 90%, to { animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1.0); } 0% { opacity: 0; transform: translate3d(-3000px, 0, 0); } 60% { opacity: 1; transform: translate3d(25px, 0, 0); } 75% { transform: translate3d(-10px, 0, 0); } 90% { transform: translate3d(5px, 0, 0); } to { transform: none; } } @keyframes slideInRight { from { transform: translate3d(100%, 0, 0); visibility: visible; } to { transform: translate3d(0, 0, 0); } }