/* ---------------------- */ /* DOWNLOAD QUEUE STYLES */ /* ---------------------- */ /* Container for the download queue sidebar */ #downloadQueue { position: fixed; top: 0; right: -350px; /* Hidden offscreen by default */ width: 350px; height: 100vh; background: #181818; padding: 20px; transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1); z-index: 1001; /* Remove overflow-y here to delegate scrolling to the queue items container */ box-shadow: -20px 0 30px rgba(0, 0, 0, 0.4); /* Added for flex layout */ display: flex; flex-direction: column; } /* When active, the sidebar slides into view */ #downloadQueue.active { right: 0; } /* Header inside the queue sidebar */ .sidebar-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 15px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); margin-bottom: 20px; } .sidebar-header h2 { font-size: 1.25rem; font-weight: 600; color: #fff; margin: 0; } /* Queue subtitle with statistics */ .queue-subtitle { display: flex; gap: 10px; margin-top: 5px; font-size: 0.8rem; color: #b3b3b3; } .queue-stat { padding: 2px 6px; border-radius: 4px; font-weight: 500; } .queue-stat-active { color: #4a90e2; background-color: rgba(74, 144, 226, 0.1); } .queue-stat-completed { color: #1DB954; background-color: rgba(29, 185, 84, 0.1); } .queue-stat-error { color: #ff5555; background-color: rgba(255, 85, 85, 0.1); } .header-actions { display: flex; gap: 10px; align-items: center; } /* Refresh queue button */ #refreshQueueBtn { background: #2a2a2a; border: none; color: #fff; padding: 8px; border-radius: 4px; cursor: pointer; transition: background 0.3s ease, transform 0.2s ease; display: flex; align-items: center; justify-content: center; } #refreshQueueBtn:hover { background: #333; transform: translateY(-1px); } #refreshQueueBtn:active { transform: scale(0.95); } #refreshQueueBtn.refreshing { animation: spin 1s linear infinite; } /* Artist queue message */ .queue-artist-message { background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; color: #fff; text-align: center; border-left: 4px solid #4a90e2; animation: pulse 1.5s infinite; font-weight: 500; } @keyframes pulse { 0% { opacity: 0.8; } 50% { opacity: 1; } 100% { opacity: 0.8; } } /* Cancel all button styling */ #cancelAllBtn { background: #8b0000; /* Dark blood red */ border: none; color: #fff; padding: 8px 12px; border-radius: 4px; cursor: pointer; transition: background 0.3s ease, transform 0.2s ease; font-size: 14px; font-weight: 600; display: flex; align-items: center; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5); } #cancelAllBtn:hover { background: #a30000; /* Slightly lighter red on hover */ transform: translateY(-1px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); } #cancelAllBtn:active { transform: scale(0.98); } /* Close button for the queue sidebar */ .close-btn { background: #2a2a2a; border: none; border-radius: 50%; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; color: #ffffff; font-size: 20px; cursor: pointer; transition: background-color 0.3s ease, transform 0.2s ease; } .close-btn:hover { background-color: #333; transform: scale(1.05); } .close-btn:active { transform: scale(0.95); } /* Container for all queue items */ #queueItems { /* Allow the container to fill all available space in the sidebar */ flex: 1; overflow-y: auto; padding-right: 5px; /* Add slight padding for scrollbar */ scrollbar-width: thin; scrollbar-color: #1DB954 rgba(255, 255, 255, 0.1); } /* Custom scrollbar styles */ #queueItems::-webkit-scrollbar { width: 6px; } #queueItems::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); border-radius: 10px; } #queueItems::-webkit-scrollbar-thumb { background-color: #1DB954; border-radius: 10px; } /* Each download queue item */ .queue-item { background: #2a2a2a; padding: 15px; border-radius: 8px; margin-bottom: 15px; transition: all 0.3s ease; display: flex; flex-direction: column; gap: 6px; position: relative; border-left: 4px solid transparent; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); } /* Animation only for newly added items */ .queue-item-new { animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } } .queue-item:hover { background-color: #333; transform: translateY(-5px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } /* Title text in a queue item */ .queue-item .title { font-weight: 600; margin-bottom: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #fff; font-size: 14px; } /* Type indicator (e.g. track, album) */ .queue-item .type { font-size: 11px; color: #1DB954; text-transform: uppercase; letter-spacing: 0.7px; font-weight: 600; background-color: rgba(29, 185, 84, 0.1); padding: 3px 6px; border-radius: 4px; display: inline-block; width: fit-content; } /* Album type - for better visual distinction */ .queue-item .type.album { color: #4a90e2; background-color: rgba(74, 144, 226, 0.1); } /* Track type */ .queue-item .type.track { color: #1DB954; background-color: rgba(29, 185, 84, 0.1); } /* Playlist type */ .queue-item .type.playlist { color: #e67e22; background-color: rgba(230, 126, 34, 0.1); } /* Log text for status messages */ .queue-item .log { font-size: 13px; color: #b3b3b3; line-height: 1.4; font-family: 'SF Mono', Menlo, monospace; padding: 8px 0; word-break: break-word; } /* Optional state indicators for each queue item */ .queue-item--complete, .queue-item.download-success { border-left-color: #1DB954; } .queue-item--error { border-left-color: #ff5555; } .queue-item--processing { border-left-color: #4a90e2; } /* Progress bar for downloads */ .status-bar { height: 3px; background: #1DB954; width: 0; transition: width 0.3s ease; margin-top: 8px; border-radius: 2px; } /* Overall progress container for albums and playlists */ .overall-progress-container { margin-top: 12px; padding-top: 8px; border-top: 1px solid rgba(255, 255, 255, 0.1); position: relative; /* Positioning context for z-index */ z-index: 2; /* Ensure overall progress appears above track progress */ } .overall-progress-header { display: flex; justify-content: space-between; margin-bottom: 5px; font-size: 11px; color: #b3b3b3; } .overall-progress-label { font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; } .overall-progress-count { font-weight: 600; color: #1DB954; } .overall-progress-bar-container { height: 6px; background: rgba(255, 255, 255, 0.1); border-radius: 3px; overflow: hidden; } .overall-progress-bar { height: 100%; background: linear-gradient(90deg, #4a90e2, #7a67ee); /* Changed to blue-purple gradient */ width: 0; border-radius: 3px; transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); position: relative; } .overall-progress-bar.complete { background: #4a90e2; /* Changed to solid blue for completed overall progress */ } /* Track progress bar container */ .track-progress-bar-container { height: 4px; background: rgba(255, 255, 255, 0.1); border-radius: 2px; overflow: hidden; margin-top: 8px; margin-bottom: 4px; position: relative; z-index: 1; /* Ensure it's below the overall progress */ } /* Track progress bar */ .track-progress-bar { height: 100%; background: #1DB954; /* Keep green for track-level progress */ width: 0; border-radius: 2px; transition: width 0.3s ease; box-shadow: 0 0 3px rgba(29, 185, 84, 0.5); /* Add subtle glow to differentiate */ } /* Complete state for track progress */ /* Real-time progress style */ .track-progress-bar.real-time { background: #1DB954; /* Vivid green for real-time progress */ background: #1DB954; } /* Pulsing animation for indeterminate progress */ .track-progress-bar.progress-pulse { background: linear-gradient(90deg, #1DB954 0%, #2cd267 50%, #1DB954 100%); /* Keep in green family */ background-size: 200% 100%; animation: progress-pulse-slide 1.5s ease infinite; } @keyframes progress-pulse-slide { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } /* Progress percentage text */ .progress-percent { text-align: right; font-weight: bold; font-size: 12px; color: #1DB954; margin-top: 4px; } /* Optional status message colors (if using state classes) */ .log--success { color: #1DB954 !important; } .log--error { color: #ff5555 !important; } .log--warning { color: #ffaa00 !important; } .log--info { color: #4a90e2 !important; } /* Loader animations for real-time progress */ @keyframes progress-pulse { 0% { opacity: 0.5; } 50% { opacity: 1; } 100% { opacity: 0.5; } } .progress-indicator { display: inline-block; margin-left: 8px; animation: progress-pulse 1.5s infinite; } /* Loading spinner style */ .loading-spinner { display: inline-block; width: 14px; height: 14px; border: 2px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: #1DB954; animation: spin 1s ease-in-out infinite; margin-right: 6px; vertical-align: middle; } .loading-spinner.small { width: 10px; height: 10px; border-width: 1px; margin-right: 4px; } @keyframes spin { to { transform: rotate(360deg); } } /* Cancel button inside each queue item */ .cancel-btn { background: none; border: none; cursor: pointer; padding: 5px; outline: none; margin-top: 10px; /* Optionally constrain the overall size */ max-width: 24px; max-height: 24px; position: absolute; top: 10px; right: 10px; opacity: 0.7; transition: opacity 0.2s ease, transform 0.2s ease; } .cancel-btn:hover { opacity: 1; } .cancel-btn img { width: 16px; height: 16px; filter: invert(1); transition: transform 0.3s ease; } .cancel-btn:hover img { transform: scale(1.1); } .cancel-btn:active img { transform: scale(0.9); } /* Group header for multiple albums from same artist */ .queue-group-header { font-size: 14px; color: #b3b3b3; margin: 15px 0 10px; padding-bottom: 8px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); display: flex; align-items: center; justify-content: space-between; } .queue-group-header span { display: flex; align-items: center; } .queue-group-header span::before { content: ''; display: inline-block; width: 10px; height: 10px; border-radius: 50%; background-color: #1DB954; margin-right: 8px; } /* ------------------------------- */ /* FOOTER & "SHOW MORE" BUTTON */ /* ------------------------------- */ #queueFooter { text-align: center; padding-top: 15px; border-top: 1px solid rgba(255, 255, 255, 0.1); margin-top: 10px; } #queueFooter button { background: #1DB954; border: none; padding: 10px 18px; border-radius: 20px; color: #fff; cursor: pointer; transition: all 0.3s ease; font-size: 14px; font-weight: 500; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); } #queueFooter button:hover { background: #17a448; transform: translateY(-1px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); } #queueFooter button:active { transform: scale(0.98); } /* -------------------------- */ /* ERROR BUTTONS STYLES */ /* -------------------------- */ /* Container for error action buttons */ .error-buttons { display: flex; justify-content: flex-end; gap: 8px; margin-top: 8px; } /* ----------------------------- */ /* DOWNLOAD SUMMARY ICONS */ /* ----------------------------- */ /* Base styles for all summary icons */ .summary-icon { width: 14px; height: 14px; vertical-align: middle; margin-right: 4px; margin-top: -2px; } /* Download summary formatting */ .download-summary { background: rgba(255, 255, 255, 0.05); border-radius: 6px; padding: 12px; margin-top: 5px; } .summary-line { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; } .summary-line span { display: flex; align-items: center; padding: 3px 8px; border-radius: 4px; font-weight: 500; } /* Specific icon background colors */ .summary-line span:nth-child(2) { background: rgba(29, 185, 84, 0.1); /* Success background */ } .summary-line span:nth-child(3) { background: rgba(230, 126, 34, 0.1); /* Skip background */ } .summary-line span:nth-child(4) { background: rgba(255, 85, 85, 0.1); /* Failed background */ } /* Failed tracks list styling */ .failed-tracks-title { color: #ff5555; font-weight: 600; margin: 10px 0 5px; font-size: 13px; } .failed-tracks-list { list-style-type: none; padding-left: 10px; margin: 0; font-size: 12px; color: #b3b3b3; max-height: 100px; overflow-y: auto; } .failed-tracks-list li { padding: 3px 0; position: relative; } .failed-tracks-list li::before { content: "•"; color: #ff5555; position: absolute; left: -10px; } /* Base styles for error buttons */ .error-buttons button { border: none; border-radius: 4px; padding: 6px 12px; font-size: 12px; font-weight: 600; cursor: pointer; transition: all 0.2s ease; } /* Hover state for all error buttons */ .error-buttons button:hover { transform: translateY(-2px); } .error-buttons button:active { transform: translateY(0); } /* Specific styles for the Close (X) error button */ .close-error-btn { background-color: #333; color: #fff; } .close-error-btn:hover { background-color: #444; } /* Specific styles for the Retry button */ .retry-btn { background-color: #ff5555; color: #fff; padding: 6px 15px !important; } .retry-btn:hover { background-color: #ff6b6b; } /* Empty queue state */ .queue-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 200px; color: #b3b3b3; text-align: center; padding: 20px; } .queue-empty img { width: 60px; height: 60px; margin-bottom: 15px; opacity: 0.6; } .queue-empty p { font-size: 14px; line-height: 1.5; } /* Error notification in queue */ .queue-error { background-color: rgba(192, 57, 43, 0.1); color: #ff5555; padding: 10px 15px; border-radius: 8px; margin-bottom: 15px; font-size: 14px; border-left: 3px solid #ff5555; animation: fadeIn 0.3s ease; } /* Error state styling */ .queue-item.error { border-left: 4px solid #ff5555; background-color: rgba(255, 85, 85, 0.05); transition: none !important; /* Remove all transitions */ transform: none !important; /* Prevent any transform */ position: relative !important; /* Keep normal positioning */ left: 0 !important; /* Prevent any left movement */ right: 0 !important; /* Prevent any right movement */ top: 0 !important; /* Prevent any top movement */ } .queue-item.error:hover { background-color: rgba(255, 85, 85, 0.1); transform: none !important; /* Force disable any transform */ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2) !important; /* Keep original shadow */ position: relative !important; /* Force normal positioning */ left: 0 !important; /* Prevent any left movement */ right: 0 !important; /* Prevent any right movement */ top: 0 !important; /* Prevent any top movement */ } .error-message { color: #ff5555; margin-bottom: 10px; font-size: 13px; line-height: 1.4; } /* ------------------------------- */ /* MOBILE RESPONSIVE ADJUSTMENTS */ /* ------------------------------- */ @media (max-width: 600px) { /* Make the sidebar full width on mobile */ #downloadQueue { width: 100%; right: -100%; /* Off-screen fully */ padding: 15px; } /* When active, the sidebar slides into view from full width */ #downloadQueue.active { right: 0; } /* Adjust header and title for smaller screens */ .sidebar-header { flex-direction: row; align-items: center; padding-bottom: 12px; margin-bottom: 15px; } .sidebar-header h2 { font-size: 1.1rem; } /* Reduce the size of the close buttons */ .close-btn { width: 28px; height: 28px; font-size: 18px; } /* Adjust queue items padding */ .queue-item { padding: 12px; margin-bottom: 12px; } /* Ensure text remains legible on smaller screens */ .queue-item .log, .queue-item .type { font-size: 12px; } #cancelAllBtn { padding: 6px 10px; font-size: 12px; } .error-buttons { flex-direction: row; } .close-error-btn { width: 28px; height: 28px; } .retry-btn { padding: 6px 12px !important; } }