/* SoulSync WebUI - Replicating PyQt6 GUI Styling */
/* Accent Color Variables — overridden by JS when user picks a custom accent */
:root {
--accent-rgb: 29, 185, 84;
--accent-light-rgb: 30, 215, 96;
--accent-neon-rgb: 34, 255, 107;
}
/* Reset and Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'SF Pro Display', 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
background: linear-gradient(135deg,
rgba(8, 8, 8, 1) 0%,
rgba(12, 12, 12, 1) 50%,
rgba(16, 16, 16, 1) 100%);
color: #ffffff;
overflow: hidden;
height: 100vh;
}
.hidden {
display: none !important;
}
/* Main Container Layout */
.main-container {
display: flex;
height: 100vh;
width: 100vw;
}
/* ======================================
SIDEBAR STYLING - Premium Glassmorphic Design
====================================== */
.sidebar {
width: 240px;
/* Opaque dark foundation (GPU-optimized: no backdrop-filter needed on solid dark body) */
background: linear-gradient(135deg,
rgba(18, 18, 18, 1) 0%,
rgba(12, 12, 12, 1) 100%);
/* Soft translucent borders */
border-right: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
border-top-right-radius: 24px;
border-bottom-right-radius: 24px;
/* Soft floating shadow with inner glow */
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.3),
0 4px 16px rgba(0, 0, 0, 0.2),
0 0 60px rgba(var(--accent-rgb), 0.06),
inset 0 1px 0 rgba(255, 255, 255, 0.1),
inset 0 -1px 0 rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
overflow-y: auto;
overflow-x: hidden;
position: relative;
/* Custom scrollbar styling */
scrollbar-width: thin;
scrollbar-color: rgba(var(--accent-rgb), 0.4) rgba(255, 255, 255, 0.03);
}
/* Sidebar ambient aura — uses transform/opacity for GPU-smooth animation */
.sidebar::before,
.sidebar::after {
content: '';
position: fixed;
pointer-events: none;
border-radius: 50%;
filter: blur(40px);
will-change: transform, opacity;
}
.sidebar::before {
width: 180px;
height: 180px;
top: 5%;
left: 10px;
background: radial-gradient(circle, rgba(var(--accent-rgb), 0.35) 0%, transparent 70%);
animation: sidebar-orb-1 16s ease-in-out infinite;
z-index: 0;
}
.sidebar::after {
width: 160px;
height: 160px;
top: 55%;
left: 40px;
background: radial-gradient(circle, rgba(var(--accent-rgb), 0.30) 0%, transparent 70%);
animation: sidebar-orb-2 20s ease-in-out infinite;
z-index: 0;
}
@keyframes sidebar-orb-1 {
0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.5; }
25% { transform: translate(30px, 80px) scale(1.2); opacity: 1; }
50% { transform: translate(-10px, 180px) scale(0.9); opacity: 0.6; }
75% { transform: translate(20px, 50px) scale(1.15); opacity: 0.9; }
}
@keyframes sidebar-orb-2 {
0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.6; }
30% { transform: translate(-20px, -100px) scale(1.25); opacity: 0.4; }
60% { transform: translate(30px, -50px) scale(0.85); opacity: 1; }
80% { transform: translate(-10px, 40px) scale(1.1); opacity: 0.5; }
}
.sidebar > * {
position: relative;
z-index: 1;
}
/* Sidebar Audio Visualizer — fixed strip on right edge of sidebar */
.sidebar-visualizer {
position: fixed;
left: 240px;
top: 0;
bottom: 0;
width: 10px;
z-index: 100;
opacity: 0;
transition: opacity 0.5s ease;
pointer-events: none;
}
.sidebar-visualizer.active {
opacity: 1;
}
/* Type: Bars */
.sidebar-visualizer.viz-bars {
display: flex;
flex-direction: column-reverse;
gap: 2px;
padding: 16px 0;
}
.sidebar-viz-bar {
flex: 1;
border-radius: 4px;
transform: scaleX(0.1);
transform-origin: left center;
will-change: transform;
}
/* Type: Wave & Spectrum (canvas) */
.sidebar-visualizer.viz-canvas {
display: flex;
align-items: stretch;
}
.sidebar-viz-canvas {
width: 100%;
height: 100%;
}
/* Type: Mirror (bars from center) */
.sidebar-visualizer.viz-mirror {
display: flex;
flex-direction: column;
gap: 2px;
padding: 16px 0;
}
.sidebar-viz-mirror-bar {
flex: 1;
border-radius: 4px;
transform: scaleX(0.06);
transform-origin: left center;
will-change: transform;
}
/* Type: Equalizer (bars with peak hold) */
.sidebar-visualizer.viz-equalizer {
display: flex;
flex-direction: column-reverse;
gap: 2px;
padding: 16px 0;
}
.sidebar-viz-eq-wrap {
flex: 1;
position: relative;
}
.sidebar-viz-eq-bar {
width: 100%;
height: 100%;
border-radius: 4px;
transform: scaleX(0.06);
transform-origin: left center;
will-change: transform;
}
.sidebar-viz-eq-peak {
position: absolute;
top: 0;
left: 6%;
width: 2px;
height: 100%;
border-radius: 1px;
will-change: left, background-color, box-shadow;
}
@media (max-width: 768px) {
.sidebar-visualizer { display: none; }
}
/* Sidebar scrollbar webkit styling */
.sidebar::-webkit-scrollbar {
width: 6px;
}
.sidebar::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
}
.sidebar::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.5);
border-radius: 10px;
transition: background 0.3s ease;
}
.sidebar::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.7);
}
/* Sidebar Header */
.sidebar-brand {
display: flex;
align-items: center;
gap: 12px;
}
.sidebar-logo {
width: 38px;
height: 38px;
object-fit: contain;
filter: drop-shadow(0 2px 8px rgba(var(--accent-rgb), 0.3));
flex-shrink: 0;
}
.sidebar-brand-text {
display: flex;
flex-direction: column;
gap: 0;
}
.sidebar-header {
min-height: 115px;
background: linear-gradient(180deg,
rgba(var(--accent-rgb), 0.14) 0%,
rgba(var(--accent-rgb), 0.08) 30%,
rgba(var(--accent-rgb), 0.03) 70%,
transparent 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
border-top-right-radius: 20px;
padding: 20px 24px;
display: flex;
flex-direction: column;
justify-content: center;
gap: 8px;
position: relative;
overflow: hidden;
/* Subtle inner glow */
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Ambient light sweep across header */
.sidebar-header::after {
content: '';
position: absolute;
top: -50%;
left: -100%;
width: 60%;
height: 200%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(var(--accent-rgb), 0.06) 40%,
rgba(var(--accent-rgb), 0.12) 50%,
rgba(var(--accent-rgb), 0.06) 60%,
transparent 100%
);
animation: sidebar-header-sweep 8s ease-in-out infinite;
pointer-events: none;
}
@keyframes sidebar-header-sweep {
0%, 100% { left: -100%; opacity: 0; }
10% { opacity: 1; }
50% { left: 140%; opacity: 1; }
60% { opacity: 0; }
}
.app-name {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 20px;
font-weight: 700;
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 60%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: -0.8px;
margin: 0;
animation: sidebar-logo-shimmer 6s ease-in-out infinite;
}
@keyframes sidebar-logo-shimmer {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
.app-subtitle {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 10px;
font-weight: 500;
color: rgba(255, 255, 255, 0.5);
letter-spacing: 1.5px;
text-transform: uppercase;
margin: 0;
margin-top: 2px;
}
/* Navigation Buttons */
.sidebar-nav {
padding: 20px 12px;
display: flex;
flex-direction: column;
gap: 4px;
}
.nav-button {
position: relative;
height: 44px;
width: 216px;
background: transparent;
border: 1px solid transparent;
border-radius: 12px;
cursor: pointer;
display: flex;
align-items: center;
gap: 14px;
padding: 0 16px;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 12px;
font-weight: 500;
position: relative;
overflow: hidden;
}
/* Active indicator bar - left edge glow */
.nav-button::before {
content: '';
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 3px;
height: 0;
border-radius: 0 3px 3px 0;
background: linear-gradient(180deg, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.6);
transition: height 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.nav-button.active::before {
height: 60%;
}
.nav-button:hover {
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.06) 0%,
rgba(255, 255, 255, 0.03) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
transform: translateX(4px);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.nav-button.active {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.14) 0%,
rgba(var(--accent-rgb), 0.10) 50%,
rgba(var(--accent-rgb), 0.06) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.2);
transform: translateX(6px);
box-shadow:
0 4px 16px rgba(var(--accent-rgb), 0.2),
0 2px 8px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.nav-button.active:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.20) 0%,
rgba(var(--accent-rgb), 0.16) 50%,
rgba(var(--accent-rgb), 0.10) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.3);
transform: translateX(8px);
box-shadow:
0 6px 20px rgba(var(--accent-rgb), 0.25),
0 3px 10px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.nav-icon {
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
font-size: 15px;
font-weight: 600;
border-radius: 8px;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.07) 0%,
rgba(255, 255, 255, 0.03) 100%);
border: 1px solid rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.7);
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 2px 4px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.nav-svg {
width: 22px;
height: 22px;
pointer-events: none;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
color: rgba(var(--accent-rgb), 0.7);
}
.nav-button:hover .nav-icon {
color: rgba(255, 255, 255, 0.95);
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.12) 0%,
rgba(255, 255, 255, 0.06) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.nav-button:hover .nav-svg {
color: rgba(255, 255, 255, 0.95);
}
.nav-button.active .nav-icon {
background: rgba(var(--accent-rgb), 0.12);
border: 1px solid rgba(var(--accent-rgb), 0.25);
box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.15);
}
.nav-button.active .nav-svg {
color: rgba(var(--accent-light-rgb, var(--accent-rgb)), 1);
filter: drop-shadow(0 0 6px rgba(var(--accent-rgb), 0.5));
}
.nav-text {
color: rgba(255, 255, 255, 0.65);
letter-spacing: 0.2px;
transition: all 0.25s ease;
}
.nav-button:hover .nav-text {
color: rgba(255, 255, 255, 0.95);
}
.nav-button.active .nav-text {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
/* Sidebar Spacer */
.sidebar-spacer {
flex: 1;
min-height: 12px;
position: relative;
}
/* Fade divider between nav and bottom content */
.sidebar-spacer::after {
content: '';
position: absolute;
bottom: 0;
left: 24px;
right: 24px;
height: 1px;
background: linear-gradient(90deg,
transparent 0%,
rgba(255, 255, 255, 0.06) 30%,
rgba(255, 255, 255, 0.06) 70%,
transparent 100%
);
}
/* Media Player Section - Premium Compact Design */
.media-player {
background: linear-gradient(180deg,
rgba(24, 24, 24, 0.97) 0%,
rgba(16, 16, 16, 0.99) 50%,
rgba(10, 10, 10, 1.0) 100%);
backdrop-filter: blur(16px) saturate(1.2);
border: 1px solid rgba(255, 255, 255, 0.06);
border-top: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
margin: 8px 14px;
padding: 0;
overflow: hidden;
transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.45),
0 2px 8px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.07);
position: relative;
}
.media-player:hover {
border-color: rgba(var(--accent-rgb), 0.18);
border-top-color: rgba(var(--accent-rgb), 0.22);
box-shadow:
0 10px 28px rgba(0, 0, 0, 0.5),
0 4px 14px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Top progress bar - thin line across full width */
.player-top-progress {
padding: 0 14px;
padding-top: 10px;
}
.player-top-progress .progress-bar-container {
position: relative;
width: 100%;
height: 14px;
}
.player-top-progress .progress-track {
position: absolute;
top: 50%;
left: 0;
right: 0;
height: 3px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
transform: translateY(-50%);
z-index: 1;
transition: height 0.15s ease;
}
.player-top-progress:hover .progress-track {
height: 4px;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
border-radius: 2px;
width: 0%;
transition: width 0.1s linear;
}
.player-top-progress .progress-bar {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 14px;
background: transparent;
outline: none;
cursor: pointer;
-webkit-appearance: none;
appearance: none;
z-index: 2;
margin: 0;
}
.player-top-progress .progress-bar::-webkit-slider-track {
width: 100%;
height: 3px;
background: transparent;
border-radius: 2px;
}
.player-top-progress .progress-bar::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 10px;
height: 10px;
background: #fff;
border-radius: 50%;
cursor: pointer;
border: none;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
transition: all 0.15s ease;
opacity: 0;
}
.player-top-progress:hover .progress-bar::-webkit-slider-thumb {
opacity: 1;
}
.player-top-progress .progress-bar::-webkit-slider-thumb:hover {
transform: scale(1.2);
box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.2);
}
.player-top-progress .progress-bar::-webkit-slider-thumb:active {
transform: scale(1.3);
box-shadow: 0 0 0 6px rgba(var(--accent-rgb), 0.25);
}
/* Firefox progress bar styling */
.player-top-progress .progress-bar::-moz-range-track {
width: 100%;
height: 3px;
background: transparent;
border-radius: 2px;
border: none;
}
.player-top-progress .progress-bar::-moz-range-thumb {
width: 10px;
height: 10px;
background: #fff;
border-radius: 50%;
cursor: pointer;
border: none;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
opacity: 0;
transition: opacity 0.15s ease;
}
.player-top-progress:hover .progress-bar::-moz-range-thumb {
opacity: 1;
}
/* Time display - left/right under progress */
.player-top-progress .time-display {
display: flex;
justify-content: space-between;
align-items: center;
font-family: 'SF Mono', 'Cascadia Code', 'Consolas', monospace;
font-size: 9px;
font-weight: 500;
color: rgba(255, 255, 255, 0.35);
letter-spacing: 0.3px;
padding: 0 1px;
margin-top: -1px;
}
.current-time {
min-width: 28px;
text-align: left;
}
.total-time {
min-width: 28px;
text-align: right;
}
/* Loading Animation */
.loading-animation {
height: 12px;
margin: 8px 14px 4px;
position: relative;
}
.loading-bar {
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
overflow: hidden;
position: relative;
}
.loading-progress {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
border-radius: 2px;
width: 0%;
transition: width 0.3s ease;
}
.loading-text {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
font-family: 'SF Mono', 'Consolas', monospace;
font-size: 7px;
font-weight: 500;
color: rgba(255, 255, 255, 0.4);
line-height: 8px;
}
/* Track info row — album art + text only, no controls competing for space */
.media-header {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 14px 4px;
cursor: pointer;
}
.sidebar-album-art {
width: 38px;
height: 38px;
min-width: 38px;
border-radius: 6px;
object-fit: cover;
background: rgba(255, 255, 255, 0.05);
display: block;
}
.sidebar-album-art[src=""],
.sidebar-album-art:not([src]) {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.15) 0%, rgba(255, 255, 255, 0.03) 100%);
}
.media-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 1px;
}
.track-title {
font-family: -apple-system, 'Segoe UI', sans-serif;
font-size: 12.5px;
font-weight: 600;
color: #ffffff;
letter-spacing: -0.1px;
line-height: 1.3;
cursor: pointer;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0;
transition: color 0.2s ease;
position: relative;
width: 100%;
}
.track-title .title-text {
display: inline-block;
transition: transform 0.3s ease;
}
.track-title.scrolling .title-text {
animation: marquee-scroll 10s linear infinite;
animation-delay: 1.5s;
}
.track-title.scrolling:hover .title-text {
animation-play-state: paused;
}
@keyframes marquee-scroll {
0% { transform: translateX(0px); }
20% { transform: translateX(0px); }
80% { transform: translateX(var(--scroll-distance)); }
100%{ transform: translateX(var(--scroll-distance)); }
}
.track-title:hover {
color: rgb(var(--accent-light-rgb));
}
.artist-name {
font-family: -apple-system, 'Segoe UI', sans-serif;
font-size: 11px;
font-weight: 400;
color: rgba(255, 255, 255, 0.55);
letter-spacing: 0.1px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0;
}
.album-name.header-album {
font-family: -apple-system, 'Segoe UI', sans-serif;
font-size: 10px;
font-weight: 400;
color: rgba(255, 255, 255, 0.3);
letter-spacing: 0.1px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0;
font-style: normal;
}
/* Controls row — always visible below track info */
.media-controls-row {
display: flex;
align-items: center;
gap: 6px;
padding: 2px 14px 10px;
}
/* Play Button */
.play-button {
width: 28px;
height: 28px;
border-radius: 50%;
background: rgb(var(--accent-light-rgb));
border: none;
color: #000000;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
padding: 0;
flex-shrink: 0;
}
.play-button svg {
width: 14px;
height: 14px;
}
.play-button:hover:not(:disabled) {
background: #1fdf64;
transform: scale(1.08);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.35);
}
.play-button:active:not(:disabled) {
transform: scale(0.95);
}
.play-button:disabled {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.25);
cursor: not-allowed;
box-shadow: none;
}
/* Volume control in controls row */
.volume-control {
display: flex;
align-items: center;
gap: 5px;
flex: 1;
min-width: 0;
}
.volume-icon {
color: rgba(255, 255, 255, 0.4);
display: flex;
align-items: center;
flex-shrink: 0;
}
.volume-icon svg {
width: 13px;
height: 13px;
}
.volume-slider {
width: 100%;
height: 16px;
background: transparent;
outline: none;
cursor: pointer;
-webkit-appearance: none;
appearance: none;
}
.volume-slider::-webkit-slider-runnable-track {
width: 100%;
height: 3px;
border-radius: 2px;
background: linear-gradient(to right,
rgba(255, 255, 255, 0.6) 0%,
rgba(255, 255, 255, 0.6) var(--volume-percent, 70%),
rgba(255, 255, 255, 0.08) var(--volume-percent, 70%),
rgba(255, 255, 255, 0.08) 100%);
}
.volume-slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 10px;
height: 10px;
background: #ffffff;
border-radius: 50%;
cursor: pointer;
margin-top: -3.5px;
border: none;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
transition: all 0.15s ease;
opacity: 0;
}
.volume-control:hover .volume-slider::-webkit-slider-thumb {
opacity: 1;
}
.volume-slider::-webkit-slider-thumb:hover {
transform: scale(1.15);
}
/* Firefox volume slider */
.volume-slider::-moz-range-track {
width: 100%;
height: 3px;
border-radius: 2px;
background: rgba(255, 255, 255, 0.08);
border: none;
}
.volume-slider::-moz-range-thumb {
width: 10px;
height: 10px;
background: #ffffff;
border-radius: 50%;
cursor: pointer;
border: none;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
/* Stop button */
.stop-button {
width: 24px;
height: 24px;
border-radius: 5px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.5);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
padding: 0;
flex-shrink: 0;
}
.stop-button svg {
width: 10px;
height: 10px;
}
.stop-button:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.12);
border-color: rgba(255, 255, 255, 0.15);
color: #ffffff;
}
.stop-button:active:not(:disabled) {
background: rgba(255, 255, 255, 0.18);
}
.stop-button:disabled {
background: transparent;
border-color: rgba(255, 255, 255, 0.03);
color: rgba(255, 255, 255, 0.12);
cursor: not-allowed;
}
/* Expand hint chevron — subtle indicator to open NP modal */
.expand-hint {
background: none;
border: none;
color: rgba(255, 255, 255, 0.15);
cursor: pointer;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
transition: color 0.2s ease;
width: 16px;
height: 16px;
flex-shrink: 0;
}
.expand-hint:hover {
color: rgba(255, 255, 255, 0.45);
}
/* Expanded section (kept for backward compat) */
.media-expanded {
display: none;
}
/* No track empty state */
.no-track-message {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
color: rgba(255, 255, 255, 0.18);
font-size: 11px;
font-weight: 400;
text-align: center;
padding: 20px 16px;
letter-spacing: 0.2px;
font-family: -apple-system, 'Segoe UI', sans-serif;
line-height: 1.4;
}
.no-track-icon {
opacity: 0.6;
}
/* Crypto Donation Section */
/* Support Button */
.support-section {
display: flex;
align-items: center;
justify-content: center;
margin: 4px 14px;
padding: 8px 0;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.support-button {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.3);
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 9px;
font-weight: 500;
letter-spacing: 0.5px;
padding: 5px 16px;
border-radius: 20px;
cursor: pointer;
transition: all 0.3s ease;
}
.support-button:hover {
color: rgba(255, 255, 255, 0.6);
background: rgba(255, 255, 255, 0.04);
border-color: rgba(255, 255, 255, 0.15);
}
/* Support Modal */
.support-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(12px);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
opacity: 1;
transition: opacity 0.3s ease-in-out;
}
.support-modal-overlay.hidden {
opacity: 0;
pointer-events: none;
}
.support-modal {
background: linear-gradient(165deg, #1e1e1e 0%, #161616 100%);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
width: 420px;
max-width: 90vw;
padding: 40px 36px;
text-align: center;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
transform: scale(1);
transition: transform 0.3s ease-in-out;
position: relative;
}
.support-modal-overlay.hidden .support-modal {
transform: scale(0.9);
}
.support-modal-close-btn {
position: absolute;
top: 14px;
right: 18px;
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 20px;
cursor: pointer;
transition: color 0.2s;
line-height: 1;
}
.support-modal-close-btn:hover {
color: rgba(255, 255, 255, 0.7);
}
.support-modal-logo {
margin-bottom: 20px;
}
.support-modal-logo-img {
width: 56px;
height: 56px;
border-radius: 14px;
margin-bottom: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
}
.support-modal-title {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 22px;
font-weight: 700;
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 60%, rgb(var(--accent-rgb)) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
letter-spacing: -0.5px;
margin: 0;
}
.support-modal-message {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 13px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.5);
margin: 0 0 28px 0;
max-width: 340px;
margin-left: auto;
margin-right: auto;
}
.support-modal-links {
display: flex;
flex-direction: column;
gap: 10px;
}
.support-link {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
padding: 12px 20px;
border-radius: 10px;
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
border: 1px solid transparent;
}
.support-link-icon {
width: 18px;
height: 18px;
flex-shrink: 0;
}
.support-link-kofi {
background: rgba(255, 95, 95, 0.12);
color: #ff5f5f;
border-color: rgba(255, 95, 95, 0.2);
}
.support-link-kofi:hover {
background: rgba(255, 95, 95, 0.2);
border-color: rgba(255, 95, 95, 0.35);
box-shadow: 0 4px 20px rgba(255, 95, 95, 0.15);
}
.support-link-btc {
background: rgba(247, 147, 26, 0.1);
color: #f7931a;
border-color: rgba(247, 147, 26, 0.18);
}
.support-link-btc:hover {
background: rgba(247, 147, 26, 0.18);
border-color: rgba(247, 147, 26, 0.3);
box-shadow: 0 4px 20px rgba(247, 147, 26, 0.12);
}
.support-link-eth {
background: rgba(98, 126, 234, 0.1);
color: #627eea;
border-color: rgba(98, 126, 234, 0.18);
}
.support-link-eth:hover {
background: rgba(98, 126, 234, 0.18);
border-color: rgba(98, 126, 234, 0.3);
box-shadow: 0 4px 20px rgba(98, 126, 234, 0.12);
}
/* Version Section */
.version-section {
display: flex;
align-items: center;
justify-content: center;
padding: 4px 14px;
margin: 0 14px;
}
.version-button {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.35);
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 9px;
font-weight: 500;
letter-spacing: 1px;
padding: 4px 12px;
border-radius: 20px;
cursor: pointer;
transition: all 0.3s ease;
}
.version-button:hover {
color: rgb(var(--accent-light-rgb));
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.2);
box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.15);
}
.version-button:active {
background: rgba(var(--accent-rgb), 0.12);
transform: scale(0.97);
}
/* ========================================= */
/* INTERACTIVE HELPER SYSTEM */
/* ========================================= */
/* (Sidebar helper button removed — using floating button instead) */
/* Floating helper button — always visible, always above everything */
/* ── Floating Help Button ─────────────────────────────────────────────── */
.helper-float-btn {
position: fixed;
bottom: 24px;
right: 24px;
width: 48px;
height: 48px;
border-radius: 50%;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.15) 0%, rgba(30, 30, 30, 0.9) 60%);
border: 1.5px solid rgba(var(--accent-rgb), 0.25);
color: rgba(255, 255, 255, 0.75);
font-size: 20px;
font-weight: 900;
cursor: pointer;
z-index: 999999;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5), 0 0 0 0 rgba(var(--accent-rgb), 0), inset 0 1px 0 rgba(255, 255, 255, 0.06);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(16px);
}
.helper-float-btn span {
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease;
display: block;
}
/* Subtle idle glow for users who haven't opened help yet */
.helper-float-btn.undiscovered {
animation: helperIdleGlow 3s ease-in-out infinite;
}
@keyframes helperIdleGlow {
0%, 100% {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5), 0 0 0 0 rgba(var(--accent-rgb), 0), inset 0 1px 0 rgba(255, 255, 255, 0.06);
border-color: rgba(var(--accent-rgb), 0.25);
}
50% {
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5), 0 0 16px rgba(var(--accent-rgb), 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.06);
border-color: rgba(var(--accent-rgb), 0.5);
}
}
.helper-float-btn:hover {
transform: scale(1.1);
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.3) 0%, rgba(30, 30, 30, 0.95) 60%);
border-color: rgba(var(--accent-rgb), 0.5);
color: #fff;
box-shadow: 0 6px 28px rgba(0, 0, 0, 0.5), 0 0 20px rgba(var(--accent-rgb), 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.helper-float-btn.active {
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgba(var(--accent-rgb), 0.7));
border-color: rgb(var(--accent-rgb));
color: #fff;
box-shadow: 0 6px 32px rgba(var(--accent-rgb), 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);
animation: helperFloatPulse 2s ease-in-out infinite;
}
.helper-float-btn.menu-open {
transform: scale(1.05);
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.25) 0%, rgba(40, 40, 40, 0.95) 60%);
border-color: rgba(var(--accent-rgb), 0.4);
color: #fff;
box-shadow: 0 6px 28px rgba(0, 0, 0, 0.5), 0 0 24px rgba(var(--accent-rgb), 0.12);
}
.helper-float-btn.menu-open span {
transform: rotate(90deg) scale(0.9);
opacity: 0.9;
}
.helper-float-btn.active span {
transform: scale(1.05);
}
@keyframes helperFloatPulse {
0%, 100% { box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.4), 0 2px 8px rgba(0, 0, 0, 0.3); }
50% { box-shadow: 0 4px 32px rgba(var(--accent-rgb), 0.6), 0 2px 8px rgba(0, 0, 0, 0.3); }
}
/* ── Helper Menu (unified card) ──────────────────────────────────────── */
.helper-menu {
position: fixed;
z-index: 999998;
background: rgba(14, 14, 14, 0.97);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
padding: 6px;
backdrop-filter: blur(24px);
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.65), 0 0 0 1px rgba(255, 255, 255, 0.03), inset 0 1px 0 rgba(255, 255, 255, 0.04);
display: flex;
flex-direction: column;
gap: 2px;
min-width: 220px;
opacity: 0;
transform: translateY(8px) scale(0.96);
transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.helper-menu.visible {
opacity: 1;
transform: translateY(0) scale(1);
}
.helper-menu-item {
display: flex;
align-items: center;
gap: 10px;
padding: 9px 14px;
background: transparent;
border: 1px solid transparent;
border-radius: 10px;
color: rgba(255, 255, 255, 0.7);
cursor: pointer;
transition: all 0.12s ease;
font-size: 13px;
font-weight: 500;
white-space: nowrap;
box-shadow: none;
animation: helperMenuItemIn 0.2s ease backwards;
}
@keyframes helperMenuItemIn {
from { opacity: 0; transform: translateX(6px); }
to { opacity: 1; transform: translateX(0); }
}
.helper-menu-item:hover {
background: rgba(255, 255, 255, 0.06);
color: #fff;
}
.helper-menu-icon {
font-size: 15px;
width: 22px;
text-align: center;
flex-shrink: 0;
}
.helper-menu-label {
flex: 1;
}
/* Contextual tour suggestion (top of menu) */
.helper-menu-contextual {
background: rgba(var(--accent-rgb), 0.08) !important;
border-color: rgba(var(--accent-rgb), 0.15) !important;
color: #fff !important;
position: relative;
overflow: hidden;
}
.helper-menu-contextual::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
border-radius: 3px 0 0 3px;
background: rgb(var(--accent-rgb));
}
.helper-menu-contextual:hover {
background: rgba(var(--accent-rgb), 0.15) !important;
border-color: rgba(var(--accent-rgb), 0.3) !important;
}
.helper-menu-badge {
font-size: 10px;
font-weight: 700;
color: rgba(var(--accent-rgb), 0.6);
margin-left: auto;
padding-left: 8px;
}
.helper-menu-divider {
height: 1px;
background: rgba(255, 255, 255, 0.06);
margin: 3px 8px;
}
/* Tour Overlay (spotlight) */
.helper-tour-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.65);
z-index: 99998;
animation: tourOverlayIn 0.3s ease;
backdrop-filter: blur(2px);
}
@keyframes tourOverlayIn {
from { opacity: 0; }
to { opacity: 1; }
}
.helper-tour-target {
position: relative;
z-index: 99999 !important;
box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.5), 0 0 30px rgba(var(--accent-rgb), 0.15) !important;
border-radius: 10px;
transition: box-shadow 0.3s ease;
animation: tourTargetPulse 2s ease-in-out infinite;
}
@keyframes tourTargetPulse {
0%, 100% { box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.5), 0 0 30px rgba(var(--accent-rgb), 0.15) !important; }
50% { box-shadow: 0 0 0 6px rgba(var(--accent-rgb), 0.3), 0 0 40px rgba(var(--accent-rgb), 0.25) !important; }
}
/* Tour Popover additions */
.helper-tour-popover {
z-index: 100001 !important;
}
/* Tour progress bar */
.helper-tour-progress-bar {
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 14px 14px 0 0;
overflow: hidden;
}
.helper-tour-progress-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
border-radius: 3px;
transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.helper-tour-step-counter {
font-size: 10px;
font-weight: 700;
color: rgba(var(--accent-rgb), 0.7);
letter-spacing: 0.04em;
padding: 10px 16px 0;
}
.helper-tour-nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 16px 14px;
gap: 8px;
}
.helper-tour-btn {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 6px 14px;
color: rgba(255, 255, 255, 0.6);
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
}
.helper-tour-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.helper-tour-btn-next {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-rgb));
}
.helper-tour-btn-next:hover {
background: rgba(var(--accent-rgb), 0.35);
color: #fff;
}
.helper-tour-btn-skip {
color: rgba(255, 255, 255, 0.35);
border-color: transparent;
background: transparent;
}
.helper-tour-btn-skip:hover {
color: rgba(255, 255, 255, 0.6);
}
/* Tour Selector */
.helper-tour-selector {
max-width: 360px;
width: 360px;
}
.helper-tour-list {
padding: 8px 12px 12px;
display: flex;
flex-direction: column;
gap: 6px;
}
.helper-tour-option {
display: flex;
flex-direction: row;
align-items: center;
gap: 12px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
cursor: pointer;
transition: all 0.15s ease;
text-align: left;
width: 100%;
}
.helper-tour-option-icon {
font-size: 22px;
flex-shrink: 0;
width: 32px;
text-align: center;
}
.helper-tour-option-body {
flex: 1;
min-width: 0;
}
.helper-tour-option:hover {
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.2);
}
.helper-tour-option-title {
font-size: 14px;
font-weight: 600;
color: #fff;
}
.helper-tour-option-desc {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.helper-tour-option-steps {
font-size: 11px;
color: rgba(var(--accent-rgb), 0.7);
font-weight: 600;
}
/* Help mode — cursor + hover highlights */
body.helper-mode-active {
cursor: help;
}
body.helper-mode-active * {
cursor: help !important;
}
/* Highlight on hoverable elements in help mode */
body.helper-mode-active .nav-button:hover,
body.helper-mode-active .tool-card:hover,
body.helper-mode-active .service-card:hover,
body.helper-mode-active .stat-card:hover,
body.helper-mode-active .version-button:hover,
body.helper-mode-active .support-button:hover,
body.helper-mode-active .status-indicator:hover,
body.helper-mode-active #media-player:hover,
body.helper-mode-active #dashboard-activity-feed:hover {
outline: 2px solid rgba(var(--accent-rgb), 0.4) !important;
outline-offset: 2px;
}
/* Active highlight on clicked element */
.helper-highlight {
outline: 2px solid rgb(var(--accent-rgb)) !important;
outline-offset: 3px;
animation: helperHighlightPulse 1.5s ease-in-out infinite;
}
@keyframes helperHighlightPulse {
0%, 100% { outline-color: rgba(var(--accent-rgb), 0.8); }
50% { outline-color: rgba(var(--accent-rgb), 0.4); }
}
/* Popover */
.helper-popover {
position: fixed;
z-index: 100000;
max-width: 340px;
min-width: 240px;
background: rgba(16, 16, 16, 0.97);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
padding: 0;
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.04);
backdrop-filter: blur(20px);
opacity: 0;
transform: scale(0.95) translateY(4px);
transition: opacity 0.2s ease, transform 0.2s ease;
pointer-events: auto;
}
.helper-popover.visible {
opacity: 1;
transform: scale(1) translateY(0);
}
.helper-popover-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px 16px 0;
}
.helper-popover-title {
font-size: 15px;
font-weight: 700;
color: #fff;
letter-spacing: -0.2px;
}
.helper-popover-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 18px;
cursor: pointer;
padding: 0;
line-height: 1;
transition: color 0.15s ease;
}
.helper-popover-close:hover {
color: #fff;
}
.helper-popover-desc {
padding: 10px 16px;
font-size: 13px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.6);
}
.helper-popover-tips {
padding: 0 16px 14px;
display: flex;
flex-direction: column;
gap: 6px;
}
.helper-popover-tip {
font-size: 12px;
line-height: 1.5;
color: rgba(255, 255, 255, 0.5);
padding-left: 20px;
position: relative;
}
.helper-popover-tip::before {
content: '';
position: absolute;
left: 0;
top: 5px;
width: 8px;
height: 8px;
border-radius: 50%;
background: rgba(var(--accent-rgb), 0.5);
}
/* Docs link */
.helper-popover-docs {
padding: 0 16px 14px;
}
.helper-popover-docs a {
font-size: 12px;
font-weight: 600;
color: rgba(var(--accent-rgb), 0.8);
text-decoration: none;
transition: color 0.15s ease;
}
.helper-popover-docs a:hover {
color: rgb(var(--accent-rgb));
}
/* Arrow */
.helper-popover-arrow {
position: absolute;
width: 10px;
height: 10px;
background: rgba(16, 16, 16, 0.97);
border: 1px solid rgba(255, 255, 255, 0.1);
transform: rotate(45deg);
}
.helper-popover-arrow.arrow-left {
left: -6px;
top: 50%;
margin-top: -5px;
border-right: none;
border-top: none;
}
.helper-popover-arrow.arrow-right {
right: -6px;
top: 50%;
margin-top: -5px;
border-left: none;
border-bottom: none;
}
.helper-popover-arrow.arrow-top {
top: -6px;
left: 50%;
margin-left: -5px;
border-bottom: none;
border-right: none;
}
/* Mobile */
@media (max-width: 768px) {
.helper-popover {
max-width: calc(100vw - 24px);
left: 12px !important;
right: 12px;
}
.helper-popover-arrow {
display: none;
}
}
/* ═══════════════════════════════════════════════════════════════════════════
HELPER V2 — PHASES 2-7 STYLES
═══════════════════════════════════════════════════════════════════════════ */
/* ── Quick Action Buttons (Phase 3) ──────────────────────────────────────── */
.helper-popover-actions {
display: flex;
gap: 6px;
padding: 0 16px 12px;
flex-wrap: wrap;
}
.helper-action-btn {
padding: 5px 14px;
font-size: 12px;
font-weight: 600;
border-radius: 20px;
border: 1px solid rgba(var(--accent-rgb), 0.3);
background: rgba(var(--accent-rgb), 0.1);
color: rgb(var(--accent-rgb));
cursor: pointer;
transition: all 0.15s ease;
white-space: nowrap;
}
.helper-action-btn:hover {
background: rgba(var(--accent-rgb), 0.25);
border-color: rgba(var(--accent-rgb), 0.5);
color: #fff;
}
/* ── Setup Progress Panel (Phase 2) ──────────────────────────────────────── */
.helper-setup-panel {
position: fixed;
right: 24px;
bottom: 80px;
width: 380px;
max-height: 80vh;
background: rgba(16, 16, 16, 0.97);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.04);
backdrop-filter: blur(24px);
z-index: 100000;
opacity: 0;
transform: translateY(12px);
transition: opacity 0.25s ease, transform 0.25s ease;
overflow: hidden;
display: flex;
flex-direction: column;
}
.helper-setup-panel.visible {
opacity: 1;
transform: translateY(0);
}
.helper-setup-header {
padding: 18px 20px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.helper-setup-title-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.helper-setup-title {
margin: 0;
font-size: 16px;
font-weight: 700;
color: #fff;
}
.helper-setup-ring-row {
display: flex;
align-items: center;
gap: 16px;
}
.helper-setup-ring {
position: relative;
width: 52px;
height: 52px;
flex-shrink: 0;
}
.helper-setup-ring-svg {
width: 52px;
height: 52px;
transform: rotate(-90deg);
}
.helper-setup-ring-progress {
transition: stroke-dasharray 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.helper-setup-ring-text {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 800;
color: rgb(var(--accent-rgb));
}
.helper-setup-count {
display: block;
font-size: 18px;
font-weight: 800;
color: #fff;
}
.helper-setup-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
}
.helper-setup-list {
overflow-y: auto;
padding: 8px 12px 12px;
display: flex;
flex-direction: column;
gap: 4px;
flex: 1;
}
.helper-setup-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.04);
transition: all 0.15s ease;
}
.helper-setup-item:hover:not(.done) {
background: rgba(var(--accent-rgb), 0.05);
border-color: rgba(var(--accent-rgb), 0.15);
}
.helper-setup-item.done {
opacity: 0.5;
}
.helper-setup-check {
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
flex-shrink: 0;
}
.helper-setup-item.done .helper-setup-check {
width: 28px;
height: 28px;
border-radius: 50%;
background: rgba(76, 175, 80, 0.2);
color: #4caf50;
font-size: 13px;
font-weight: 700;
}
.helper-setup-body {
flex: 1;
min-width: 0;
}
.helper-setup-item-label {
font-size: 13px;
font-weight: 600;
color: #fff;
}
.helper-setup-item-desc {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
}
.helper-setup-go {
padding: 4px 12px;
font-size: 11px;
font-weight: 700;
border: 1px solid rgba(var(--accent-rgb), 0.3);
background: rgba(var(--accent-rgb), 0.08);
color: rgb(var(--accent-rgb));
border-radius: 8px;
cursor: pointer;
transition: all 0.15s ease;
white-space: nowrap;
flex-shrink: 0;
}
.helper-setup-go:hover {
background: rgba(var(--accent-rgb), 0.2);
color: #fff;
}
.helper-setup-done {
padding: 16px 20px;
text-align: center;
font-size: 14px;
font-weight: 600;
color: #4caf50;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.helper-setup-loading {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
padding: 36px 20px;
color: rgba(255, 255, 255, 0.4);
font-size: 13px;
}
/* ── Keyboard Shortcuts Overlay (Phase 4) ────────────────────────────────── */
.helper-shortcuts-overlay {
position: fixed;
inset: 0;
z-index: 100000;
background: rgba(0, 0, 0, 0.75);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.25s ease;
}
.helper-shortcuts-overlay.visible {
opacity: 1;
}
.helper-shortcuts-panel {
background: rgba(16, 16, 16, 0.97);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 18px;
padding: 28px 32px;
min-width: 480px;
max-width: 640px;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.7);
backdrop-filter: blur(24px);
}
.helper-shortcuts-header {
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 24px;
}
.helper-shortcuts-header h3 {
margin: 0;
font-size: 20px;
font-weight: 800;
color: #fff;
letter-spacing: -0.3px;
}
.helper-shortcuts-hint {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
}
.helper-shortcuts-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 24px;
}
.helper-shortcuts-scope {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
color: rgba(var(--accent-rgb), 0.7);
margin-bottom: 10px;
}
.helper-shortcut-row {
display: flex;
align-items: center;
gap: 12px;
padding: 4px 0;
}
.helper-kbd {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 32px;
height: 28px;
padding: 0 8px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.12);
border-bottom-width: 3px;
border-radius: 6px;
font-family: inherit;
font-size: 12px;
font-weight: 700;
color: rgba(255, 255, 255, 0.85);
white-space: nowrap;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.04);
}
.helper-shortcut-desc {
font-size: 13px;
color: rgba(255, 255, 255, 0.55);
}
/* ── Search Panel (Phase 5) ──────────────────────────────────────────────── */
.helper-search-panel {
position: fixed;
z-index: 100000;
width: 400px;
max-height: 480px;
background: rgba(16, 16, 16, 0.97);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.04);
backdrop-filter: blur(24px);
display: flex;
flex-direction: column;
opacity: 0;
transform: translateY(8px);
transition: opacity 0.2s ease, transform 0.2s ease;
}
.helper-search-panel.visible {
opacity: 1;
transform: translateY(0);
}
.helper-search-header {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 6px 6px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.helper-search-input-wrap {
flex: 1;
display: flex;
align-items: center;
gap: 8px;
padding: 0 0 0 14px;
}
.helper-search-icon {
font-size: 14px;
flex-shrink: 0;
}
.helper-search-input {
flex: 1;
background: transparent;
border: none;
outline: none;
color: #fff;
font-size: 14px;
padding: 10px 0;
font-family: inherit;
}
.helper-search-input::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.helper-search-results {
overflow-y: auto;
padding: 6px;
flex: 1;
min-height: 0;
}
.helper-search-hint {
padding: 20px 16px;
text-align: center;
font-size: 12px;
color: rgba(255, 255, 255, 0.3);
}
.helper-search-result {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 10px 12px;
border-radius: 8px;
border: none;
background: transparent;
cursor: pointer;
transition: all 0.12s ease;
width: 100%;
text-align: left;
}
.helper-search-result:hover {
background: rgba(var(--accent-rgb), 0.08);
}
.helper-search-result-type {
font-size: 14px;
flex-shrink: 0;
margin-top: 1px;
}
.helper-search-result-body {
flex: 1;
min-width: 0;
}
.helper-search-result-title {
font-size: 13px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.helper-search-result-title mark {
background: rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-light-rgb));
border-radius: 2px;
padding: 0 1px;
}
.helper-search-result-desc {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* ── What's New Panel (Phase 6) ──────────────────────────────────────────── */
.helper-whats-new-panel {
width: 380px;
max-width: 380px;
max-height: 70vh;
overflow-y: auto;
}
.helper-whats-new-list {
padding: 4px 12px 8px;
display: flex;
flex-direction: column;
gap: 4px;
}
.helper-whats-new-item {
padding: 10px 14px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.04);
transition: all 0.15s ease;
}
.helper-whats-new-item.clickable {
cursor: pointer;
}
.helper-whats-new-item.clickable:hover {
background: rgba(var(--accent-rgb), 0.06);
border-color: rgba(var(--accent-rgb), 0.15);
}
.helper-whats-new-title {
font-size: 13px;
font-weight: 600;
color: #fff;
}
.helper-whats-new-desc {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
margin-top: 3px;
line-height: 1.4;
}
.helper-whats-new-show {
display: inline-block;
margin-top: 4px;
font-size: 11px;
font-weight: 600;
color: rgba(var(--accent-rgb), 0.7);
}
.helper-whats-new-item.clickable:hover .helper-whats-new-show {
color: rgb(var(--accent-rgb));
}
.helper-whats-new-footer {
display: flex;
gap: 8px;
padding: 8px 16px 14px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
/* ── What's New Badge ───────────────────────────────────────────────────── */
.helper-float-btn.has-badge::after {
content: '';
position: absolute;
top: 4px;
right: 4px;
width: 10px;
height: 10px;
border-radius: 50%;
background: #ff5252;
border: 2px solid rgba(16, 16, 16, 0.95);
animation: helperBadgePulse 2s ease-in-out infinite;
}
@keyframes helperBadgePulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.2); }
}
/* ── Troubleshoot Mode (Phase 7) ─────────────────────────────────────────── */
.helper-troubleshoot-target {
animation: troubleshootPulse 1.5s ease-in-out infinite;
outline: 2px solid rgba(255, 82, 82, 0.6) !important;
outline-offset: 3px;
position: relative;
z-index: 10;
}
@keyframes troubleshootPulse {
0%, 100% { outline-color: rgba(255, 82, 82, 0.6); }
50% { outline-color: rgba(255, 82, 82, 0.2); }
}
.helper-troubleshoot-panel {
width: 400px;
max-width: 400px;
max-height: 70vh;
overflow-y: auto;
}
.helper-troubleshoot-clear {
padding: 24px 20px 28px;
text-align: center;
}
.helper-troubleshoot-clear-icon {
font-size: 36px;
margin-bottom: 10px;
}
.helper-troubleshoot-clear-text {
font-size: 18px;
font-weight: 800;
color: #4caf50;
margin-bottom: 6px;
}
.helper-troubleshoot-clear-desc {
font-size: 13px;
color: rgba(255, 255, 255, 0.45);
line-height: 1.5;
}
.helper-troubleshoot-list {
padding: 4px 12px 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
.helper-troubleshoot-issue {
padding: 14px;
border-radius: 10px;
background: rgba(255, 82, 82, 0.04);
border: 1px solid rgba(255, 82, 82, 0.12);
}
.helper-troubleshoot-issue-title {
font-size: 14px;
font-weight: 700;
color: #ff8a80;
margin-bottom: 8px;
}
.helper-troubleshoot-steps {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 10px;
}
.helper-troubleshoot-step {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
line-height: 1.5;
}
/* ── First-Launch Welcome (Setup) ────────────────────────────────────────── */
.helper-float-btn.first-launch-pulse {
animation: firstLaunchPulse 1.5s ease-in-out infinite;
}
@keyframes firstLaunchPulse {
0%, 100% { box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3), 0 0 0 0 rgba(var(--accent-rgb), 0.4); }
50% { box-shadow: 0 4px 24px rgba(var(--accent-rgb), 0.5), 0 0 0 8px rgba(var(--accent-rgb), 0); }
}
.helper-first-launch-tip {
position: fixed;
bottom: 34px;
right: 84px;
padding: 8px 16px;
background: rgba(16, 16, 16, 0.95);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 10px;
color: rgba(255, 255, 255, 0.8);
font-size: 13px;
font-weight: 600;
cursor: pointer;
z-index: 999999;
backdrop-filter: blur(12px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
animation: firstLaunchTipIn 0.4s ease backwards 0.5s;
transition: opacity 0.5s ease;
white-space: nowrap;
}
.helper-first-launch-tip:hover {
background: rgba(var(--accent-rgb), 0.15);
color: #fff;
}
.helper-first-launch-tip.fading {
opacity: 0;
}
@keyframes firstLaunchTipIn {
from { opacity: 0; transform: translateX(8px); }
to { opacity: 1; transform: translateX(0); }
}
/* ── Mobile overrides for helper V2 ──────────────────────────────────────── */
@media (max-width: 768px) {
.helper-setup-panel {
right: 8px;
left: 8px;
bottom: 72px;
width: auto;
}
.helper-search-panel {
right: 8px !important;
left: 8px;
bottom: 72px !important;
width: auto;
}
.helper-shortcuts-panel {
min-width: unset;
max-width: calc(100vw - 32px);
padding: 20px;
}
.helper-shortcuts-grid {
grid-template-columns: 1fr;
}
.helper-whats-new-panel,
.helper-troubleshoot-panel {
width: auto;
max-width: calc(100vw - 24px);
}
.helper-first-launch-tip {
right: 12px;
bottom: 72px;
}
}
.version-button.update-available {
color: rgb(var(--accent-light-rgb));
border-color: rgba(var(--accent-rgb), 0.4);
animation: version-glow 2s ease-in-out infinite;
position: relative;
}
.version-button.update-available .update-badge {
display: inline-block;
margin-left: 5px;
font-size: 7px;
font-weight: 700;
letter-spacing: 0.5px;
background: rgb(var(--accent-rgb));
color: #fff;
padding: 1px 5px;
border-radius: 8px;
vertical-align: middle;
animation: badge-pulse 2s ease-in-out infinite;
}
@keyframes badge-pulse {
0%, 100% { opacity: 0.85; }
50% { opacity: 1; }
}
@keyframes version-glow {
0%, 100% {
box-shadow: 0 0 4px rgba(var(--accent-rgb), 0.2), 0 0 8px rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.3);
}
50% {
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.5), 0 0 20px rgba(var(--accent-rgb), 0.3), 0 0 30px rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.6);
}
}
/* Update banner inside version modal */
.version-update-banner {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
margin: 0 0 20px 0;
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.25);
border-radius: 8px;
color: rgb(var(--accent-light-rgb));
font-size: 11px;
font-weight: 500;
letter-spacing: 0.1px;
}
.version-update-banner-icon {
font-size: 16px;
flex-shrink: 0;
}
.version-update-banner-text {
flex: 1;
}
.version-update-banner-text strong {
display: block;
font-size: 12px;
font-weight: 600;
margin-bottom: 2px;
color: #fff;
}
.version-update-banner-text span {
color: rgba(255, 255, 255, 0.6);
font-size: 10px;
font-weight: 400;
}
/* Status Section - Premium Glassmorphic Design */
.status-section {
height: fit-content;
background: linear-gradient(180deg,
rgba(18, 18, 18, 0.95) 0%,
rgba(14, 14, 14, 0.98) 100%);
backdrop-filter: blur(8px) saturate(1.1);
border-top: 1px solid rgba(255, 255, 255, 0.06);
border-bottom-right-radius: 20px;
border-radius: 12px;
margin: 8px 14px 14px 14px;
padding: 16px 0 12px 0;
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.3),
0 2px 8px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.status-title {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 9px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
letter-spacing: 1.5px;
text-transform: uppercase;
padding: 0 20px 10px 20px;
margin-bottom: 4px;
}
.status-indicator {
height: 34px;
display: flex;
align-items: center;
gap: 12px;
padding: 6px 20px;
border-radius: 8px;
margin: 0 8px;
transition: background 0.2s ease;
}
.status-indicator:hover {
background: rgba(255, 255, 255, 0.03);
}
.status-dot {
width: 10px;
height: 10px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0;
position: relative;
flex-shrink: 0;
}
.status-dot.connected {
background: rgb(var(--accent-light-rgb));
border: none;
box-shadow:
0 0 6px rgba(var(--accent-rgb), 0.6),
0 0 12px rgba(var(--accent-rgb), 0.3);
animation: status-pulse-green 3s ease-in-out infinite;
}
.status-dot.connected::before {
content: '';
position: absolute;
inset: -3px;
border-radius: 50%;
border: 1.5px solid rgba(var(--accent-rgb), 0.3);
animation: status-ring-pulse 3s ease-in-out infinite;
}
@keyframes status-pulse-green {
0%, 100% {
box-shadow: 0 0 6px rgba(var(--accent-rgb), 0.6), 0 0 12px rgba(var(--accent-rgb), 0.3);
}
50% {
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.8), 0 0 20px rgba(var(--accent-rgb), 0.4);
}
}
@keyframes status-ring-pulse {
0%, 100% { opacity: 0.6; transform: scale(1); }
50% { opacity: 1; transform: scale(1.15); }
}
.status-dot.disconnected {
background: rgba(255, 80, 80, 0.7);
border: none;
box-shadow: 0 0 4px rgba(255, 80, 80, 0.3);
}
.status-dot.disconnected::before {
content: '';
}
.status-dot.fallback {
background: rgba(245, 166, 35, 0.7);
border: none;
box-shadow: 0 0 4px rgba(245, 166, 35, 0.3);
}
.status-dot.rate-limited {
background: rgba(250, 204, 21, 0.8);
border: none;
box-shadow: 0 0 6px rgba(250, 204, 21, 0.4);
animation: status-pulse-amber 3s ease-in-out infinite;
}
.status-dot.rate-limited::before {
content: '';
position: absolute;
inset: -3px;
border-radius: 50%;
border: 1.5px solid rgba(250, 204, 21, 0.3);
animation: status-ring-pulse 3s ease-in-out infinite;
}
@keyframes status-pulse-amber {
0%, 100% { box-shadow: 0 0 6px rgba(250, 204, 21, 0.4), 0 0 12px rgba(250, 204, 21, 0.2); }
50% { box-shadow: 0 0 8px rgba(250, 204, 21, 0.6), 0 0 20px rgba(250, 204, 21, 0.3); }
}
.status-indicator:has(.rate-limited) .status-name {
color: rgba(250, 204, 21, 0.9);
font-weight: 500;
}
.status-name {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 11px;
letter-spacing: 0.2px;
min-width: 85px;
transition: color 0.2s ease;
}
.status-indicator:has(.connected) .status-name {
color: rgba(255, 255, 255, 0.9);
font-weight: 500;
}
.status-indicator:has(.disconnected) .status-name {
color: rgba(255, 255, 255, 0.35);
font-weight: 400;
}
/* =====================================
MAIN CONTENT AREA STYLING
===================================== */
.main-content {
flex: 1;
/* Opaque dark background (GPU-optimized: no backdrop-filter needed on solid dark body) */
background: linear-gradient(135deg,
rgba(10, 10, 10, 1) 0%,
rgba(15, 15, 15, 1) 50%,
rgba(11, 11, 11, 1) 100%);
overflow: auto;
position: relative;
}
/* Global page particles canvas — sits behind all page content */
#page-particles-canvas {
position: fixed;
top: 0;
left: 240px; /* sidebar width */
right: 0;
bottom: 0;
width: calc(100vw - 240px);
height: 100vh;
pointer-events: none;
z-index: 0;
opacity: 0.55;
}
.page {
position: relative;
z-index: 1;
display: none;
height: 100%;
padding: 40px;
padding-bottom: 90px;
}
.page.active {
display: block;
}
.page-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding-bottom: 20px;
}
.page-header h2 {
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 28px;
font-weight: 700;
margin: 0;
letter-spacing: -0.3px;
display: flex;
align-items: center;
gap: 14px;
}
.page-header h2 > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
/* Dashboard Page Styling */
.dashboard-content {
display: flex;
gap: 40px;
height: calc(100vh - 150px);
}
.activity-section {
flex: 1;
background: rgba(255, 255, 255, 0.02);
border-radius: 12px;
padding: 24px;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.activity-section h3 {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 16px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 16px;
}
.activity-feed {
max-height: 400px;
overflow-y: auto;
}
.activity-item {
display: flex;
gap: 12px;
padding: 12px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.activity-time {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
min-width: 80px;
}
.activity-text {
font-size: 12px;
color: rgba(255, 255, 255, 0.8);
flex: 1;
}
.activity-separator {
height: 1px;
background: rgba(255, 255, 255, 0.05);
margin: 8px 0;
}
.stats-grid {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
width: 300px;
}
.stat-card {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.08) 0%, rgba(255, 255, 255, 0.03) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.15);
border-radius: 16px;
padding: 24px;
text-align: center;
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.3),
0 0 20px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
border-color: rgba(var(--accent-rgb), 0.25);
}
.stat-value {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 32px;
font-weight: 700;
color: rgb(var(--accent-light-rgb));
line-height: 1;
margin-bottom: 8px;
}
.stat-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.7);
font-weight: 500;
}
/* ======================================
SETTINGS PAGE - Premium Glassmorphic Design
====================================== */
/* Custom scrollbar */
#settings-page {
scrollbar-width: thin;
scrollbar-color: rgba(var(--accent-rgb), 0.3) transparent;
}
#settings-page::-webkit-scrollbar {
width: 6px;
}
#settings-page::-webkit-scrollbar-track {
background: transparent;
}
#settings-page::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.3);
border-radius: 3px;
}
#settings-page::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.5);
}
.settings-content {
width: 100%;
display: flex;
flex-direction: column;
padding: 0 4px;
}
.settings-columns {
display: flex;
gap: 20px;
margin-bottom: 24px;
}
.settings-left-column,
.settings-right-column,
.settings-third-column {
flex: 1;
min-width: 380px;
display: flex;
flex-direction: column;
gap: 16px;
}
/* Glassmorphic cards */
.settings-group {
background: linear-gradient(135deg, rgba(35, 35, 35, 0.6), rgba(20, 20, 20, 0.8));
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
padding: 20px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.05);
position: relative;
overflow: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.settings-group::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg,
rgba(var(--accent-rgb), 0.6) 0%,
rgba(var(--accent-rgb), 0.2) 50%,
transparent 100%);
}
.settings-group:hover {
border-color: rgba(255, 255, 255, 0.12);
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.45), 0 0 16px rgba(var(--accent-rgb), 0.05), inset 0 1px 0 rgba(255, 255, 255, 0.07);
}
.settings-group h3 {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 700;
color: rgba(255, 255, 255, 0.95);
margin-bottom: 14px;
margin-top: 6px;
padding-left: 10px;
padding-right: 5px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
position: relative;
text-transform: uppercase;
letter-spacing: 0.8px;
display: flex;
align-items: center;
gap: 8px;
}
.settings-group h3::after {
content: '';
position: absolute;
bottom: -1px;
left: 10px;
width: 40px;
height: 1px;
background: linear-gradient(90deg,
rgba(var(--accent-rgb), 0.7) 0%,
transparent 100%);
}
/* API Service Frames - upgraded inner cards */
.api-service-frame {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 10px;
padding: 12px 14px 14px 14px;
margin-bottom: 10px;
transition: all 0.2s ease;
}
.api-service-frame:hover {
border-color: rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.03);
}
.service-title {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 11px;
font-weight: 700;
margin-bottom: 10px;
margin-top: 0;
letter-spacing: 0.5px;
text-transform: uppercase;
}
.spotify-title {
color: rgb(var(--accent-rgb));
}
.tidal-title {
color: #ff6600;
}
.soulseek-title {
color: #5dade2;
}
.listenbrainz-title {
color: #eb743b;
}
.acoustid-title {
color: #ba55d3;
}
.lastfm-title {
color: #d51007;
}
.genius-title {
color: #ffff64;
}
/* Server Toggle Buttons - upgraded */
.server-toggle-container {
display: flex;
gap: 10px;
margin-bottom: 16px;
}
.server-toggle-btn {
flex: 1;
padding: 10px 16px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
color: rgba(255, 255, 255, 0.7);
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 8px;
justify-content: center;
flex-direction: column;
}
.server-logo {
width: 100%;
opacity: 0.7;
transition: all 0.3s ease;
}
.server-toggle-btn.active {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(var(--accent-light-rgb), 0.12) 100%);
border-color: rgba(var(--accent-rgb), 0.4);
color: rgb(var(--accent-light-rgb));
font-weight: 600;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.server-toggle-btn:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.15);
color: #ffffff;
transform: translateY(-1px);
}
.server-toggle-btn:hover .server-logo {
opacity: 1.0;
}
.server-toggle-btn.active:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.28) 0%,
rgba(var(--accent-light-rgb), 0.18) 100%);
}
.server-toggle-btn.active .server-logo {
opacity: 1.0;
}
.server-config-container {
padding-top: 8px;
}
/* Callback Info Styling */
.callback-info {
margin: 8px 0;
}
.callback-label {
color: rgba(255, 255, 255, 0.9);
font-size: 11px;
font-weight: 500;
margin-top: 8px;
margin-bottom: 4px;
}
.callback-url {
color: rgb(var(--accent-rgb));
font-size: 11px;
font-family: 'SF Mono', 'Courier New', monospace;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.08), rgba(var(--accent-rgb), 0.04));
border: 1px solid rgba(var(--accent-rgb), 0.2);
border-radius: 8px;
padding: 6px 10px;
margin-bottom: 6px;
user-select: all;
cursor: text;
}
.callback-help {
color: rgba(255, 255, 255, 0.6);
font-size: 10px;
font-style: italic;
line-height: 1.4;
}
.setting-help-text {
color: rgba(255, 255, 255, 0.5);
font-size: 11px;
font-style: italic;
line-height: 1.4;
margin-top: 6px;
padding: 8px 12px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01));
border-left: 2px solid rgba(var(--accent-rgb), 0.3);
border-radius: 6px;
}
/* Form Styling - glassmorphic inputs */
.form-group {
margin-bottom: 12px;
}
.form-group small,
.settings-group small,
.settings-hint {
display: block;
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
line-height: 1.4;
margin-top: 5px;
padding-left: 1px;
}
.form-group {
option {
color: black;
&:hover {
color: white;
}
}
}
.form-group label {
display: block;
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 5px;
letter-spacing: 0.2px;
}
.form-group input:not([type="checkbox"]):not([type="color"]),
.form-group select {
width: 100%;
padding: 9px 12px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
color: #ffffff;
font-size: 12px;
transition: all 0.25s ease;
}
.form-group input:not([type="checkbox"]):hover,
.form-group select:hover {
border-color: rgba(255, 255, 255, 0.15);
background: rgba(255, 255, 255, 0.06);
}
.form-group input:not([type="checkbox"]):not([type="color"]):focus,
.form-group select:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.5);
background: rgba(var(--accent-rgb), 0.06);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1), 0 0 12px rgba(var(--accent-rgb), 0.06);
}
.form-group input:not([type="checkbox"])::placeholder {
color: rgba(255, 255, 255, 0.25);
}
/* Checkbox Styling — toggle switch */
.checkbox-label {
display: flex !important;
align-items: center;
gap: 10px;
cursor: pointer;
font-size: 12px !important;
font-weight: 500;
margin-bottom: 0 !important;
padding: 6px 0;
transition: color 0.2s ease;
color: rgba(255, 255, 255, 0.8);
}
.checkbox-label:hover {
color: rgba(255, 255, 255, 1);
}
.checkbox-label input[type="checkbox"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
width: 34px !important;
height: 18px !important;
min-height: 0 !important;
margin: 0 !important;
padding: 0 !important;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 18px;
cursor: pointer;
position: relative;
transition: all 0.3s ease;
flex-shrink: 0;
}
.checkbox-label input[type="checkbox"]::before {
content: '';
position: absolute;
height: 12px;
width: 12px;
left: 2px;
top: 2px;
background: rgba(255, 255, 255, 0.6);
border-radius: 50%;
transition: all 0.3s ease;
}
.checkbox-label input[type="checkbox"]:checked {
background: rgba(var(--accent-rgb), 0.5);
border-color: rgba(var(--accent-rgb), 0.5);
}
.checkbox-label input[type="checkbox"]:checked::before {
transform: translateX(16px);
background: rgb(var(--accent-light-rgb));
}
/* Accent Color Selector */
.accent-color-selector {
display: flex;
align-items: center;
gap: 10px;
}
.accent-color-selector select {
flex: 1;
}
.accent-preview-swatch {
width: 36px;
height: 36px;
border-radius: 10px;
border: 2px solid rgba(255, 255, 255, 0.15);
background: rgb(var(--accent-rgb));
flex-shrink: 0;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3),
0 0 12px rgba(var(--accent-rgb), 0.3);
transition: all 0.3s ease;
}
#custom-color-group input[type="color"] {
width: 100%;
height: 40px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
background: rgba(255, 255, 255, 0.05);
cursor: pointer;
padding: 2px;
}
#custom-color-group input[type="color"]::-webkit-color-swatch-wrapper {
padding: 2px;
}
#custom-color-group input[type="color"]::-webkit-color-swatch {
border: none;
border-radius: 6px;
}
/* Help Text */
.help-text {
color: rgba(255, 255, 255, 0.5);
font-size: 10px;
font-style: italic;
line-height: 1.4;
margin-top: 4px;
padding: 8px 12px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01));
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.04);
}
/* Supported Formats */
.supported-formats {
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.06), rgba(var(--accent-rgb), 0.02));
border: 1px solid rgba(var(--accent-rgb), 0.12);
border-radius: 8px;
padding: 6px 10px;
}
/* Post-Processing Settings */
.post-processing-section {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 14px 16px;
margin-bottom: 12px;
}
.post-processing-section-title {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1.2px;
color: rgba(var(--accent-rgb), 0.8);
margin-bottom: 10px;
}
.post-processing-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px 16px;
}
/* Tag service group accordion */
.tag-service-group {
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
margin-bottom: 6px;
overflow: hidden;
}
.tag-service-header {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
cursor: pointer;
background: rgba(255, 255, 255, 0.02);
transition: background 0.15s;
user-select: none;
}
.tag-service-header:hover {
background: rgba(255, 255, 255, 0.04);
}
.tag-group-arrow {
font-size: 10px;
color: rgba(255, 255, 255, 0.4);
transition: transform 0.15s;
flex-shrink: 0;
width: 12px;
}
.tag-group-arrow.open {
transform: rotate(90deg);
}
.tag-service-header .checkbox-label {
margin: 0;
font-weight: 500;
font-size: 13px;
}
.tag-service-count {
margin-left: auto;
font-size: 11px;
opacity: 0.4;
}
.tag-service-body {
padding: 6px 12px 10px 32px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.tag-service-body .checkbox-label {
font-size: 12px;
margin-bottom: 3px;
}
.tag-service-body .checkbox-label input[type="checkbox"] {
margin-right: 6px;
}
.tag-service-body .checkbox-label.disabled-tag {
opacity: 0.35;
pointer-events: none;
}
.tag-embed-desc {
display: block;
width: 100%;
font-size: 0.75em;
opacity: 0.5;
margin-top: -2px;
margin-left: 22px;
}
/* Read-only Fields */
.readonly-field {
padding: 8px 12px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.03), rgba(255, 255, 255, 0.01));
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
color: rgba(255, 255, 255, 0.7);
font-size: 12px;
font-family: 'SF Mono', 'Courier New', monospace;
}
/* Form Actions */
.form-actions {
display: flex;
gap: 8px;
margin-top: 8px;
}
/* Buttons - gradient + elevation */
.test-button,
.detect-button {
padding: 7px 14px;
border-radius: 8px;
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
border: 1px solid rgba(255, 255, 255, 0.1);
white-space: nowrap;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.8);
}
.test-button:hover,
.detect-button:hover {
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-light-rgb));
transform: translateY(-1px);
}
/* ===== QUALITY PROFILE STYLES ===== */
.quality-presets {
margin-bottom: 20px;
}
.quality-presets label {
display: block;
margin-bottom: 8px;
color: rgba(255, 255, 255, 0.9);
font-size: 12px;
font-weight: 600;
}
.preset-buttons {
display: flex;
gap: 8px;
}
.preset-button {
flex: 1;
padding: 10px 12px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02));
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
white-space: nowrap;
}
.preset-button:hover {
background: rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-light-rgb));
transform: translateY(-1px);
}
.preset-button.active {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(var(--accent-light-rgb), 0.12) 100%);
border-color: rgba(var(--accent-rgb), 0.5);
color: rgb(var(--accent-light-rgb));
font-weight: 700;
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.15);
}
/* Quality tier cards - upgraded inner cards */
.quality-tier {
margin-bottom: 16px;
padding: 12px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.01));
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
transition: all 0.2s ease;
}
.quality-tier:hover {
border-color: rgba(255, 255, 255, 0.12);
}
.quality-tier-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.quality-tier-name {
color: rgba(255, 255, 255, 0.95);
font-size: 12px;
font-weight: 600;
}
.quality-tier-priority {
color: rgba(255, 255, 255, 0.45);
font-size: 10px;
font-weight: 500;
}
.quality-tier-sliders {
padding-left: 24px;
opacity: 1;
transition: opacity 0.3s ease;
}
.quality-tier-sliders.disabled {
opacity: 0.35;
pointer-events: none;
}
.flac-bit-depth-selector {
padding: 8px 12px;
transition: opacity 0.3s ease;
}
.flac-bit-depth-selector.disabled {
opacity: 0.35;
pointer-events: none;
}
.flac-bit-depth-selector label {
display: block;
margin-bottom: 6px;
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
}
.bit-depth-buttons {
display: flex;
gap: 8px;
}
.bit-depth-btn {
flex: 1;
padding: 7px 12px;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.bit-depth-btn.active {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(var(--accent-light-rgb), 0.12) 100%);
border-color: rgba(var(--accent-rgb), 0.4);
color: rgb(var(--accent-light-rgb));
font-weight: 600;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.bit-depth-btn:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.15);
color: #ffffff;
transform: translateY(-1px);
}
.bit-depth-btn.active:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.28) 0%,
rgba(var(--accent-light-rgb), 0.18) 100%);
}
.slider-group {
margin-top: 8px;
}
.slider-group label {
display: block;
margin-bottom: 8px;
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
}
.dual-slider-container {
position: relative;
height: 40px;
margin: 10px 0;
}
.range-slider {
position: absolute;
width: 100%;
height: 4px;
-webkit-appearance: none;
appearance: none;
background: transparent;
outline: none;
pointer-events: none;
}
.range-slider::-webkit-slider-track {
width: 100%;
height: 4px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
}
.range-slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
border-radius: 50%;
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
cursor: pointer;
pointer-events: all;
border: 2px solid #0a0a0a;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4), 0 0 8px rgba(var(--accent-rgb), 0.2);
}
.range-slider::-webkit-slider-thumb:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)), #22e968);
transform: scale(1.15);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4), 0 0 12px rgba(var(--accent-rgb), 0.3);
}
.range-slider::-moz-range-track {
width: 100%;
height: 4px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
}
.range-slider::-moz-range-thumb {
width: 16px;
height: 16px;
border-radius: 50%;
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
cursor: pointer;
pointer-events: all;
border: 2px solid #0a0a0a;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4), 0 0 8px rgba(var(--accent-rgb), 0.2);
}
.range-slider::-moz-range-thumb:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)), #22e968);
transform: scale(1.15);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4), 0 0 12px rgba(var(--accent-rgb), 0.3);
}
.range-slider-track {
position: absolute;
top: 18px;
width: 100%;
height: 4px;
background: rgba(var(--accent-rgb), 0.25);
border-radius: 2px;
pointer-events: none;
}
.slider-values {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 8px;
color: rgba(255, 255, 255, 0.5);
font-size: 11px;
font-weight: 500;
}
.slider-values span:first-child,
.slider-values span:last-child {
color: rgb(var(--accent-light-rgb));
font-weight: 700;
}
/* ===== END QUALITY PROFILE STYLES ===== */
.test-button {
background: rgba(var(--accent-rgb), 0.1);
color: rgb(var(--accent-light-rgb));
border: 1px solid rgba(var(--accent-rgb), 0.25);
}
.test-button:hover {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgba(var(--accent-rgb), 0.5);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.15);
}
.detect-button {
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(255, 255, 255, 0.15);
}
.detect-button:hover {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
/* Save Button - gradient with glow */
.save-button {
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
border: 1.5px solid rgba(255, 255, 255, 0.15);
border-radius: 12px;
color: #000000;
font-size: 14px;
font-weight: 700;
padding: 10px 28px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 18px rgba(var(--accent-rgb), 0.35), 0 2px 6px rgba(0, 0, 0, 0.2);
letter-spacing: 0.3px;
backdrop-filter: blur(12px);
position: relative;
}
.save-button:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
transform: translateY(-2px);
box-shadow: 0 6px 28px rgba(var(--accent-rgb), 0.5), 0 3px 10px rgba(0, 0, 0, 0.25);
}
.save-button:active {
transform: translateY(0) scale(0.97);
}
.settings-actions {
display: flex;
justify-content: center;
padding-top: 20px;
}
/* Additional Settings Components */
.path-input-group {
display: flex;
gap: 8px;
}
.path-input-group input {
flex: 1;
}
.browse-button {
padding: 10px 16px;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 10px;
font-size: 14px;
cursor: pointer;
white-space: nowrap;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.browse-button:hover {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.path-input-group input[readonly] {
opacity: 0.55;
cursor: not-allowed;
}
.browse-button.locked {
opacity: 0.7;
}
/* Auth Button - gradient */
.auth-button {
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
color: #000000;
padding: 10px 20px;
border: none;
border-radius: 12px;
font-size: 11px;
font-weight: 700;
cursor: pointer;
margin-top: 8px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.2);
}
.auth-button:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)), #22e968);
transform: translateY(-1px);
box-shadow: 0 6px 16px rgba(var(--accent-rgb), 0.35);
}
.disconnect-button {
background: linear-gradient(135deg, #e53935, #ef5350) !important;
color: #ffffff !important;
box-shadow: 0 4px 12px rgba(229, 57, 53, 0.2) !important;
}
.disconnect-button:hover {
background: linear-gradient(135deg, #ef5350, #f44336) !important;
box-shadow: 0 6px 16px rgba(229, 57, 53, 0.35) !important;
}
.tidal-title+* .auth-button {
background: linear-gradient(135deg, #ff6600, #ff8833);
box-shadow: 0 4px 12px rgba(255, 102, 0, 0.2);
}
.tidal-title+* .auth-button:hover {
background: linear-gradient(135deg, #ff8833, #ff9944);
box-shadow: 0 6px 16px rgba(255, 102, 0, 0.35);
}
/* API Test Buttons */
.api-test-buttons {
display: flex;
gap: 8px;
margin-top: 16px;
flex-wrap: wrap;
}
.api-test-buttons .test-button {
flex: 1;
min-width: 120px;
max-width: calc(33.333% - 6px);
}
/* Server Test Section */
.server-test-section {
margin-top: 16px;
text-align: center;
}
.server-test-btn {
width: 100%;
}
.reset-button,
.export-button,
.import-button {
padding: 10px 20px;
border-radius: 10px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
border: none;
}
.reset-button {
background: rgba(255, 107, 107, 0.1);
color: #ff6b6b;
border: 1px solid rgba(255, 107, 107, 0.25);
}
.reset-button:hover {
background: rgba(255, 107, 107, 0.2);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(255, 107, 107, 0.15);
}
.export-button,
.import-button {
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(255, 255, 255, 0.15);
}
.export-button:hover,
.import-button:hover {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
transform: translateY(-1px);
}
.cancel-button {
padding: 6px 12px;
background: rgba(255, 107, 107, 0.1);
color: #ff6b6b;
border: 1px solid rgba(255, 107, 107, 0.3);
border-radius: 6px;
font-size: 12px;
cursor: pointer;
margin-top: 8px;
}
.cancel-button:hover {
background: rgba(255, 107, 107, 0.2);
}
.status-display {
margin-top: 12px;
padding: 8px 12px;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 6px;
font-size: 12px;
}
.status-display .status-text {
color: rgba(255, 255, 255, 0.7);
}
.status-display.connected .status-text {
color: rgb(var(--accent-light-rgb));
}
.status-display.error .status-text {
color: #ff6b6b;
}
.detection-progress {
margin-top: 12px;
padding: 12px;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 8px;
}
.detection-progress .progress-bar {
width: 100%;
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
overflow: hidden;
margin-bottom: 8px;
}
.detection-progress .progress-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
width: 0%;
transition: width 0.3s ease;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
.detection-progress .progress-text {
font-size: 12px;
color: rgba(255, 255, 255, 0.8);
margin-bottom: 8px;
}
/* Form styling improvements */
.form-group input[type="checkbox"] {
width: auto;
margin-right: 8px;
accent-color: rgb(var(--accent-light-rgb));
}
.form-group input[type="number"] {
width: 120px;
}
.form-group select {
width: 200px;
}
/* Sync Page Styling */
.sync-content {
max-width: 600px;
display: flex;
flex-direction: column;
gap: 24px;
}
.playlist-section {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
padding: 24px;
}
.playlist-section h3 {
font-size: 16px;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 16px;
}
.playlist-selector {
width: 100%;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
color: #ffffff;
font-size: 14px;
margin-bottom: 16px;
}
.sync-button {
background: rgb(var(--accent-light-rgb));
color: #000000;
padding: 12px 24px;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
}
.sync-button:hover {
background: #1fdf64;
}
.sync-progress {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
padding: 24px;
}
.progress-bar {
width: 100%;
height: 8px;
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
overflow: hidden;
margin-bottom: 12px;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
width: 0%;
transition: width 0.3s ease;
}
.progress-text {
text-align: center;
color: rgba(255, 255, 255, 0.8);
font-size: 14px;
}
/* ======================================================= */
/* == STYLES FOR DOWNLOADS PAGE == */
/* ======================================================= */
/* Main Layout: Replicates QSplitter */
.downloads-content {
display: grid;
grid-template-columns: 1fr 370px;
/* Left panel is flexible, right is fixed */
gap: 24px;
height: 100%;
/* Fill parent .page content area */
padding: 0 40px 40px 40px;
}
.downloads-main-panel,
.downloads-side-panel {
display: flex;
flex-direction: column;
gap: 16px;
min-height: 0;
}
.downloads-side-panel {
margin-top: 100px;
overflow-y: scroll;
}
/* Header: Replicates create_elegant_header() */
.downloads-header {
padding: 16px 0;
}
.downloads-header-content {
display: flex;
justify-content: space-between;
align-items: center;
gap: 20px;
}
.downloads-header-text {
flex: 1;
}
.downloads-header .downloads-title {
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 28px;
font-weight: 700;
letter-spacing: -0.3px;
display: flex;
align-items: center;
gap: 14px;
}
.downloads-header .downloads-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
.downloads-header .downloads-subtitle {
font-family: 'Segoe UI', sans-serif;
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
font-weight: 300;
margin-top: 4px;
}
/* Toggle Download Manager Button */
.toggle-manager-btn {
background: linear-gradient(135deg,
rgba(35, 35, 35, 0.8) 0%,
rgba(25, 25, 25, 0.9) 100%);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 50%;
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
flex-shrink: 0;
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.toggle-manager-btn:hover {
background: linear-gradient(135deg,
rgba(45, 45, 45, 0.9) 0%,
rgba(35, 35, 35, 0.95) 100%);
border-color: rgba(var(--accent-rgb), 0.4);
transform: scale(1.05);
box-shadow:
0 6px 16px rgba(0, 0, 0, 0.4),
0 0 20px rgba(var(--accent-rgb), 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.toggle-manager-btn:active {
transform: scale(0.95);
}
.toggle-icon {
font-size: 20px;
font-weight: 600;
color: #ffffff;
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
line-height: 1;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
/* When manager is hidden, rotate the icon */
.downloads-content.manager-hidden .toggle-icon {
transform: rotate(180deg);
}
/* Hide side panel when toggled */
.downloads-content.manager-hidden {
grid-template-columns: 1fr;
/* Only show main panel */
}
.downloads-content.manager-hidden .downloads-side-panel {
display: none;
}
/* Responsive: Mobile adjustments for toggle button */
@media (max-width: 768px) {
.downloads-header-content {
gap: 12px;
}
.toggle-manager-btn {
width: 40px;
height: 40px;
}
.toggle-icon {
font-size: 20px;
}
.downloads-header .downloads-title {
font-size: 24px;
}
.downloads-header .downloads-subtitle {
font-size: 12px;
}
}
@media (max-width: 480px) {
.downloads-header-content {
gap: 10px;
}
.toggle-manager-btn {
width: 36px;
height: 36px;
}
.toggle-icon {
font-size: 18px;
}
.downloads-header .downloads-title {
font-size: 20px;
}
.downloads-header .downloads-subtitle {
font-size: 11px;
}
}
/* Search Bar: Replicates create_elegant_search_bar() */
.search-bar-container {
background: linear-gradient(to bottom, rgba(50, 50, 50, 0.55), rgba(40, 40, 40, 0.65));
border-radius: 12px;
border: 1px solid rgba(var(--accent-rgb), 0.3);
padding: 16px 20px;
display: flex;
gap: 16px;
align-items: center;
}
#downloads-search-input {
flex-grow: 1;
height: 40px;
background: rgba(60, 60, 60, 0.7);
border: 2px solid rgba(100, 100, 100, 0.3);
border-radius: 20px;
padding: 0 20px;
color: #ffffff;
font-size: 14px;
font-weight: 500;
outline: none;
transition: all 0.2s ease;
}
#downloads-search-input:focus {
border-color: rgba(var(--accent-rgb), 0.8);
background: rgba(70, 70, 70, 0.9);
}
#downloads-search-btn,
#downloads-cancel-btn {
height: 40px;
border: none;
border-radius: 20px;
font-size: 13px;
font-weight: bold;
cursor: pointer;
transition: background 0.2s ease;
}
#downloads-search-btn {
background: linear-gradient(to bottom, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
color: #000000;
width: 120px;
}
#downloads-search-btn:hover {
background: linear-gradient(to bottom, #1fdf64, rgb(var(--accent-light-rgb)));
}
#downloads-cancel-btn {
background: linear-gradient(to bottom, rgba(220, 53, 69, 0.9), rgba(200, 43, 58, 0.9));
color: #ffffff;
width: 100px;
}
#downloads-cancel-btn:hover {
background: linear-gradient(to bottom, rgba(240, 73, 89, 1.0), rgba(220, 63, 79, 1.0));
}
/* Search Status Bar */
.search-status-container {
background: linear-gradient(to right, rgba(var(--accent-rgb), 0.12), rgba(var(--accent-rgb), 0.08));
border-radius: 10px;
border: 1px solid rgba(var(--accent-rgb), 0.25);
padding: 8px 10px;
display: flex;
align-items: center;
gap: 12px;
}
#search-status-text {
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
}
/* Search Results Area */
.search-results-container {
background: rgba(20, 20, 20, 0.2);
border-radius: 12px;
border: 1px solid rgba(64, 64, 64, 0.2);
padding: 16px;
display: flex;
flex-direction: column;
flex-grow: 1;
min-height: 0;
/* Take remaining vertical space */
}
.search-results-header h3 {
color: rgba(255, 255, 255, 0.95);
font-size: 14px;
font-weight: 600;
margin-bottom: 12px;
}
.search-results-scroll-area {
overflow-y: auto;
flex-grow: 1;
padding-right: 5px;
/* Space for scrollbar */
}
.search-results-placeholder {
text-align: center;
padding: 50px;
color: rgba(255, 255, 255, 0.4);
font-size: 14px;
}
/* SearchResultItem (Single Track) Styling */
.search-result-item {
background: linear-gradient(to bottom, rgba(48, 48, 52, 0.95), rgba(38, 38, 42, 0.98));
border-radius: 18px;
border: 1px solid rgba(70, 70, 76, 0.5);
margin-bottom: 8px;
padding: 16px;
display: flex;
align-items: center;
justify-content: space-between;
transition: all 0.2s ease;
}
.search-result-item:hover {
border-color: rgba(var(--accent-rgb), 0.8);
transform: translateY(-2px);
}
.result-item__main-content {
display: flex;
align-items: center;
gap: 16px;
flex-grow: 1;
min-width: 0;
/* Prevents text overflow issues */
}
.result-item__icon {
width: 44px;
height: 44px;
border-radius: 22px;
background: linear-gradient(to bottom right, rgba(var(--accent-rgb), 0.3), rgba(24, 156, 71, 0.2));
border: 2px solid rgba(var(--accent-rgb), 0.4);
font-size: 18px;
color: rgb(var(--accent-light-rgb));
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.result-item__info {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.result-item__title-row {
display: flex;
align-items: center;
gap: 8px;
}
.result-item__title {
font-size: 12px;
font-weight: bold;
color: #ffffff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.result-item__secondary-info {
font-size: 9px;
color: rgba(179, 179, 179, 0.8);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.result-item__actions {
display: flex;
gap: 8px;
}
.action-btn {
width: 46px;
height: 46px;
border-radius: 23px;
border: 2px solid;
font-size: 18px;
font-weight: bold;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.action-btn:hover {
transform: scale(1.1);
}
.action-btn--stream {
background: linear-gradient(to bottom, #ffc107, #ff9800);
border-color: rgba(255, 193, 7, 0.3);
color: #000;
}
.action-btn--download {
background: linear-gradient(to bottom, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
border-color: rgba(var(--accent-rgb), 0.3);
color: #000;
}
.action-btn--matched {
background: linear-gradient(to bottom, #9333ea, #7c28c0);
border-color: rgba(147, 51, 234, 0.3);
color: #fff;
}
/* AlbumResultItem Styling */
.album-result-item {
background: linear-gradient(to bottom, rgba(52, 52, 58, 0.95), rgba(42, 42, 48, 0.98));
border-radius: 20px;
border: 1px solid rgba(75, 75, 82, 0.5);
margin-bottom: 10px;
padding: 0;
display: flex;
flex-direction: column;
transition: all 0.2s ease;
}
.album-result-item:hover {
border-color: rgba(var(--accent-rgb), 0.8);
}
.album-item__header {
display: flex;
align-items: center;
gap: 16px;
padding: 16px;
cursor: pointer;
}
.album-item__icon-container {
text-align: center;
}
.album-item__icon {
width: 48px;
height: 48px;
border-radius: 24px;
background: linear-gradient(to bottom right, rgba(var(--accent-rgb), 0.2), rgba(24, 156, 71, 0.15));
border: 2px solid rgba(var(--accent-rgb), 0.4);
font-size: 24px;
color: rgb(var(--accent-light-rgb));
display: flex;
align-items: center;
justify-content: center;
}
.album-item__expand-indicator {
color: rgba(var(--accent-rgb), 0.9);
font-size: 14px;
font-weight: bold;
background: rgba(var(--accent-rgb), 0.1);
border-radius: 10px;
width: 20px;
height: 20px;
line-height: 20px;
margin: 4px auto 0;
transition: transform 0.3s ease;
}
.album-item__info {
flex-grow: 1;
min-width: 0;
}
.album-item__title {
font-size: 12px;
font-weight: bold;
color: #fff;
}
.album-item__details {
font-size: 10px;
color: rgba(179, 179, 179, 0.9);
margin: 2px 0;
}
.album-item__user {
font-size: 9px;
color: rgba(var(--accent-rgb), 0.8);
}
.album-item__actions {
display: flex;
flex-direction: column;
gap: 4px;
}
.album-action-btn {
height: 36px;
width: 160px;
border-radius: 18px;
border: 2px solid;
font-size: 12px;
font-weight: bold;
cursor: pointer;
transition: background 0.2s ease;
}
.album-action-btn--download {
background: linear-gradient(to bottom, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
border-color: rgba(var(--accent-rgb), 0.3);
color: #000;
}
.album-action-btn--download:hover {
background: linear-gradient(to bottom, #1fdf64, rgb(var(--accent-light-rgb)));
}
.album-action-btn--matched {
background: linear-gradient(to bottom, #9333ea, #7c28c0);
border-color: rgba(147, 51, 234, 0.3);
color: #fff;
}
.album-action-btn--matched:hover {
background: linear-gradient(to bottom, #a747fe, #903fdd);
}
/* Album Expansion and TrackItem Styling */
.album-item__tracks-container {
max-height: 0;
overflow: hidden;
transition: max-height 0.4s ease-in-out;
}
.album-result-item.expanded .album-item__tracks-container {
max-height: 1000px;
/* Large value to allow content to expand */
}
.album-result-item.expanded .album-item__expand-indicator {
transform: rotate(90deg);
}
.track-item {
background: rgba(40, 40, 40, 0.5);
border-radius: 8px;
border: 1px solid rgba(60, 60, 60, 0.3);
margin: 2px 16px 6px 80px;
padding: 8px 12px;
display: flex;
align-items: center;
justify-content: space-between;
}
.track-item:hover {
background: rgba(50, 50, 50, 0.7);
border-color: rgba(var(--accent-rgb), 0.5);
}
.track-item__info {
flex-grow: 1;
min-width: 0;
}
.track-item__title {
display: block;
font-size: 11px;
font-weight: bold;
color: #fff;
}
.track-item__details {
display: block;
font-size: 9px;
color: rgba(179, 179, 179, 0.8);
}
.track-item__actions {
display: flex;
gap: 8px;
}
.track-item .action-btn {
width: 32px;
height: 32px;
border-radius: 16px;
font-size: 12px;
}
/* Right Panel: Controls & Download Queue */
.controls-panel {
background: linear-gradient(to bottom, rgba(40, 40, 40, 0.6), rgba(25, 25, 25, 0.7));
border-radius: 18px;
border: 1px solid rgba(80, 80, 80, 0.4);
padding: 14px 8px;
flex-shrink: 0;
/* Prevent this panel from shrinking */
}
.controls-panel__header {
font-size: 12px;
font-weight: bold;
color: rgba(255, 255, 255, 0.9);
padding: 6px 14px;
}
.controls-panel__stats {
background: linear-gradient(to bottom, rgba(45, 45, 45, 0.7), rgba(35, 35, 35, 0.8));
border-radius: 10px;
border: 1px solid rgba(80, 80, 80, 0.3);
padding: 8px 10px;
margin: 0 6px;
font-size: 9px;
color: rgba(255, 255, 255, 0.8);
}
.controls-panel__actions {
padding: 6px;
}
.controls-panel__clear-btn {
width: 100%;
height: 28px;
background: linear-gradient(to bottom, rgba(220, 53, 69, 0.4), rgba(220, 53, 69, 0.25));
border: 1px solid rgba(220, 53, 69, 0.8);
color: #dc3545;
border-radius: 14px;
font-size: 10px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s ease;
}
.controls-panel__clear-btn:hover {
background: linear-gradient(to bottom, rgba(220, 53, 69, 0.5), rgba(220, 53, 69, 0.35));
}
.controls-panel__cancel-all-btn {
width: 100%;
height: 28px;
margin-top: 4px;
background: linear-gradient(to bottom, rgba(255, 152, 0, 0.4), rgba(255, 152, 0, 0.25));
border: 1px solid rgba(255, 152, 0, 0.8);
color: #ff9800;
border-radius: 14px;
font-size: 10px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s ease;
}
.controls-panel__cancel-all-btn:hover {
background: linear-gradient(to bottom, rgba(255, 152, 0, 0.5), rgba(255, 152, 0, 0.35));
}
/* Download Manager (Tabs & Queue) */
.download-manager {
flex-grow: 1;
display: flex;
flex-direction: column;
}
.download-manager__tabs {
display: flex;
}
.tab-btn {
flex-grow: 1;
padding: 6px 12px;
background: #404040;
color: #ffffff;
border: 1px solid #606060;
border-bottom: none;
font-size: 10px;
font-weight: bold;
cursor: pointer;
transition: background 0.2s ease;
}
.tab-btn:first-child {
border-top-left-radius: 8px;
}
.tab-btn:last-child {
border-top-right-radius: 8px;
}
.tab-btn.active {
background: rgb(var(--accent-rgb));
color: #000000;
border-color: rgb(var(--accent-rgb));
}
.tab-btn:hover:not(.active) {
background: #505050;
}
.download-manager__content {
background: #282828;
border: 1px solid #404040;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
padding: 8px;
flex-grow: 1;
}
.download-queue {
display: none;
}
.download-queue.active {
display: block;
}
.download-queue__empty-message {
text-align: center;
padding: 20px;
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
}
/* Download Queue Item */
.download-item {
background: rgba(45, 45, 45, 0.95);
border-radius: 6px;
border: 1px solid rgba(60, 60, 60, 0.6);
padding: 12px;
margin-bottom: 6px;
}
.download-item__title {
font-size: 10px;
font-weight: 500;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.download-item__bottom-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin-top: 10px;
}
.download-item__uploader {
font-size: 9px;
color: #b8b8b8;
flex-grow: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.download-item__progress-container {
width: 90px;
text-align: center;
}
.progress-bar {
height: 6px;
background: rgba(60, 60, 60, 0.8);
border-radius: 3px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: rgb(var(--accent-light-rgb));
border-radius: 3px;
width: 0%;
transition: width 0.2s linear;
}
.progress-text {
font-size: 8px;
color: #c0c0c0;
}
.download-item__cancel-btn {
width: 60px;
height: 35px;
background: rgba(220, 53, 69, 0.9);
color: white;
border: 1px solid rgba(220, 53, 69, 0.6);
border-radius: 4px;
font-size: 9px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s ease;
}
.download-item__cancel-btn:hover {
background: rgba(240, 73, 89, 1.0);
}
.download-item__status-container {
width: auto;
text-align: right;
}
.download-item__open-btn {
width: 60px;
height: 35px;
background: rgba(40, 167, 69, 0.9);
color: white;
border: 1px solid rgba(var(--accent-rgb), 0.6);
border-radius: 4px;
font-size: 9px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s ease;
}
.download-item__open-btn:hover {
background: rgba(50, 187, 79, 1.0);
}
.download-item__status-text {
font-weight: bold;
font-size: 10px;
}
.status--cancelled {
color: #ffa500;
}
/* Artists Page Styling */
.artists-content {
height: calc(100vh - 150px);
overflow-y: auto;
}
.artists-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
}
/* Loading Overlay */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.8);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
z-index: 9999;
}
.loading-spinner {
width: 40px;
height: 40px;
border: 4px solid rgba(255, 255, 255, 0.1);
border-top: 4px solid rgb(var(--accent-light-rgb));
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.loading-message {
color: rgba(255, 255, 255, 0.8);
margin-top: 16px;
font-size: 14px;
}
/* Toast Notifications */
/* ==================================================================================
NOTIFICATION SYSTEM — Compact toasts + bell button + notification panel
================================================================================== */
/* Toast container — bottom-right, above the bell/helper buttons */
.toast-container {
position: fixed;
bottom: 84px;
right: 24px;
z-index: 99999;
pointer-events: none;
}
/* Compact toast pill */
.toast-compact {
display: flex;
align-items: center;
gap: 10px;
max-width: 380px;
padding: 12px 16px;
background: rgba(18, 18, 26, 0.92);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-left: 3px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
color: #fff;
font-size: 13px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255,255,255,0.03) inset;
pointer-events: auto;
cursor: pointer;
opacity: 0;
transform: translateY(12px) scale(0.96);
transition: opacity 0.25s ease, transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.toast-compact.toast-enter { opacity: 1; transform: translateY(0) scale(1); }
.toast-compact.toast-exit { opacity: 0; transform: translateY(-8px) scale(0.96); }
/* Type-specific left border colors */
.toast-success { border-left-color: #4caf50; }
.toast-error { border-left-color: #ef5350; }
.toast-warning { border-left-color: #ffb74d; }
.toast-info { border-left-color: #64b5f6; }
.toast-compact-icon {
font-size: 14px; font-weight: 800; flex-shrink: 0;
width: 22px; height: 22px; border-radius: 6px;
display: flex; align-items: center; justify-content: center;
}
.toast-success .toast-compact-icon { background: rgba(76,175,80,0.15); color: #4caf50; }
.toast-error .toast-compact-icon { background: rgba(239,83,80,0.15); color: #ef5350; }
.toast-warning .toast-compact-icon { background: rgba(255,183,77,0.15); color: #ffb74d; }
.toast-info .toast-compact-icon { background: rgba(100,181,246,0.15); color: #64b5f6; }
.toast-compact-msg { flex: 1; line-height: 1.3; min-width: 0; word-break: break-word; }
.toast-compact-link {
font-size: 11px; font-weight: 600; color: var(--accent);
white-space: nowrap; flex-shrink: 0; cursor: pointer;
transition: opacity 0.15s;
}
.toast-compact-link:hover { opacity: 0.7; }
/* ── Notification Bell Button ── */
.notif-bell-btn {
position: fixed;
bottom: 24px;
right: 80px;
width: 44px;
height: 44px;
border-radius: 50%;
background: rgba(20, 20, 28, 0.85);
backdrop-filter: blur(16px);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.5);
cursor: pointer;
z-index: 999999;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
transition: all 0.2s;
}
.notif-bell-btn:hover {
background: rgba(30, 30, 40, 0.95);
color: rgba(255, 255, 255, 0.8);
border-color: rgba(255, 255, 255, 0.15);
transform: scale(1.05);
}
.notif-bell-badge {
position: absolute;
top: -2px;
right: -2px;
min-width: 18px;
height: 18px;
border-radius: 9px;
background: #ef5350;
color: #fff;
font-size: 10px;
font-weight: 800;
display: flex;
align-items: center;
justify-content: center;
padding: 0 4px;
border: 2px solid rgba(16, 16, 16, 0.95);
line-height: 1;
}
/* ── Notification Panel ── */
.notif-panel {
position: fixed;
width: 380px;
max-width: 95vw;
max-height: 60vh;
background: rgba(14, 14, 20, 0.97);
backdrop-filter: blur(24px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255,255,255,0.03) inset;
z-index: 999998;
display: flex;
flex-direction: column;
opacity: 0;
transform: translateY(8px) scale(0.96);
transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.notif-panel.visible { opacity: 1; transform: translateY(0) scale(1); }
.notif-panel-header {
display: flex; justify-content: space-between; align-items: center;
padding: 16px 18px 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.notif-panel-title { font-size: 14px; font-weight: 700; color: #fff; }
.notif-panel-clear {
font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.35);
background: none; border: none; cursor: pointer; transition: color 0.15s;
}
.notif-panel-clear:hover { color: rgba(255,255,255,0.7); }
.notif-panel-body {
overflow-y: auto; flex: 1; padding: 6px;
}
.notif-panel-body::-webkit-scrollbar { width: 4px; }
.notif-panel-body::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 2px; }
.notif-panel-empty {
padding: 30px 16px; text-align: center;
font-size: 12px; color: rgba(255,255,255,0.2);
}
/* Individual notification entry */
.notif-entry {
display: flex; align-items: flex-start; gap: 10px;
padding: 10px 12px; border-radius: 10px;
margin-bottom: 2px; position: relative;
transition: background 0.15s;
}
.notif-entry:hover { background: rgba(255, 255, 255, 0.03); }
.notif-entry-unread {
position: absolute; left: 4px; top: 50%; transform: translateY(-50%);
width: 6px; height: 6px; border-radius: 50%;
background: var(--accent);
}
.notif-entry-icon {
width: 24px; height: 24px; border-radius: 6px;
display: flex; align-items: center; justify-content: center;
font-size: 12px; font-weight: 800; flex-shrink: 0; margin-top: 1px;
}
.notif-icon-success { background: rgba(76,175,80,0.12); color: #4caf50; }
.notif-icon-error { background: rgba(239,83,80,0.12); color: #ef5350; }
.notif-icon-warning { background: rgba(255,183,77,0.12); color: #ffb74d; }
.notif-icon-info { background: rgba(100,181,246,0.12); color: #64b5f6; }
.notif-entry-body { flex: 1; min-width: 0; }
.notif-entry-msg { font-size: 12px; color: rgba(255,255,255,0.8); line-height: 1.35; word-break: break-word; }
.notif-entry-meta { font-size: 10px; color: rgba(255,255,255,0.25); margin-top: 3px; display: flex; align-items: center; gap: 8px; }
.notif-entry-link {
font-size: 10px; font-weight: 600; color: var(--accent);
cursor: pointer; transition: opacity 0.15s;
}
.notif-entry-link:hover { opacity: 0.7; }
/* ==================================================================================
GLOBAL SEARCH BAR — Spotlight-style search from anywhere
================================================================================== */
.gsearch-bar {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
width: 380px;
height: 42px;
display: flex;
align-items: center;
gap: 8px;
padding: 0 16px;
background: rgba(18, 18, 26, 0.65);
backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 21px;
z-index: 99998;
opacity: 0.55;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: text;
}
.gsearch-bar:hover {
opacity: 0.8;
border-color: rgba(255, 255, 255, 0.15);
background: rgba(18, 18, 26, 0.8);
}
.gsearch-bar.active {
opacity: 1;
width: 560px;
background: rgba(18, 18, 26, 0.92);
backdrop-filter: blur(24px);
border-color: rgba(var(--accent-rgb), 0.3);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(var(--accent-rgb), 0.08);
}
.gsearch-icon {
color: rgba(255, 255, 255, 0.3);
display: flex;
align-items: center;
flex-shrink: 0;
transition: color 0.2s;
}
.gsearch-bar.active .gsearch-icon { color: var(--accent); }
.gsearch-input {
flex: 1;
background: none;
border: none;
outline: none;
color: #fff;
font-size: 13px;
font-weight: 500;
min-width: 0;
}
.gsearch-input::placeholder { color: rgba(255, 255, 255, 0.25); }
.gsearch-bar.active .gsearch-input::placeholder { color: rgba(255, 255, 255, 0.4); }
.gsearch-clear {
width: 20px; height: 20px; border-radius: 50%; border: none;
background: rgba(255,255,255,0.08); color: rgba(255,255,255,0.4);
font-size: 14px; cursor: pointer; display: flex; align-items: center;
justify-content: center; flex-shrink: 0; transition: all 0.15s; padding: 0;
}
.gsearch-clear:hover { background: rgba(255,255,255,0.15); color: #fff; }
.gsearch-shortcut {
font-size: 11px;
font-weight: 700;
color: rgba(255, 255, 255, 0.15);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 5px;
padding: 2px 7px;
flex-shrink: 0;
transition: opacity 0.2s;
}
.gsearch-bar.active .gsearch-shortcut { opacity: 0; pointer-events: none; }
/* ── Results Panel ── */
.gsearch-results {
position: fixed;
bottom: 76px;
left: 50%;
transform: translateX(-50%);
width: 620px;
max-width: 95vw;
max-height: 60vh;
background: rgba(14, 14, 20, 0.97);
backdrop-filter: blur(30px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 18px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.03) inset;
z-index: 99997;
display: none;
flex-direction: column;
overflow: hidden;
}
.gsearch-results.visible { display: flex; animation: gsearchSlideUp 0.2s ease; }
@keyframes gsearchSlideUp {
from { opacity: 0; transform: translateX(-50%) translateY(10px); }
to { opacity: 1; transform: translateX(-50%) translateY(0); }
}
.gsearch-results-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 18px 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
flex-shrink: 0;
}
.gsearch-results-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: rgba(255,255,255,0.3); }
.gsearch-results-count { font-size: 10px; color: rgba(255,255,255,0.2); }
.gsearch-results-body {
overflow-y: auto;
flex: 1;
padding: 8px 12px 14px;
}
.gsearch-results-body::-webkit-scrollbar { width: 4px; }
.gsearch-results-body::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 2px; }
/* Source tabs */
.gsearch-tabs {
display: flex;
gap: 4px;
padding: 8px 18px 4px;
flex-shrink: 0;
}
.gsearch-tab {
padding: 5px 12px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.06);
background: rgba(255, 255, 255, 0.03);
color: rgba(255, 255, 255, 0.45);
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s;
}
.gsearch-tab.active { background: rgba(var(--accent-rgb), 0.12); color: var(--accent); border-color: rgba(var(--accent-rgb), 0.2); }
.gsearch-tab:hover:not(.active) { background: rgba(255,255,255,0.06); }
/* Section headers */
.gsearch-section-header {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.25);
padding: 10px 6px 6px;
}
/* Result items — compact grid */
.gsearch-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 6px;
}
.gsearch-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border-radius: 10px;
cursor: pointer;
transition: background 0.15s;
}
.gsearch-item:hover { background: rgba(255, 255, 255, 0.05); }
.gsearch-item-art {
width: 40px;
height: 40px;
border-radius: 8px;
overflow: hidden;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.04);
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
color: rgba(255, 255, 255, 0.15);
}
.gsearch-item-art img { width: 100%; height: 100%; object-fit: cover; }
.gsearch-item-info { flex: 1; min-width: 0; }
.gsearch-item-title { font-size: 12px; font-weight: 600; color: rgba(255,255,255,0.85); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gsearch-item-sub { font-size: 10px; color: rgba(255,255,255,0.35); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 1px; }
.gsearch-item-badge {
font-size: 8px; font-weight: 700; text-transform: uppercase;
padding: 2px 6px; border-radius: 4px;
background: rgba(76,175,80,0.12); color: #4caf50;
flex-shrink: 0;
}
.gsearch-loading {
text-align: center; padding: 24px; font-size: 12px; color: rgba(255,255,255,0.2);
}
.gsearch-empty {
text-align: center; padding: 24px; font-size: 12px; color: rgba(255,255,255,0.2);
}
.gsearch-section-loading,
.enh-section-loading {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 8px;
font-size: 11px;
color: rgba(255,255,255,0.3);
}
/* Track list (not grid) */
.gsearch-track-list { display: flex; flex-direction: column; }
.gsearch-track {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 10px;
border-radius: 8px;
cursor: pointer;
transition: background 0.15s;
}
.gsearch-track:hover { background: rgba(255, 255, 255, 0.04); }
.gsearch-track-dur {
font-size: 10px; color: rgba(255,255,255,0.2);
flex-shrink: 0; min-width: 32px; text-align: right;
}
.gsearch-play-btn {
width: 26px; height: 26px; border-radius: 50%; border: none;
background: rgba(var(--accent-rgb), 0.12); color: var(--accent);
font-size: 10px; cursor: pointer; display: flex; align-items: center;
justify-content: center; flex-shrink: 0; transition: all 0.15s;
opacity: 0;
}
.gsearch-track:hover .gsearch-play-btn { opacity: 1; }
.gsearch-play-btn:hover { background: var(--accent); color: #fff; transform: scale(1.1); }
.gsearch-source-badge {
font-size: 9px; font-weight: 600; padding: 1px 6px; border-radius: 4px;
background: rgba(var(--accent-rgb), 0.1); color: var(--accent);
margin-left: 6px; vertical-align: middle;
}
/* ── Global Search Mobile ── */
@media (max-width: 768px) {
.gsearch-bar {
width: calc(100% - 48px);
left: 24px;
right: 24px;
transform: none;
bottom: 80px;
height: 40px;
}
.gsearch-bar.active {
width: calc(100% - 32px);
left: 16px;
right: 16px;
}
.gsearch-results {
width: calc(100% - 32px);
left: 16px;
right: 16px;
transform: none;
bottom: 130px;
max-height: 50vh;
border-radius: 14px;
}
.gsearch-grid {
grid-template-columns: 1fr;
}
.gsearch-shortcut { display: none; }
.gsearch-item-art { width: 36px; height: 36px; }
.gsearch-tabs { flex-wrap: wrap; }
}
/* ── Wing It Button ── */
/* ── Wing It Button + Dropdown ── */
.wing-it-wrap {
position: relative;
display: inline-block;
}
.wing-it-btn {
background: rgba(255, 255, 255, 0.05) !important;
border: 1px solid rgba(255, 255, 255, 0.1) !important;
color: rgba(255, 255, 255, 0.6) !important;
font-size: 13px !important;
font-weight: 600 !important;
padding: 8px 16px !important;
border-radius: 10px !important;
cursor: pointer;
transition: all 0.2s;
}
.wing-it-btn:hover {
background: rgba(255, 255, 255, 0.1) !important;
border-color: rgba(255, 255, 255, 0.2) !important;
color: #fff !important;
}
.wing-it-dropdown {
position: absolute;
bottom: calc(100% + 6px);
left: 50%;
transform: translateX(-50%) translateY(4px) scale(0.96);
background: rgba(18, 18, 26, 0.97);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 4px;
min-width: 180px;
box-shadow: 0 12px 36px rgba(0, 0, 0, 0.5);
z-index: 10001;
opacity: 0;
transform: translateY(4px) scale(0.96);
transition: opacity 0.15s, transform 0.15s;
pointer-events: none;
}
.wing-it-dropdown.visible {
opacity: 1;
transform: translateX(-50%) translateY(0) scale(1);
pointer-events: auto;
}
.wing-it-dropdown.flip-down {
bottom: auto;
top: calc(100% + 6px);
}
.wing-it-dropdown-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 14px;
border-radius: 8px;
cursor: pointer;
transition: background 0.15s;
border: none;
background: none;
width: 100%;
text-align: left;
color: rgba(255, 255, 255, 0.8);
font-size: 13px;
font-weight: 500;
}
.wing-it-dropdown-item:hover {
background: rgba(255, 255, 255, 0.06);
}
.wing-it-dropdown-icon {
font-size: 15px;
width: 20px;
text-align: center;
flex-shrink: 0;
}
.wing-it-dropdown-label { flex: 1; }
.wing-it-dropdown-hint {
font-size: 10px;
color: rgba(255, 255, 255, 0.25);
}
.wing-it-btn-sm {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.5);
font-size: 11px;
font-weight: 600;
border-radius: 6px;
padding: 4px 10px;
cursor: pointer;
transition: all 0.2s;
}
.wing-it-btn-sm:hover {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.8);
}
/* Desktop-Only Optimizations */
@media (min-width: 769px) {
.main-container {
min-width: 1200px;
}
.sidebar {
min-width: 240px;
max-width: 240px;
}
.main-content {
min-width: 960px;
}
}
/* Optimize for larger screens */
@media (min-width: 1440px) {
.stats-grid {
width: 350px;
/* Wider stats on large monitors */
}
.settings-content {
max-width: 900px;
/* Wider settings forms */
}
}
/* ===== VERSION MODAL STYLES ===== */
.version-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.75);
backdrop-filter: blur(8px);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
opacity: 1;
transition: opacity 0.3s ease-in-out;
}
.version-modal-overlay.hidden {
opacity: 0;
pointer-events: none;
}
.version-modal {
background: #1a1a1a;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.1);
width: 600px;
max-width: 90vw;
height: 500px;
max-height: 90vh;
display: flex;
flex-direction: column;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
transform: scale(1);
transition: transform 0.3s ease-in-out;
}
.version-modal-overlay.hidden .version-modal {
transform: scale(0.9);
}
/* Header */
.version-modal-header {
padding: 30px 30px 15px 30px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
border-top-left-radius: 12px;
border-top-right-radius: 12px;
background: #1a1a1a;
}
.version-modal-title {
color: #ffffff;
font-size: 18px;
font-weight: 700;
letter-spacing: -0.5px;
margin: 0 0 5px 0;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
.version-modal-subtitle {
color: rgba(255, 255, 255, 0.7);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.1px;
margin: 0;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
/* Content Area */
.version-modal-content {
flex: 1;
padding: 0;
overflow-y: auto;
background: #1a1a1a;
}
.version-modal-content::-webkit-scrollbar {
width: 8px;
}
.version-modal-content::-webkit-scrollbar-track {
background: #2a2a2a;
border-radius: 4px;
}
.version-modal-content::-webkit-scrollbar-thumb {
background: #555555;
border-radius: 4px;
}
.version-modal-content::-webkit-scrollbar-thumb:hover {
background: #666666;
}
.version-content-container {
padding: 25px 30px;
}
/* Feature Sections */
.version-feature-section {
margin-bottom: 25px;
padding: 18px 20px;
border-left: 3px solid rgba(var(--accent-rgb), 0.4);
margin-left: 5px;
background: transparent;
}
.version-section-title {
color: rgb(var(--accent-light-rgb));
font-size: 14px;
font-weight: 600;
letter-spacing: -0.2px;
margin: 0 0 8px 0;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
.version-section-description {
color: rgba(255, 255, 255, 0.8);
font-size: 11px;
line-height: 1.4;
margin: 0 0 12px 0;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
.version-feature-list {
list-style: none;
padding: 0;
margin: 0;
}
.version-feature-item {
color: rgba(255, 255, 255, 0.7);
font-size: 10px;
line-height: 1.5;
padding: 2px 0 2px 8px;
margin: 2px 0;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
.version-usage-note {
color: rgb(var(--accent-light-rgb));
font-size: 10px;
line-height: 1.4;
margin: 8px 0 0 0;
padding: 8px 0;
font-style: italic;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
/* Footer */
.version-modal-footer {
padding: 15px 30px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
border-bottom-left-radius: 12px;
border-bottom-right-radius: 12px;
background: rgba(255, 255, 255, 0.02);
display: flex;
justify-content: flex-end;
}
.version-modal-close {
background: rgb(var(--accent-rgb));
color: white;
border: none;
border-radius: 6px;
padding: 8px 25px;
font-size: 10px;
font-weight: 500;
letter-spacing: 0.1px;
cursor: pointer;
transition: background-color 0.2s ease;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
}
.version-modal-close:hover {
background: rgb(var(--accent-light-rgb));
}
.version-modal-close:active {
background: #169c46;
}
/* Animation for modal appearance */
@keyframes modalFadeIn {
from {
opacity: 0;
transform: scale(0.9);
}
to {
opacity: 1;
transform: scale(1);
}
}
.version-modal-overlay:not(.hidden) .version-modal {
animation: modalFadeIn 0.3s ease-out;
}
/* ===== MATCHED DOWNLOAD MODAL STYLES ===== */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(18, 18, 18, 0.85);
backdrop-filter: blur(12px);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
opacity: 1;
transition: opacity 0.4s ease-in-out;
}
.modal-overlay.hidden {
opacity: 0;
pointer-events: none;
}
.matching-modal {
background: linear-gradient(135deg, #1a1a1a 0%, #121212 100%);
border-radius: 20px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
width: 1100px;
max-width: 95vw;
height: 750px;
max-height: 95vh;
display: flex;
flex-direction: column;
box-shadow: 0 25px 80px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(var(--accent-rgb), 0.1);
transform: scale(1);
transition: transform 0.4s ease-in-out;
overflow: hidden;
}
.modal-overlay.hidden .matching-modal {
transform: scale(0.9);
}
/* Modal Header */
.matching-modal-header {
padding: 30px 40px 20px 40px;
border-bottom: 1px solid rgba(var(--accent-rgb), 0.15);
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.03) 0%, transparent 50%);
display: flex;
justify-content: space-between;
align-items: center;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
}
#matching-modal-title {
color: #ffffff;
font-size: 24px;
font-weight: 700;
letter-spacing: -0.5px;
margin: 0;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.matching-modal-close {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
border: none;
border-radius: 50%;
width: 36px;
height: 36px;
font-size: 16px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.matching-modal-close:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
transform: scale(1.1);
}
/* Modal Content */
.matching-modal-content {
flex: 1;
padding: 30px 40px;
overflow-y: auto;
background: #121212;
}
.matching-modal-content::-webkit-scrollbar {
width: 8px;
}
.matching-modal-content::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.matching-modal-content::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.3);
border-radius: 4px;
}
.matching-modal-content::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.5);
}
/* Selection Stages */
.selection-stage {
opacity: 1;
transform: translateY(0);
transition: all 0.4s ease-in-out;
}
.selection-stage.hidden {
opacity: 0;
transform: translateY(20px);
pointer-events: none;
}
.stage-header {
margin-bottom: 30px;
}
.stage-header h3 {
color: rgb(var(--accent-rgb));
font-size: 22px;
font-weight: 700;
margin-bottom: 8px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.stage-subtitle {
color: rgba(255, 255, 255, 0.7);
font-size: 16px;
font-weight: 400;
margin: 0;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
/* Suggestions Sections */
.suggestions-section,
.manual-search-section {
margin-bottom: 40px;
}
.suggestions-title {
color: rgba(255, 255, 255, 0.9);
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.suggestions-container {
display: flex;
gap: 20px;
flex-wrap: wrap;
justify-content: flex-start;
align-items: flex-start;
min-height: 140px;
}
.suggestions-container.loading {
justify-content: center;
align-items: center;
}
/* Suggestion Cards */
.suggestion-card {
width: 220px;
height: 130px;
background: linear-gradient(135deg, #1e1e1e 0%, #2a2a2a 100%);
border: 2px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
cursor: pointer;
transition: all 0.3s ease;
overflow: hidden;
position: relative;
display: flex;
flex-direction: column;
}
.suggestion-card:hover {
border-color: rgba(var(--accent-rgb), 0.6);
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(var(--accent-rgb), 0.2);
}
.suggestion-card.selected {
border-color: rgb(var(--accent-rgb));
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.1) 0%, rgba(var(--accent-rgb), 0.05) 100%);
box-shadow: 0 0 20px rgba(var(--accent-rgb), 0.4);
}
.suggestion-card-image {
width: 100%;
height: 80px;
object-fit: cover;
border-radius: 14px 14px 0 0;
}
.suggestion-card-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(to bottom,
rgba(18, 18, 18, 0.3) 0%,
rgba(18, 18, 18, 0.6) 60%,
rgba(18, 18, 18, 0.9) 100%);
border-radius: 16px;
}
.suggestion-card-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 12px;
z-index: 1;
}
.suggestion-card-name {
color: #ffffff;
font-size: 16px;
font-weight: 700;
margin-bottom: 4px;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.suggestion-card-details {
color: rgba(255, 255, 255, 0.7);
font-size: 12px;
font-weight: 500;
line-height: 1.2;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.suggestion-card-confidence {
background: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-rgb));
padding: 2px 8px;
border-radius: 8px;
font-size: 11px;
font-weight: 600;
display: inline-block;
margin-top: 4px;
}
/* Loading Cards */
.loading-card {
width: 220px;
height: 130px;
background: linear-gradient(135deg, #1e1e1e 0%, #2a2a2a 100%);
border: 2px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
font-weight: 500;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.loading-card::before {
content: '';
width: 20px;
height: 20px;
border: 2px solid rgba(var(--accent-rgb), 0.3);
border-top: 2px solid rgb(var(--accent-rgb));
border-radius: 50%;
animation: spin 1s linear infinite;
margin-right: 10px;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* Search Input */
.search-input {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 2px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
color: #ffffff;
padding: 14px 20px;
font-size: 16px;
font-weight: 400;
margin-bottom: 20px;
transition: border-color 0.2s ease;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.search-input:focus {
outline: none;
border-color: rgb(var(--accent-rgb));
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1);
}
.search-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
/* Modal Actions */
.matching-modal-actions {
padding: 20px 40px 30px 40px;
border-top: 1px solid rgba(var(--accent-rgb), 0.15);
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.02) 0%, transparent 50%);
display: flex;
justify-content: space-between;
align-items: center;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
}
.modal-button {
padding: 12px 24px;
border: none;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.modal-button--primary {
background: rgb(var(--accent-rgb));
color: #ffffff;
min-width: 140px;
}
.modal-button--primary:hover:not(:disabled) {
background: rgb(var(--accent-light-rgb));
transform: translateY(-1px);
}
.modal-button--primary:disabled {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.4);
cursor: not-allowed;
}
.modal-button--secondary {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
}
.modal-button--secondary:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
}
.modal-button--cancel {
background: rgba(255, 65, 54, 0.1);
color: #ff4136;
}
.modal-button--cancel:hover {
background: rgba(255, 65, 54, 0.2);
color: #ff6b5a;
}
/* Modal Animation */
@keyframes matchingModalFadeIn {
from {
opacity: 0;
transform: scale(0.9) translateY(20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
.modal-overlay:not(.hidden) .matching-modal {
animation: matchingModalFadeIn 0.4s ease-out;
}
/* Confirm Dialog Modal */
/* Confirm dialog must sit above all other modals (playlist, download, etc.) */
#confirm-modal-overlay {
z-index: 200000;
}
.confirm-modal {
background: linear-gradient(135deg, #1a1a1a 0%, #121212 100%);
border-radius: 20px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
width: 460px;
max-width: 90vw;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 25px 80px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(var(--accent-rgb), 0.1);
transform: scale(1);
transition: transform 0.4s ease-in-out;
overflow: hidden;
}
.modal-overlay.hidden .confirm-modal {
transform: scale(0.9);
}
.modal-overlay:not(.hidden) .confirm-modal {
animation: matchingModalFadeIn 0.4s ease-out;
}
.confirm-modal-header {
padding: 20px 24px 16px 24px;
border-bottom: 1px solid rgba(var(--accent-rgb), 0.15);
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.03) 0%, transparent 50%);
display: flex;
justify-content: space-between;
align-items: center;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
}
#confirm-modal-title {
color: #ffffff;
font-size: 18px;
font-weight: 700;
margin: 0;
}
.confirm-modal-close {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
border: none;
border-radius: 50%;
width: 32px;
height: 32px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.confirm-modal-close:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
transform: scale(1.1);
}
.confirm-modal-content {
padding: 20px 24px;
}
#confirm-modal-message {
color: rgba(255, 255, 255, 0.85);
font-size: 14px;
line-height: 1.6;
margin: 0;
white-space: pre-line;
}
.confirm-modal-actions {
padding: 16px 24px 20px 24px;
border-top: 1px solid rgba(var(--accent-rgb), 0.1);
display: flex;
justify-content: flex-end;
gap: 10px;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
}
/* ── Spotify Rate Limit Modal ─────────────────────────────── */
.rate-limit-modal {
width: 500px;
border-color: rgba(255, 170, 0, 0.2) !important;
box-shadow:
0 25px 80px rgba(0, 0, 0, 0.7),
0 0 0 1px rgba(255, 170, 0, 0.1),
0 0 40px rgba(255, 170, 0, 0.04) !important;
}
.rate-limit-modal-header {
border-bottom-color: rgba(255, 170, 0, 0.15) !important;
background: linear-gradient(135deg, rgba(255, 170, 0, 0.07) 0%, transparent 60%) !important;
}
.rate-limit-title-row {
display: flex;
align-items: center;
gap: 10px;
}
.rate-limit-icon {
color: #ffaa00;
flex-shrink: 0;
filter: drop-shadow(0 0 6px rgba(255, 170, 0, 0.3));
}
.rate-limit-title-row h2 {
color: #ffaa00;
font-size: 18px;
font-weight: 700;
margin: 0;
letter-spacing: -0.3px;
}
.rate-limit-description {
color: rgba(255, 255, 255, 0.7);
font-size: 13.5px;
line-height: 1.6;
margin: 0 0 20px 0;
}
.rate-limit-details {
background: rgba(255, 170, 0, 0.03);
border: 1px solid rgba(255, 170, 0, 0.1);
border-radius: 12px;
padding: 4px 18px;
margin-bottom: 18px;
}
.rate-limit-detail-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 0;
}
.rate-limit-detail-row:not(:last-child) {
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.rate-limit-label {
color: rgba(255, 255, 255, 0.45);
font-size: 13px;
font-weight: 500;
}
.rate-limit-value {
color: rgba(255, 255, 255, 0.9);
font-size: 13.5px;
font-weight: 600;
}
.rate-limit-endpoint {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 12px;
color: rgba(255, 170, 0, 0.85);
background: rgba(255, 170, 0, 0.1);
padding: 3px 10px;
border-radius: 6px;
border: 1px solid rgba(255, 170, 0, 0.12);
}
.rate-limit-countdown {
color: #ffaa00;
font-size: 14px;
font-weight: 700;
font-variant-numeric: tabular-nums;
letter-spacing: 0.3px;
}
.rate-limit-hint {
color: rgba(255, 255, 255, 0.4);
font-size: 12.5px;
line-height: 1.55;
margin: 0;
}
.rate-limit-modal-actions {
border-top-color: rgba(255, 170, 0, 0.1) !important;
justify-content: space-between !important;
}
.rate-limit-disconnect-btn {
background: rgba(255, 170, 0, 0.1) !important;
color: #ffaa00 !important;
border: 1px solid rgba(255, 170, 0, 0.25) !important;
border-radius: 10px !important;
padding: 10px 20px !important;
font-size: 13.5px !important;
font-weight: 600 !important;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
flex-direction: column;
align-items: center;
gap: 3px;
}
.rate-limit-disconnect-btn:hover {
background: rgba(255, 170, 0, 0.18) !important;
border-color: rgba(255, 170, 0, 0.4) !important;
box-shadow: 0 0 20px rgba(255, 170, 0, 0.08);
}
.rate-limit-disconnect-sub {
font-size: 10.5px;
font-weight: 400;
color: rgba(255, 170, 0, 0.55);
letter-spacing: 0.1px;
}
/* GUI-Matching Search Results Styling */
/* Single Track Card (SearchResultItem) */
.track-result-card {
/* Premium glassmorphic foundation matching modal */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
margin: 12px 8px;
padding: 20px;
display: flex;
align-items: center;
gap: 18px;
position: relative;
overflow: hidden;
/* Neumorphic depth shadows - elevated card effect */
box-shadow:
/* Main depth shadow */
0 15px 35px rgba(0, 0, 0, 0.6),
/* Subtle green glow like modal */
0 0 0 1px rgba(var(--accent-rgb), 0.08),
/* Inner highlight for glass effect */
inset 0 1px 0 rgba(255, 255, 255, 0.06),
/* Inner shadow for depth */
inset 0 -1px 0 rgba(0, 0, 0, 0.1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateZ(0);
}
.track-result-card:hover {
/* Enhanced glassmorphic hover state */
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(22, 22, 22, 1.0) 100%);
border-color: rgba(var(--accent-rgb), 0.3);
border-top-color: rgba(var(--accent-rgb), 0.4);
/* More dramatic elevated effect */
box-shadow:
0 20px 45px rgba(0, 0, 0, 0.7),
0 0 0 1px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1),
inset 0 -1px 0 rgba(0, 0, 0, 0.15);
transform: translateY(-2px) translateZ(0);
}
.track-icon {
background: linear-gradient(to bottom right,
rgba(var(--accent-rgb), 0.3),
rgba(24, 156, 71, 0.2));
border-radius: 22px;
border: 2px solid rgba(var(--accent-rgb), 0.4);
font-size: 18px;
color: rgba(var(--accent-rgb), 1.0);
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.track-info {
flex: 1;
min-width: 0;
}
.track-title {
font-size: 14px;
font-weight: bold;
color: #ffffff;
margin-bottom: 2px;
}
.track-artist {
font-size: 12px;
color: #b3b3b3;
margin-bottom: 2px;
}
.track-details {
font-size: 10px;
color: #888888;
margin-bottom: 2px;
}
.track-uploader {
font-size: 10px;
color: rgba(var(--accent-rgb), 1.0);
font-weight: 500;
}
.track-actions {
flex-shrink: 0;
}
/* Track download button now uses shared neo-button styling above */
/* Album Card (AlbumResultItem) */
.album-result-card {
/* Premium glassmorphic foundation matching modal */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
margin: 12px 8px;
padding: 24px;
position: relative;
overflow: hidden;
/* Neumorphic depth shadows - elevated card effect */
box-shadow:
/* Main depth shadow */
0 18px 40px rgba(0, 0, 0, 0.6),
/* Subtle green glow like modal */
0 0 0 1px rgba(var(--accent-rgb), 0.08),
/* Inner highlight for glass effect */
inset 0 1px 0 rgba(255, 255, 255, 0.06),
/* Inner shadow for depth */
inset 0 -1px 0 rgba(0, 0, 0, 0.1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateZ(0);
}
.album-result-card:hover {
/* Enhanced glassmorphic hover state */
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(22, 22, 22, 1.0) 100%);
border-color: rgba(var(--accent-rgb), 0.3);
border-top-color: rgba(var(--accent-rgb), 0.4);
/* More dramatic elevated effect */
box-shadow:
0 25px 50px rgba(0, 0, 0, 0.7),
0 0 0 1px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1),
inset 0 -1px 0 rgba(0, 0, 0, 0.15);
transform: translateY(-3px) translateZ(0);
}
.album-card-header {
display: flex;
align-items: center;
gap: 18px;
}
.album-icon {
font-size: 28px;
background: linear-gradient(to bottom right,
rgba(var(--accent-rgb), 0.2),
rgba(24, 156, 71, 0.15));
border-radius: 28px;
border: 2px solid rgba(var(--accent-rgb), 0.4);
width: 56px;
height: 56px;
display: flex;
align-items: center;
justify-content: center;
color: rgba(var(--accent-rgb), 1.0);
flex-shrink: 0;
}
.album-info {
flex: 1;
min-width: 0;
}
.album-title {
font-size: 16px;
font-weight: bold;
color: #ffffff;
margin-bottom: 3px;
}
.album-artist {
font-size: 13px;
color: #b3b3b3;
margin-bottom: 3px;
}
.album-details {
font-size: 11px;
color: #888888;
margin-bottom: 3px;
}
.album-uploader {
font-size: 11px;
color: rgba(var(--accent-rgb), 1.0);
font-weight: 500;
}
.album-actions {
flex-shrink: 0;
}
/* Album download button now uses shared neo-button styling above */
/* Album Expansion Functionality */
.album-card-header {
cursor: pointer;
position: relative;
}
.album-expand-indicator {
position: absolute;
left: -12px;
top: 50%;
transform: translateY(-50%);
font-size: 12px;
color: rgba(var(--accent-rgb), 0.8);
transition: transform 0.2s ease;
}
.album-result-card.expanded .album-expand-indicator {
transform: translateY(-50%) rotate(90deg);
}
/* Track List within Albums */
.album-track-list {
margin-top: 16px;
padding-top: 16px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
}
/* Individual Track Items (TrackItem) - Subtle glassmorphism */
.track-item {
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.03) 0%,
rgba(255, 255, 255, 0.01) 100%);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.05);
padding: 12px;
margin-bottom: 8px;
display: flex;
align-items: center;
justify-content: space-between;
/* Subtle inner depth */
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.03),
inset 0 -1px 0 rgba(0, 0, 0, 0.05);
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.track-item:hover {
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.06) 0%,
rgba(255, 255, 255, 0.02) 100%);
border-color: rgba(var(--accent-rgb), 0.2);
/* Enhanced subtle depth */
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.05),
inset 0 -1px 0 rgba(0, 0, 0, 0.08),
0 2px 8px rgba(0, 0, 0, 0.1);
}
.track-item-info {
flex: 1;
min-width: 0;
}
.track-item-title {
font-size: 12px;
font-weight: bold;
color: #ffffff;
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.track-item-details {
font-size: 10px;
color: #888888;
}
.track-item-actions {
flex-shrink: 0;
margin-left: 8px;
}
/* Sophisticated Download Tracking Styles */
/* Download Queue Items */
.download-item {
background: linear-gradient(to bottom,
rgba(45, 45, 50, 0.95),
rgba(35, 35, 40, 0.98));
border: 1px solid rgba(65, 65, 70, 0.5);
border-radius: 12px;
margin: 6px 0;
padding: 12px;
transition: all 0.2s ease;
}
.download-item:hover {
background: linear-gradient(to bottom,
rgba(50, 50, 55, 0.98),
rgba(40, 40, 45, 1.0));
border-color: rgba(var(--accent-rgb), 0.6);
}
.download-item__header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.download-item__title {
font-size: 13px;
font-weight: 600;
color: #ffffff;
max-width: 200px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.download-item__uploader {
font-size: 10px;
padding-left: 15px;
color: rgba(var(--accent-rgb), 1.0);
font-weight: 500;
}
.download-item__content {
display: flex;
justify-content: center;
flex-direction: row;
gap: 15px;
}
/* Progress Bar Styles */
.download-item__progress-container {
display: flex;
flex-direction: column;
gap: 4px;
}
.progress-bar {
width: 100%;
height: 6px;
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
border-radius: 3px;
transition: width 0.3s ease;
}
.progress-text {
font-size: 10px;
color: #b3b3b3;
display: flex;
justify-content: space-between;
align-items: center;
}
/* Action Buttons */
.download-item__cancel-btn {
background: linear-gradient(to bottom,
rgba(255, 69, 58, 0.9),
rgba(255, 45, 85, 0.8));
border: 1px solid rgba(255, 69, 58, 0.4);
border-radius: 6px;
color: #ffffff;
font-size: 11px;
font-weight: 600;
padding: 12px 12px !important;
cursor: pointer;
transition: all 0.2s ease;
align-self: flex-start;
width: fit-content !important;
height: fit-content !important;
}
.download-item__cancel-btn:hover {
background: linear-gradient(to bottom,
rgba(255, 69, 58, 1.0),
rgba(255, 45, 85, 0.9));
border-color: rgba(255, 69, 58, 0.6);
}
.download-item__status-container {
display: flex;
align-items: center;
gap: 8px;
}
.download-item__status-text {
font-size: 11px;
font-weight: 500;
padding: 4px 8px;
border-radius: 4px;
}
.download-item__status-text.status--completed {
background: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-light-rgb));
border: 1px solid rgba(var(--accent-rgb), 0.4);
}
.download-item__status-text.status--cancelled {
background: rgba(255, 159, 10, 0.2);
color: #ff9f0a;
border: 1px solid rgba(255, 159, 10, 0.4);
}
.download-item__status-text.status--failed {
background: rgba(255, 69, 58, 0.2);
color: #ff453a;
border: 1px solid rgba(255, 69, 58, 0.4);
}
.download-item__open-btn {
background: rgba(var(--accent-rgb), 0.1);
color: rgba(var(--accent-rgb), 0.6);
border: 1px solid rgba(var(--accent-rgb), 0.2);
border-radius: 6px;
font-size: 11px;
padding: 6px 12px;
cursor: not-allowed;
opacity: 0.6;
}
/* Tab Management */
.download-manager__tabs {
display: flex;
gap: 4px;
margin-bottom: 8px;
}
.download-manager__tabs .tab-btn {
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.7);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 10px 16px;
cursor: pointer;
font-size: 12px;
font-weight: 500;
transition: all 0.2s ease;
flex: 1;
text-align: center;
white-space: nowrap;
}
.download-manager__tabs .tab-btn.active {
background: linear-gradient(to bottom,
rgba(var(--accent-rgb), 0.2),
rgba(var(--accent-rgb), 0.1));
color: rgb(var(--accent-light-rgb));
border-color: rgba(var(--accent-rgb), 0.4);
}
.download-manager__tabs .tab-btn:hover:not(.active) {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
}
/* Queue Content */
.download-queue {
display: none;
max-height: 100%;
overflow-y: auto;
padding: 8px;
}
.download-queue.active {
display: block;
}
.download-queue__empty-message {
text-align: center;
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
padding: 20px;
font-style: italic;
}
/* Scrollbar Styling for Download Queue */
.download-queue::-webkit-scrollbar {
width: 6px;
}
.download-queue::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 3px;
}
.download-queue::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.3);
border-radius: 3px;
}
.download-queue::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.5);
}
/* APPEND THIS CSS SNIPPET */
/* ======================================================= */
/* == STYLES FOR FILTERS PANEL == */
/* ======================================================= */
.filters-container {
background: linear-gradient(to bottom, rgba(45, 45, 45, 0.6), rgba(35, 35, 35, 0.8));
border-radius: 10px;
border: 1px solid rgba(80, 80, 80, 0.25);
padding: 8px 16px;
transition: max-height 0.4s ease-in-out;
max-height: fit-content;
/* Collapsed height */
margin-top: 16px;
}
.filters-container.expanded {
max-height: fit-content;
/* Expanded height */
}
.filters-container:not(.expanded) .filter-content {
display: none;
}
.filter-toggle-header {
display: flex;
}
.filter-toggle-btn {
background: linear-gradient(to bottom, rgba(80, 80, 80, 0.9), rgba(70, 70, 70, 0.95));
border: 1px solid rgba(100, 100, 100, 0.3);
border-radius: 6px;
color: rgba(255, 255, 255, 0.8);
font-size: 11px;
font-weight: 600;
padding: 6px 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.filter-toggle-btn:hover {
background: linear-gradient(to bottom, rgba(90, 90, 90, 0.9), rgba(80, 80, 80, 0.95));
}
.filter-content {
padding-top: 10px;
}
.filter-group {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
}
.filter-label {
color: rgba(255, 255, 255, 0.8);
font-size: 11px;
font-weight: 600;
}
.filter-btn {
background: linear-gradient(to bottom, rgba(80, 80, 80, 0.4), rgba(60, 60, 60, 0.6));
border: 1px solid rgba(120, 120, 120, 0.3);
border-radius: 16px;
color: rgba(255, 255, 255, 0.8);
font-size: 11px;
font-weight: 500;
padding: 4px 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.filter-btn:hover {
background: linear-gradient(to bottom, rgba(100, 100, 100, 0.5), rgba(80, 80, 80, 0.7));
border-color: rgba(140, 140, 140, 0.4);
}
.filter-btn.active {
background: linear-gradient(to bottom, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
border-color: transparent;
color: #000000;
font-weight: 700;
}
.sort-order-btn {
width: 28px;
height: 28px;
padding: 0;
font-size: 14px;
}
/* ===============================
MODAL-STYLE BUTTON STYLES
=============================== */
/* Modal-style button foundation */
.track-stream-btn,
.track-download-btn,
.track-matched-btn,
.album-download-btn,
.album-matched-btn {
/* Modal button styling */
padding: 10px 18px;
border: none;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
outline: none;
user-select: none;
-webkit-user-select: none;
position: relative;
overflow: hidden;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-width: 80px;
}
/* Stream buttons - secondary modal style */
.track-stream-btn {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
}
.track-stream-btn:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
transform: translateY(-1px);
}
/* Download buttons - primary modal style */
.track-download-btn,
.album-download-btn {
background: rgb(var(--accent-rgb));
color: #ffffff;
}
.track-download-btn:hover,
.album-download-btn:hover {
background: rgb(var(--accent-light-rgb));
transform: translateY(-1px);
}
/* Matched buttons - accent modal style */
.track-matched-btn,
.album-matched-btn {
background: rgba(147, 51, 234, 0.9);
color: #ffffff;
}
.track-matched-btn:hover,
.album-matched-btn:hover {
background: #9333ea;
transform: translateY(-1px);
}
/* Active states - simple pressed effect like modal */
.track-stream-btn:active,
.track-download-btn:active,
.track-matched-btn:active,
.album-download-btn:active,
.album-matched-btn:active {
transform: translateY(0);
}
/* Album stream buttons - modal style */
.album-stream-btn {
padding: 10px 18px;
border: none;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
outline: none;
user-select: none;
display: inline-flex;
align-items: center;
gap: 6px;
margin-right: 8px;
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
}
.album-stream-btn:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
transform: translateY(-1px);
}
/* Disabled states - modal style */
.track-stream-btn:disabled,
.track-download-btn:disabled,
.track-matched-btn:disabled,
.album-stream-btn:disabled,
.album-download-btn:disabled,
.album-matched-btn:disabled {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.4);
cursor: not-allowed;
transform: none;
}
/* Playing states - modal style */
.track-stream-btn.playing,
.album-stream-btn.playing {
background: rgb(var(--accent-rgb));
color: #ffffff;
}
/* Loading states - modal style */
.track-stream-btn.loading,
.album-stream-btn.loading {
background: rgba(255, 193, 7, 0.9);
color: #000000;
animation: pulse-loading 1.5s infinite;
}
@keyframes pulse-loading {
0% {
opacity: 0.7;
}
50% {
opacity: 1;
}
100% {
opacity: 0.7;
}
}
/* ======================================================= */
/* == STYLES FOR DASHBOARD PAGE == */
/* ======================================================= */
/* Main Dashboard Layout */
.dashboard-container {
display: flex;
flex-direction: column;
gap: 25px;
/* Spacing between sections */
padding: 28px 24px 30px 24px;
/* Semi-transparent to let page particles show through */
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.55) 0%,
rgba(12, 12, 12, 0.62) 100%);
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
margin: 20px;
/* Soft floating shadow */
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.3),
0 4px 16px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.dashboard-section {
display: flex;
flex-direction: column;
gap: 15px;
padding: 20px 0;
position: relative;
}
.dashboard-section::after {
content: '';
position: absolute;
bottom: 0;
left: 5%;
right: 5%;
height: 1px;
background: linear-gradient(90deg,
transparent 0%,
rgba(var(--accent-rgb), 0.08) 15%,
rgba(255, 255, 255, 0.06) 50%,
rgba(var(--accent-rgb), 0.08) 85%,
transparent 100%);
}
.dashboard-section:last-child::after {
display: none;
}
.section-title {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 18px;
font-weight: 600;
color: rgba(255, 255, 255, 0.5);
text-transform: uppercase;
letter-spacing: 1.2px;
margin: 0 0 8px 0;
line-height: 1.2;
padding-bottom: 10px;
position: relative;
border-bottom: none;
}
.dashboard-section > .section-title::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 40px;
height: 2px;
background: linear-gradient(90deg,
rgb(var(--accent-rgb)) 0%,
rgba(var(--accent-rgb), 0.3) 100%);
border-radius: 1px;
box-shadow: 0 0 6px rgba(var(--accent-rgb), 0.3);
}
/* Dashboard Active Downloads */
.dashboard-downloads-group {
margin-bottom: 20px;
}
.dashboard-downloads-group:last-child {
margin-bottom: 0;
}
.dashboard-downloads-group-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 12px;
}
.dashboard-downloads-group-label {
font-size: 14px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.5);
}
.dashboard-downloads-group-count {
background: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-rgb));
font-size: 12px;
font-weight: 700;
padding: 2px 10px;
border-radius: 12px;
border: 1px solid rgba(var(--accent-rgb), 0.3);
}
.dashboard-bubble-container {
display: flex;
flex-wrap: wrap;
gap: 24px;
justify-content: center;
align-items: center;
padding: 12px;
}
/* Dashboard Discover Bubble (150px circle, matching artist/search) */
.dashboard-discover-bubble {
position: relative;
width: 150px;
height: 150px;
border-radius: 50%;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border: 2px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
overflow: hidden;
}
.dashboard-discover-bubble:hover {
transform: translateY(-3px) scale(1.05);
border-color: rgba(var(--accent-rgb), 0.3);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.2),
0 0 15px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.dashboard-discover-bubble.completed {
border-color: rgba(var(--accent-rgb), 0.4);
}
.dashboard-discover-bubble.completed:hover {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.3),
0 0 15px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.dashboard-discover-bubble-image {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 50%;
}
.dashboard-discover-bubble-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.3) 0%,
rgba(0, 0, 0, 0.6) 100%);
border-radius: 50%;
}
.dashboard-discover-bubble-content {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 8px;
z-index: 1;
}
.dashboard-discover-bubble-name {
font-size: 12px;
font-weight: 700;
color: #ffffff;
text-align: center;
line-height: 1.2;
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}
.dashboard-discover-bubble-status {
font-size: 10px;
font-weight: 600;
color: rgba(var(--accent-rgb), 0.9);
margin-top: 4px;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}
.dashboard-discover-bubble.completed .dashboard-discover-bubble-status {
color: rgba(var(--accent-rgb), 1);
}
/* Header Styling */
.dashboard-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px;
margin: -28px -24px 20px -24px;
position: relative;
overflow: visible;
background: linear-gradient(180deg,
rgba(var(--accent-rgb), 0.10) 0%,
rgba(var(--accent-rgb), 0.04) 40%,
transparent 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
border-top-left-radius: 24px;
border-top-right-radius: 24px;
}
/* Ambient light sweep — clip-path keeps it inside the header without overflow:hidden */
.dashboard-header::before {
content: '';
position: absolute;
inset: 0;
pointer-events: none;
background-image: linear-gradient(90deg,
transparent 0%,
rgba(var(--accent-rgb), 0.04) 40%,
rgba(var(--accent-rgb), 0.08) 50%,
rgba(var(--accent-rgb), 0.04) 60%,
transparent 100%);
background-size: 60% 100%;
background-repeat: no-repeat;
animation: dashboard-header-sweep 12s ease-in-out infinite;
clip-path: inset(0 0 0 0 round 24px 24px 0 0);
}
@keyframes dashboard-header-sweep {
0%, 100% { background-position: -60% 0; opacity: 0; }
10% { opacity: 1; }
50% { background-position: 160% 0; opacity: 1; }
60% { opacity: 0; }
}
.dashboard-header::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg,
transparent 0%,
rgba(var(--accent-rgb), 0.2) 20%,
rgba(var(--accent-rgb), 0.35) 50%,
rgba(var(--accent-rgb), 0.2) 80%,
transparent 100%);
}
.header-text {
display: flex;
flex-direction: column;
gap: 5px;
}
/* Page header icon — shown beside all page titles */
.page-header-icon {
width: 176px;
height: 176px;
object-fit: contain;
flex-shrink: 0;
filter: drop-shadow(0 2px 8px rgba(var(--accent-rgb), 0.3));
transition: transform 0.3s ease, filter 0.3s ease;
}
.page-header-icon:hover {
transform: scale(1.08) rotate(-3deg);
filter: drop-shadow(0 4px 14px rgba(var(--accent-rgb), 0.5));
}
.header-title {
font-size: 30px;
font-weight: 700;
margin: 0 0 4px 0;
line-height: 1.2;
letter-spacing: -0.5px;
display: flex;
align-items: center;
gap: 14px;
}
.header-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
@keyframes page-title-shimmer {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
@media (max-width: 768px) {
.page-header-icon {
width: 100px;
height: 100px;
}
}
.header-subtitle {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
letter-spacing: 0.3px;
line-height: 1.5;
}
.header-spacer {
flex-grow: 1;
/* Pushes buttons to the right */
}
.header-actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
/* ── Worker Orbs ── */
.worker-orb-canvas {
transition: opacity 0.4s ease;
}
.worker-orb-hidden {
opacity: 0 !important;
pointer-events: none !important;
transition: opacity 0.25s ease;
}
.worker-orb-reveal {
opacity: 1 !important;
pointer-events: auto !important;
animation: workerOrbReveal 0.35s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
@keyframes workerOrbReveal {
0% { opacity: 0; transform: scale(0.3); }
100% { opacity: 1; transform: scale(1); }
}
.header-button {
height: 45px;
border: none;
border-radius: 22px;
color: #000000;
font-size: 14px;
font-weight: 600;
padding: 12px 24px;
cursor: pointer;
transition: all 0.2s ease;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
outline: none;
user-select: none;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
/* Enhanced glassmorphic effect */
backdrop-filter: blur(8px) saturate(1.2);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.header-button:hover {
transform: translateY(-1px);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.4),
0 4px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
/* ── Watchlist & Wishlist Hero Buttons ── */
.watchlist-button,
.wishlist-button {
position: relative;
display: inline-flex;
align-items: center;
gap: 9px;
padding: 12px 20px;
overflow: visible;
background: rgba(18, 18, 22, 0.85);
backdrop-filter: blur(16px) saturate(1.4);
color: #e0e0e0;
border: none;
border-radius: 22px;
z-index: 0;
}
/* Animated gradient border using border-image-like technique */
.watchlist-button::before,
.wishlist-button::before {
content: '';
position: absolute;
inset: 0;
border-radius: 22px;
padding: 1.5px;
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
mask-composite: exclude;
pointer-events: none;
z-index: 1;
}
.watchlist-button::before {
background: linear-gradient(
135deg,
#ff8f00, #ffc107, #ffd54f, #ffab00, #ffc107, #ff8f00
);
background-size: 300% 300%;
animation: heroBorderFlow 4s ease infinite;
}
.wishlist-button::before {
background: linear-gradient(
135deg,
rgb(var(--accent-rgb)),
rgb(var(--accent-light-rgb)),
rgb(var(--accent-neon-rgb)),
rgb(var(--accent-rgb)),
rgb(var(--accent-light-rgb)),
rgb(var(--accent-rgb))
);
background-size: 300% 300%;
animation: heroBorderFlow 4s ease infinite;
animation-delay: 2s;
}
@keyframes heroBorderFlow {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
/* Outer glow */
.watchlist-button {
box-shadow: 0 0 14px rgba(255, 193, 7, 0.12), 0 4px 16px rgba(0, 0, 0, 0.3);
}
.wishlist-button {
box-shadow: 0 0 14px rgba(var(--accent-rgb), 0.12), 0 4px 16px rgba(0, 0, 0, 0.3);
}
.watchlist-button:hover {
box-shadow: 0 0 24px rgba(255, 193, 7, 0.25), 0 4px 20px rgba(0, 0, 0, 0.4);
transform: translateY(-1px);
}
.wishlist-button:hover {
box-shadow: 0 0 24px rgba(var(--accent-rgb), 0.25), 0 4px 20px rgba(0, 0, 0, 0.4);
transform: translateY(-1px);
}
/* Icon */
.hero-btn-icon {
font-size: 16px;
line-height: 1;
}
/* Label */
.hero-btn-label {
font-weight: 700;
letter-spacing: 0.3px;
}
/* Watchlist text color tint */
.watchlist-button .hero-btn-label {
color: #ffd54f;
}
.wishlist-button .hero-btn-label {
color: rgb(var(--accent-light-rgb));
}
/* Count badge */
.hero-btn-badge {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 22px;
height: 22px;
padding: 0 6px;
border-radius: 11px;
font-size: 11px;
font-weight: 800;
line-height: 1;
transition: all 0.3s ease;
}
.watchlist-button .hero-btn-badge {
background: rgba(255, 193, 7, 0.15);
color: #ffc107;
border: 1px solid rgba(255, 193, 7, 0.3);
}
.wishlist-button .hero-btn-badge {
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-light-rgb));
border: 1px solid rgba(var(--accent-rgb), 0.3);
}
.hero-btn-badge.has-items {
animation: badgePulse 2s ease-in-out infinite;
}
.watchlist-button .hero-btn-badge.has-items {
background: rgba(255, 193, 7, 0.25);
border-color: rgba(255, 193, 7, 0.5);
}
.wishlist-button .hero-btn-badge.has-items {
background: rgba(var(--accent-rgb), 0.25);
border-color: rgba(var(--accent-rgb), 0.5);
}
@keyframes badgePulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.12); }
}
/* Shimmer sweep — clipped inside button */
.hero-btn-shimmer {
position: absolute;
inset: 0;
border-radius: 22px;
overflow: hidden;
pointer-events: none;
z-index: 1;
}
.hero-btn-shimmer::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
animation: shimmerSweep 5s ease-in-out infinite;
}
.watchlist-button .hero-btn-shimmer::after {
background: linear-gradient(
105deg,
transparent 30%,
rgba(255, 193, 7, 0.1) 50%,
transparent 70%
);
}
.wishlist-button .hero-btn-shimmer::after {
background: linear-gradient(
105deg,
transparent 30%,
rgba(var(--accent-rgb), 0.1) 50%,
transparent 70%
);
animation-delay: 2.5s;
}
@keyframes shimmerSweep {
0%, 100% { left: -100%; }
40%, 60% { left: 100%; }
}
/* ── Wishlist inactive state ── */
.wishlist-button.wishlist-inactive {
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
}
.wishlist-button.wishlist-inactive::before {
background: linear-gradient(135deg, #444, #555, #444);
background-size: 100% 100%;
animation: none;
}
.wishlist-button.wishlist-inactive .hero-btn-label {
color: #777;
}
.wishlist-button.wishlist-inactive .hero-btn-badge {
background: rgba(255, 255, 255, 0.06);
color: #666;
border-color: rgba(255, 255, 255, 0.1);
animation: none;
}
.wishlist-button.wishlist-inactive .hero-btn-shimmer {
display: none;
}
.wishlist-button.wishlist-inactive:hover {
box-shadow: 0 0 12px rgba(255, 255, 255, 0.08), 0 4px 20px rgba(0, 0, 0, 0.4);
}
/* Active wishlist just uses the normal accent styles above */
.wishlist-button.wishlist-active {
/* already styled by default .wishlist-button rules */
}
/* Service Status Grid */
.service-status-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 16px;
}
.service-card {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 20px 22px;
position: relative;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
inset 0 1px 0 rgba(255, 255, 255, 0.15);
display: flex;
flex-direction: column;
gap: 8px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
transform: translateZ(0);
}
/* Top accent line */
.service-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
transition: all 0.3s;
}
.service-card:hover {
transform: translateY(-2px);
border-color: rgba(var(--accent-rgb), 0.15);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 20px rgba(var(--accent-rgb), 0.06);
}
.service-card:hover::before {
left: 10%;
right: 10%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.5), transparent);
}
.service-card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.service-card-title {
font-size: 14px;
font-weight: 700;
color: rgba(255, 255, 255, 0.9);
}
.service-card-indicator {
font-size: 18px;
}
.service-card-indicator.connected {
color: rgb(var(--accent-rgb));
text-shadow: 0 0 8px rgba(var(--accent-rgb), 0.6), 0 0 16px rgba(var(--accent-rgb), 0.3);
animation: service-pulse-green 3s ease-in-out infinite;
}
.service-card-indicator.disconnected {
color: #ff4444;
text-shadow: 0 0 8px rgba(255, 68, 68, 0.5), 0 0 16px rgba(255, 68, 68, 0.2);
}
.service-card-indicator.fallback {
color: #f5a623;
text-shadow: 0 0 8px rgba(245, 166, 35, 0.4);
}
.service-card-status-text.fallback {
color: #f5a623;
}
.service-card:has(.service-card-indicator.fallback)::before {
background: linear-gradient(90deg, transparent, rgba(245, 166, 35, 0.4), transparent);
}
.service-card-indicator.rate-limited {
color: #facc15;
text-shadow: 0 0 8px rgba(250, 204, 21, 0.5);
}
.service-card-status-text.rate-limited {
color: rgba(250, 204, 21, 0.9);
}
@keyframes service-pulse-green {
0%, 100% { text-shadow: 0 0 8px rgba(var(--accent-rgb), 0.6), 0 0 16px rgba(var(--accent-rgb), 0.3); }
50% { text-shadow: 0 0 12px rgba(var(--accent-rgb), 0.8), 0 0 24px rgba(var(--accent-rgb), 0.5); }
}
/* Top accent line when connected */
.service-card:has(.service-card-indicator.connected)::before {
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.6), transparent);
left: 10%;
right: 10%;
}
/* Top accent line when disconnected */
.service-card:has(.service-card-indicator.disconnected)::before {
background: linear-gradient(90deg, transparent, rgba(255, 68, 68, 0.4), transparent);
}
.service-card-status-text {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
}
.service-card-response-time {
font-size: 11px;
color: rgba(255, 255, 255, 0.25);
font-variant-numeric: tabular-nums;
}
.service-card-footer {
margin-top: auto;
padding-top: 10px;
}
.service-card-button {
width: 100%;
padding: 9px 16px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
outline: none;
user-select: none;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
color: rgba(255, 255, 255, 0.7);
letter-spacing: 0.01em;
position: relative;
overflow: hidden;
}
.service-card-button::before {
content: '';
position: absolute;
inset: 0;
border-radius: 10px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.05) 100%);
opacity: 0;
transition: opacity 0.3s;
}
.service-card-button:hover::before {
opacity: 1;
}
.service-card-button:hover {
color: #fff;
border-color: rgba(var(--accent-rgb), 0.35);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.15);
}
/* Enrichment Services Section */
.enrichment-section {
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.enrichment-section-header {
display: flex;
align-items: center;
margin-bottom: 10px;
}
.enrichment-section-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.3);
}
.enrichment-status-grid {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.enrichment-chip {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px 8px 10px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.05);
cursor: default;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
text-decoration: none;
}
.enrichment-chip[onclick] {
cursor: pointer;
}
.enrichment-chip::before {
content: '';
position: absolute;
left: 0;
top: 15%;
bottom: 15%;
width: 3px;
border-radius: 0 3px 3px 0;
transition: all 0.25s ease;
}
.enrichment-chip[onclick]:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.1);
transform: translateY(-1px);
}
/* Status: Running */
.enrichment-chip.status-running::before {
background: #4CAF50;
box-shadow: 0 0 6px rgba(76, 175, 80, 0.3);
}
.enrichment-chip.status-running .enrichment-chip-dot {
background: #4CAF50;
box-shadow: 0 0 5px rgba(76, 175, 80, 0.4);
}
/* Status: Idle */
.enrichment-chip.status-idle::before {
background: #4CAF50;
opacity: 0.5;
}
.enrichment-chip.status-idle .enrichment-chip-dot {
background: #4CAF50;
opacity: 0.5;
}
/* Status: Paused */
.enrichment-chip.status-paused::before {
background: #FFB74D;
box-shadow: 0 0 6px rgba(255, 183, 77, 0.3);
}
.enrichment-chip.status-paused .enrichment-chip-dot {
background: #FFB74D;
box-shadow: 0 0 5px rgba(255, 183, 77, 0.3);
}
/* Status: Stopped */
.enrichment-chip.status-stopped::before {
background: #EF5350;
box-shadow: 0 0 6px rgba(239, 83, 80, 0.3);
}
.enrichment-chip.status-stopped .enrichment-chip-dot {
background: #EF5350;
box-shadow: 0 0 4px rgba(239, 83, 80, 0.3);
}
/* Status: Not Configured */
.enrichment-chip.status-not-configured {
opacity: 0.5;
border-style: dashed;
}
.enrichment-chip.status-not-configured::before {
background: rgba(255, 255, 255, 0.15);
}
.enrichment-chip.status-not-configured .enrichment-chip-dot {
background: rgba(255, 255, 255, 0.2);
}
.enrichment-chip.status-not-configured[onclick]:hover {
opacity: 0.8;
border-color: rgba(var(--accent-rgb), 0.3);
}
.enrichment-chip.status-not-configured[onclick]:hover::before {
background: rgba(var(--accent-rgb), 0.4);
}
.enrichment-chip-dot {
width: 7px;
height: 7px;
border-radius: 50%;
flex-shrink: 0;
transition: all 0.3s;
}
.enrichment-chip-name {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
white-space: nowrap;
}
.enrichment-chip-status {
font-size: 10px;
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
}
/* Static, readable status colors that work with any accent */
.enrichment-chip.status-running .enrichment-chip-status,
.enrichment-chip.status-idle .enrichment-chip-status {
color: rgba(76, 175, 80, 0.8); /* green — healthy */
}
.enrichment-chip.status-paused .enrichment-chip-status {
color: rgba(255, 183, 77, 0.8); /* amber — paused */
}
.enrichment-chip.status-stopped .enrichment-chip-status {
color: rgba(239, 83, 80, 0.8); /* red — stopped */
}
.enrichment-chip.status-not-configured .enrichment-chip-status {
color: rgba(255, 255, 255, 0.35); /* dim white — not set up */
}
.enrichment-chip-activity {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
white-space: nowrap;
font-variant-numeric: tabular-nums;
margin-left: auto;
padding-left: 8px;
}
/* Spotify budget bar — parent chip needs extra bottom padding */
.enrichment-chip:has(.enrichment-chip-budget) {
padding-bottom: 12px;
}
.enrichment-chip-budget {
position: absolute;
bottom: 3px;
left: 8px;
right: 8px;
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 3px;
overflow: hidden;
}
.enrichment-chip-budget-bar {
height: 100%;
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.7), var(--accent));
border-radius: 3px;
transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.enrichment-chip-budget-bar.high {
background: linear-gradient(90deg, rgba(245, 166, 35, 0.7), #f5a623);
}
.enrichment-chip-budget-bar.exhausted {
background: linear-gradient(90deg, rgba(255, 71, 87, 0.7), #ff4757);
}
/* ========================================= */
/* API Rate Monitor Gauges */
/* ========================================= */
.rate-monitor-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 12px;
padding: 8px 0;
}
.rate-gauge-card {
position: relative;
display: flex;
flex-direction: column;
padding: 14px 14px 10px;
border-radius: 14px;
background: rgba(18, 18, 22, 0.7);
border: 1px solid rgba(255, 255, 255, 0.05);
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(12px);
overflow: visible;
}
.rate-gauge-card:hover {
background: rgba(24, 24, 30, 0.85);
border-color: rgba(255, 255, 255, 0.1);
transform: translateY(-2px);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
}
.rate-gauge-card.active {
border-color: rgba(255, 255, 255, 0.07);
}
.rate-gauge-card.danger {
border-color: rgba(239, 68, 68, 0.3);
animation: gauge-danger-pulse 1.8s ease-in-out infinite;
}
@keyframes gauge-danger-pulse {
0%, 100% { box-shadow: 0 0 0 rgba(239, 68, 68, 0); }
50% { box-shadow: 0 0 20px rgba(239, 68, 68, 0.12); }
}
.rate-gauge-card.rate-limited {
border-color: rgba(239, 68, 68, 0.4);
animation: gauge-danger-pulse 1.8s ease-in-out infinite;
}
/* Card header — service name + status */
.gauge-card-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 4px;
}
.gauge-card-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.gauge-card-name {
flex: 1;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
letter-spacing: 0.3px;
}
.gauge-card-status {
font-size: 10px;
font-weight: 500;
padding: 2px 7px;
border-radius: 10px;
letter-spacing: 0.3px;
}
.gauge-card-status[data-status="running"] { background: rgba(34, 197, 94, 0.12); color: #4ade80; }
.gauge-card-status[data-status="idle"] { background: rgba(255, 255, 255, 0.06); color: rgba(255, 255, 255, 0.35); }
.gauge-card-status[data-status="paused"] { background: rgba(234, 179, 8, 0.12); color: #fbbf24; }
.gauge-card-status[data-status="stopped"] { background: rgba(255, 255, 255, 0.04); color: rgba(255, 255, 255, 0.2); }
.gauge-card-status[data-status="not_configured"] { background: rgba(255, 255, 255, 0.04); color: rgba(255, 255, 255, 0.2); }
/* Arc wrap */
.gauge-arc-wrap {
display: flex;
justify-content: center;
margin: -4px 0;
}
/* Stats row below gauge */
.gauge-card-stats {
display: flex;
justify-content: space-between;
padding: 0 4px;
margin-top: -2px;
}
.gauge-card-stat {
display: flex;
flex-direction: column;
align-items: center;
gap: 1px;
}
.gauge-card-stat-val {
font-size: 13px;
font-weight: 700;
color: rgba(255, 255, 255, 0.8);
}
.gauge-card-stat-label {
font-size: 8px;
color: rgba(255, 255, 255, 0.25);
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Spotify budget bar */
.gauge-budget-bar {
position: relative;
height: 4px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
margin: 6px 4px 2px;
overflow: hidden;
}
.gauge-budget-fill {
height: 100%;
border-radius: 2px;
background: linear-gradient(90deg, rgba(29, 185, 84, 0.7), #1DB954);
transition: width 0.8s ease;
}
.gauge-budget-bar.high .gauge-budget-fill { background: linear-gradient(90deg, rgba(245, 166, 35, 0.7), #f5a623); }
.gauge-budget-bar.exhausted .gauge-budget-fill { background: linear-gradient(90deg, rgba(239, 68, 68, 0.7), #ef4444); }
.gauge-budget-label {
position: absolute;
top: 6px;
left: 0;
width: 100%;
text-align: center;
font-size: 8px;
color: rgba(255, 255, 255, 0.2);
}
/* Rate limit badge */
.gauge-rl-badge {
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
padding: 4px 10px;
margin-top: 6px;
border-radius: 8px;
background: rgba(239, 68, 68, 0.1);
border: 1px solid rgba(239, 68, 68, 0.2);
font-size: 9px;
font-weight: 700;
color: #ef4444;
letter-spacing: 0.5px;
}
.gauge-rl-dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: #ef4444;
animation: gauge-rl-blink 1s ease-in-out infinite;
}
@keyframes gauge-rl-blink {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
.gauge-rl-time {
color: rgba(239, 68, 68, 0.5);
font-weight: 500;
}
/* SVG gauge */
.rate-gauge-svg {
width: 100%;
max-width: 160px;
height: auto;
overflow: visible;
}
.gauge-active-arc {
transition: d 0.6s cubic-bezier(0.4, 0, 0.2, 1), stroke 0.4s ease;
}
.gauge-dot {
transition: cx 0.6s cubic-bezier(0.4, 0, 0.2, 1), cy 0.6s cubic-bezier(0.4, 0, 0.2, 1), fill 0.4s ease;
}
.gauge-dot + circle {
transition: cx 0.6s cubic-bezier(0.4, 0, 0.2, 1), cy 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
.gauge-value {
font-family: -apple-system, 'SF Pro Display', 'Segoe UI', sans-serif;
font-size: 24px;
font-weight: 800;
fill: rgba(255, 255, 255, 0.95);
letter-spacing: -0.5px;
}
.gauge-unit {
font-family: -apple-system, sans-serif;
font-size: 9px;
fill: rgba(255, 255, 255, 0.2);
}
.gauge-label {
display: none; /* Label is now in the card header, not the SVG */
}
/* Rate Monitor Detail Modal */
.rate-modal {
background: #141418;
border-radius: 20px;
width: 740px;
max-width: 95vw;
max-height: 85vh;
display: flex;
flex-direction: column;
box-shadow: 0 32px 80px rgba(0, 0, 0, 0.7);
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.06);
}
.rate-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.rate-modal-header-info {
display: flex;
align-items: center;
gap: 12px;
}
.rate-modal-header-dot {
width: 10px;
height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.rate-modal-header h3 {
margin: 0;
font-size: 16px;
color: #fff;
font-weight: 600;
}
.rate-modal-header-sub {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
}
.rate-modal-body {
padding: 20px 24px;
overflow-y: auto;
}
.rate-modal-chart-wrap {
background: rgba(0, 0, 0, 0.3);
border-radius: 14px;
padding: 16px;
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.03);
}
.rate-modal-chart-wrap canvas {
width: 100%;
height: auto;
display: block;
}
.rate-modal-chart-legend {
display: flex;
flex-wrap: wrap;
gap: 10px 16px;
padding: 10px 4px 0;
min-height: 0;
}
.rate-chart-legend-item {
display: flex;
align-items: center;
gap: 5px;
font-size: 10px;
color: rgba(255, 255, 255, 0.45);
white-space: nowrap;
}
.rate-chart-legend-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.rate-modal-section-title {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.8px;
margin-bottom: 10px;
}
.rate-modal-endpoints {
display: flex;
flex-direction: column;
gap: 6px;
}
.rate-modal-ep {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 0;
}
.rate-modal-ep-name {
width: 140px;
flex-shrink: 0;
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.rate-modal-ep-bar {
flex: 1;
height: 8px;
background: rgba(255, 255, 255, 0.04);
border-radius: 4px;
overflow: hidden;
}
.rate-modal-ep-fill {
height: 100%;
border-radius: 4px;
transition: width 0.5s ease, background 0.3s ease;
box-shadow: 0 0 8px rgba(255, 255, 255, 0.05);
}
.rate-modal-ep-value {
width: 60px;
flex-shrink: 0;
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
text-align: right;
}
.rate-modal-ep-empty {
text-align: center;
padding: 16px;
color: rgba(255, 255, 255, 0.2);
font-size: 12px;
}
@media (max-width: 900px) {
.rate-monitor-grid {
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
}
@media (max-width: 600px) {
.rate-monitor-grid {
grid-template-columns: repeat(2, 1fr);
}
.gauge-card-stats { gap: 2px; }
.gauge-card-stat-val { font-size: 11px; }
}
/* System Stats Grid */
.stats-grid-dashboard {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
}
.stat-card-dashboard {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 20px;
position: relative;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
display: flex;
flex-direction: column;
gap: 4px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Top accent line */
.stat-card-dashboard::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.4), transparent);
border-radius: 2px;
transition: all 0.3s;
}
.stat-card-dashboard:hover {
transform: translateY(-2px);
border-color: rgba(var(--accent-rgb), 0.15);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 20px rgba(var(--accent-rgb), 0.06);
}
.stat-card-dashboard:hover::before {
left: 10%;
right: 10%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.7), transparent);
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.3);
}
.stat-card-title {
font-size: 10px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.stat-card-value {
font-size: 24px;
font-weight: 700;
color: rgba(255, 255, 255, 0.9);
}
.stat-card-subtitle {
font-size: 11px;
color: rgba(255, 255, 255, 0.25);
}
/* Tools & Operations Grid */
.tools-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
gap: 16px;
}
.tool-card {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 22px 24px;
position: relative;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
display: flex;
flex-direction: column;
gap: 14px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Top accent line */
.tool-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.4), transparent);
border-radius: 2px;
transition: all 0.3s;
}
.tool-card:hover {
transform: translateY(-2px);
border-color: rgba(var(--accent-rgb), 0.15);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 20px rgba(var(--accent-rgb), 0.06);
}
.tool-card:hover::before {
left: 10%;
right: 10%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.7), transparent);
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.3);
}
.tool-card-title {
font-size: 15px;
font-weight: 700;
color: rgba(255, 255, 255, 0.9);
letter-spacing: -0.01em;
}
.tool-card-info {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
line-height: 1.5;
min-height: 0;
}
.tool-card-controls {
display: flex;
gap: 8px;
align-items: center;
}
.tool-card-controls select {
flex-grow: 1;
padding: 9px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
color: rgba(255, 255, 255, 0.8);
font-size: 13px;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
outline: none;
transition: all 0.2s;
cursor: pointer;
}
.tool-card-controls select:hover {
border-color: rgba(255, 255, 255, 0.15);
background: rgba(255, 255, 255, 0.06);
}
.tool-card-controls select:focus {
border-color: rgba(var(--accent-rgb), 0.4);
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.1);
}
.tool-card-controls select option {
background: #1a1a1e;
color: #ffffff;
}
.tool-card-controls button {
padding: 10px 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.01em;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
outline: none;
user-select: none;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
color: rgba(255, 255, 255, 0.8);
min-width: 130px;
position: relative;
overflow: hidden;
backdrop-filter: blur(4px);
}
.tool-card-controls button::before {
content: '';
position: absolute;
inset: 0;
border-radius: 10px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.05) 100%);
opacity: 0;
transition: opacity 0.3s ease;
}
.tool-card-controls button:hover:not(:disabled)::before {
opacity: 1;
}
.tool-card-controls button:hover:not(:disabled) {
color: #ffffff;
border-color: rgba(var(--accent-rgb), 0.35);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.2), 0 0 0 1px rgba(var(--accent-rgb), 0.1);
}
.tool-card-controls button:active:not(:disabled) {
transform: translateY(0);
box-shadow: none;
}
.tool-card-controls button:disabled {
background: rgba(255, 255, 255, 0.03);
color: rgba(255, 255, 255, 0.15);
border-color: rgba(255, 255, 255, 0.04);
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* Media Scan Button Styling */
.media-scan-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.9) 0%, rgba(var(--accent-light-rgb), 0.9) 100%);
padding: 12px 22px;
font-size: 14px;
box-shadow: 0 2px 10px rgba(var(--accent-rgb), 0.2);
width: 100%;
border-radius: 10px;
}
.media-scan-btn:hover:not(:disabled) {
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3);
transform: translateY(-1px);
}
.media-scan-btn .scan-icon {
font-size: 18px;
animation: pulse 2s ease-in-out infinite;
}
.media-scan-btn:disabled .scan-icon {
animation: spin 1s linear infinite;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.1);
}
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.tool-card-progress-section {
padding-top: 12px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
display: flex;
flex-direction: column;
gap: 6px;
}
.progress-phase-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.45);
font-weight: 500;
}
.progress-details-label {
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
text-align: center;
font-variant-numeric: tabular-nums;
}
.progress-bar-container {
height: 4px;
background: rgba(255, 255, 255, 0.04);
border: none;
border-radius: 2px;
overflow: hidden;
}
.progress-bar-fill {
height: 100%;
background: rgb(var(--accent-rgb));
border-radius: 4px;
width: 0%;
transition: width 0.3s ease;
}
/* Backup Manager List */
.backup-list-container {
max-height: 200px;
overflow-y: auto;
border-top: 1px solid rgba(255, 255, 255, 0.08);
margin-top: 10px;
padding-top: 8px;
display: flex;
flex-direction: column;
gap: 6px;
}
.backup-list-container:empty {
display: none;
}
.backup-list-item {
display: flex;
align-items: center;
justify-content: space-between;
background: rgba(0, 0, 0, 0.25);
border-radius: 8px;
padding: 8px 10px;
transition: background 0.2s ease;
}
.backup-list-item:hover {
background: rgba(255, 255, 255, 0.06);
}
.backup-list-info {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.backup-list-date {
font-size: 12px;
color: #e0e0e0;
white-space: nowrap;
}
.backup-list-size {
font-size: 11px;
color: #888;
}
.backup-list-version {
font-size: 10px;
color: var(--accent-primary, #1db954);
background: rgba(29, 185, 84, 0.12);
padding: 1px 6px;
border-radius: 4px;
font-weight: 600;
}
.backup-list-actions {
display: flex;
gap: 4px;
flex-shrink: 0;
}
.backup-list-actions button {
background: rgba(255, 255, 255, 0.08);
border: none;
border-radius: 6px;
color: #b3b3b3;
font-size: 11px;
padding: 4px 8px;
cursor: pointer;
transition: all 0.2s ease;
}
.backup-list-actions .backup-dl-btn:hover {
background: rgba(var(--accent-rgb), 0.25);
color: rgb(var(--accent-rgb));
}
.backup-list-actions .backup-restore-btn:hover {
background: rgba(255, 183, 77, 0.25);
color: #ffb74d;
}
.backup-list-actions .backup-delete-btn:hover {
background: rgba(244, 67, 54, 0.25);
color: #f44336;
}
.backup-list-container::-webkit-scrollbar {
width: 4px;
}
.backup-list-container::-webkit-scrollbar-track {
background: transparent;
}
.backup-list-container::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.15);
border-radius: 2px;
}
/* Activity Feed */
.activity-feed-container {
/* Premium glassmorphic foundation */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
backdrop-filter: blur(12px) saturate(1.1);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
padding: 8px;
position: relative;
overflow: hidden;
/* Neumorphic depth shadows */
box-shadow:
0 18px 40px rgba(0, 0, 0, 0.6),
0 0 0 1px rgba(var(--accent-rgb), 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.06),
inset 0 -1px 0 rgba(0, 0, 0, 0.1);
max-height: 350px;
overflow-y: auto;
}
.activity-item {
display: flex;
align-items: center;
gap: 15px;
padding: 10px 15px 10px 12px;
border-left: 3px solid rgba(var(--accent-rgb), 0.2);
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
border-radius: 10px;
transition: all 0.2s ease;
animation: activitySlideIn 0.3s ease-out;
}
.activity-item:hover {
background: rgba(var(--accent-rgb), 0.04);
border-bottom-color: transparent;
border-left-color: rgba(var(--accent-rgb), 0.5);
}
.activity-item:last-child {
border-bottom: none;
}
.activity-icon {
font-size: 16px;
width: 34px;
height: 34px;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.15) 0%,
rgba(var(--accent-rgb), 0.06) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.2);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
box-shadow:
0 2px 6px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
flex-shrink: 0;
}
.activity-text-content {
flex-grow: 1;
}
.activity-title {
font-size: 12px;
font-weight: 500;
color: #ffffff;
}
.activity-subtitle {
font-size: 11px;
color: #b3b3b3;
}
.activity-time {
font-size: 11px;
color: #b3b3b3;
white-space: nowrap;
}
/* Responsive Design Enhancements */
@media (max-width: 1200px) {
.tools-grid {
grid-template-columns: 1fr;
}
.service-status-grid {
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
}
.stats-grid-dashboard {
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
}
}
@media (max-width: 768px) {
.dashboard-header {
flex-direction: column;
align-items: flex-start;
gap: 15px;
}
.header-actions {
width: 100%;
justify-content: flex-start;
}
.header-button {
flex: 1;
min-width: 100%;
}
.service-status-grid,
.stats-grid-dashboard {
grid-template-columns: 1fr;
gap: 15px;
}
.enrichment-status-grid {
gap: 6px;
}
.enrichment-chip {
padding: 6px 10px 6px 8px;
gap: 6px;
}
.enrichment-chip-name {
font-size: 11px;
}
.enrichment-chip-status {
font-size: 9px;
}
.tool-card-controls {
flex-direction: column;
align-items: stretch;
}
.tool-card-controls button {
width: 100%;
min-width: auto;
}
}
/* Custom Scrollbar for Activity Feed */
.activity-feed-container::-webkit-scrollbar {
width: 8px;
}
.activity-feed-container::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.activity-feed-container::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.3);
border-radius: 4px;
}
.activity-feed-container::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.5);
}
/* Activity item entrance animation */
@keyframes activitySlideIn {
from {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* ── Section Title Row (header + button) ─────────────────────────── */
.section-title-row {
display: flex;
align-items: center;
justify-content: space-between;
}
.section-title-row .section-title {
margin-bottom: 0;
padding-bottom: 0;
}
.section-title-row .section-title::after {
display: none;
}
.library-history-btn {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.45);
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px;
padding: 4px 10px;
cursor: pointer;
transition: all 0.2s ease;
}
.library-history-btn:hover {
color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.3);
}
/* ── Library History Modal ───────────────────────────────────────── */
#library-history-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
animation: fadeIn 0.2s ease;
}
#library-history-overlay.hidden {
display: none !important;
}
.library-history-modal {
width: 700px;
max-width: 95vw;
max-height: 80vh;
background: linear-gradient(135deg, rgba(26, 26, 26, 0.98) 0%, rgba(16, 16, 16, 0.99) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
}
.library-history-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.library-history-modal-header h3 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
}
.library-history-modal-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.5);
font-size: 22px;
cursor: pointer;
padding: 0 4px;
line-height: 1;
transition: color 0.2s ease;
}
.library-history-modal-close:hover {
color: #fff;
}
.library-history-tabs {
display: flex;
gap: 4px;
padding: 12px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.library-history-tab {
font-size: 13px;
font-weight: 500;
color: rgba(255, 255, 255, 0.45);
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
padding: 7px 16px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 8px;
}
.library-history-tab:hover {
color: rgba(255, 255, 255, 0.7);
background: rgba(255, 255, 255, 0.08);
}
.library-history-tab.active {
color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.12);
border-color: rgba(var(--accent-rgb), 0.3);
}
.library-history-tab-count {
font-size: 11px;
font-weight: 600;
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.4);
padding: 1px 7px;
border-radius: 10px;
min-width: 20px;
text-align: center;
}
.library-history-tab.active .library-history-tab-count {
background: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-rgb));
}
.library-history-list {
flex: 1;
overflow-y: auto;
padding: 8px 16px;
min-height: 200px;
}
.library-history-list::-webkit-scrollbar {
width: 6px;
}
.library-history-list::-webkit-scrollbar-track {
background: transparent;
}
.library-history-list::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.25);
border-radius: 3px;
}
.library-history-entry {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border-left: 3px solid rgba(var(--accent-rgb), 0.15);
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
border-radius: 8px;
transition: all 0.15s ease;
}
.library-history-entry:hover {
background: rgba(var(--accent-rgb), 0.04);
border-left-color: rgba(var(--accent-rgb), 0.5);
}
.library-history-thumb {
width: 40px;
height: 40px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.05);
}
.library-history-thumb-placeholder {
width: 40px;
height: 40px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.05);
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
flex-shrink: 0;
}
.library-history-entry-text {
flex: 1;
min-width: 0;
}
.library-history-entry-title {
font-size: 13px;
font-weight: 500;
color: rgba(255, 255, 255, 0.9);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.library-history-entry-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 2px;
}
.library-history-badge {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 3px 8px;
border-radius: 4px;
white-space: nowrap;
flex-shrink: 0;
}
.library-history-badge.download {
color: rgba(100, 200, 130, 0.9);
background: rgba(100, 200, 130, 0.1);
border: 1px solid rgba(100, 200, 130, 0.2);
}
.library-history-badge.import {
color: rgba(120, 160, 230, 0.9);
background: rgba(120, 160, 230, 0.1);
border: 1px solid rgba(120, 160, 230, 0.2);
}
.library-history-entry-time {
font-size: 11px;
color: rgba(255, 255, 255, 0.25);
white-space: nowrap;
flex-shrink: 0;
}
.library-history-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 48px 24px;
color: rgba(255, 255, 255, 0.3);
font-size: 14px;
}
.library-history-loading {
display: flex;
align-items: center;
justify-content: center;
padding: 48px 24px;
color: rgba(255, 255, 255, 0.3);
font-size: 14px;
}
.library-history-pagination {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 12px 24px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.library-history-pagination:empty {
display: none;
}
.library-history-page-btn {
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.5);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px;
padding: 5px 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.library-history-page-btn:hover:not(:disabled) {
color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.3);
}
.library-history-page-btn:disabled {
opacity: 0.3;
cursor: default;
}
.library-history-page-info {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
padding: 0 8px;
}
/* ── Sync History Modal ─────────────────────────────────── */
.sync-history-modal {
width: 750px;
max-width: 95vw;
max-height: 80vh;
background: linear-gradient(135deg, rgba(26, 26, 26, 0.98) 0%, rgba(16, 16, 16, 0.99) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
}
.sync-history-modal-header {
display: flex; align-items: center; justify-content: space-between;
padding: 18px 24px; border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.sync-history-modal-header h3 { margin: 0; font-size: 18px; font-weight: 600; color: rgba(255, 255, 255, 0.9); }
.sync-history-modal-close {
background: none; border: none; color: rgba(255, 255, 255, 0.5);
font-size: 22px; cursor: pointer; padding: 0 4px; line-height: 1; transition: color 0.2s ease;
}
.sync-history-modal-close:hover { color: #fff; }
.sync-history-tabs {
display: flex; gap: 4px; padding: 12px 24px; border-bottom: 1px solid rgba(255, 255, 255, 0.06); flex-wrap: wrap;
}
.sync-history-tab {
font-size: 12px; font-weight: 500; color: rgba(255, 255, 255, 0.45);
background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px; padding: 6px 12px; cursor: pointer; transition: all 0.2s ease;
display: flex; align-items: center; gap: 6px;
}
.sync-history-tab:hover { color: rgba(255, 255, 255, 0.7); background: rgba(255, 255, 255, 0.08); }
.sync-history-tab.active { color: rgb(var(--accent-rgb)); background: rgba(var(--accent-rgb), 0.12); border-color: rgba(var(--accent-rgb), 0.3); }
.sync-history-tab-count {
font-size: 10px; font-weight: 600; background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.4); padding: 1px 6px; border-radius: 10px; min-width: 18px; text-align: center;
}
.sync-history-tab.active .sync-history-tab-count { background: rgba(var(--accent-rgb), 0.2); color: rgb(var(--accent-rgb)); }
.sync-history-list { flex: 1; overflow-y: auto; padding: 8px 16px; min-height: 200px; }
.sync-history-list::-webkit-scrollbar { width: 6px; }
.sync-history-list::-webkit-scrollbar-track { background: transparent; }
.sync-history-list::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb), 0.25); border-radius: 3px; }
.sync-history-entry {
display: flex; align-items: center; gap: 12px; padding: 10px 12px;
border-left: 3px solid rgba(var(--accent-rgb), 0.15);
border-bottom: 1px solid rgba(255, 255, 255, 0.03); border-radius: 8px;
transition: background 0.15s ease; cursor: default;
}
.sync-history-entry:hover { background: rgba(255, 255, 255, 0.03); }
.sync-history-thumb {
width: 44px; height: 44px; border-radius: 6px; object-fit: cover; flex-shrink: 0;
background: rgba(255, 255, 255, 0.05);
}
.sync-history-thumb-placeholder {
width: 44px; height: 44px; border-radius: 6px; flex-shrink: 0;
background: rgba(255, 255, 255, 0.05); display: flex; align-items: center;
justify-content: center; font-size: 20px;
}
.sync-history-entry-text { flex: 1; min-width: 0; }
.sync-history-entry-title {
font-size: 13px; font-weight: 500; color: rgba(255, 255, 255, 0.85);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sync-history-entry-meta {
font-size: 11px; color: rgba(255, 255, 255, 0.35); margin-top: 2px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sync-history-stats {
display: flex; gap: 6px; align-items: center; flex-shrink: 0;
}
.sync-history-stat {
font-size: 10px; font-weight: 600; padding: 2px 7px; border-radius: 6px;
}
.sync-history-stat.found { background: rgba(76, 175, 80, 0.15); color: #4caf50; }
.sync-history-stat.downloaded { background: rgba(var(--accent-rgb), 0.15); color: rgb(var(--accent-rgb)); }
.sync-history-stat.failed { background: rgba(244, 67, 54, 0.15); color: #f44336; }
.sync-history-stat.pending { background: rgba(255, 193, 7, 0.15); color: #ffc107; }
.sync-history-source-badge {
font-size: 10px; font-weight: 600; padding: 2px 8px; border-radius: 6px;
text-transform: uppercase; letter-spacing: 0.5px; flex-shrink: 0;
}
.sync-history-source-badge.spotify { background: rgba(30, 215, 96, 0.15); color: #1ed760; }
.sync-history-source-badge.beatport { background: rgba(148, 210, 42, 0.15); color: #94d22a; }
.sync-history-source-badge.youtube { background: rgba(255, 0, 0, 0.15); color: #ff4444; }
.sync-history-source-badge.tidal { background: rgba(0, 255, 255, 0.15); color: #00cccc; }
.sync-history-source-badge.deezer { background: rgba(160, 54, 204, 0.15); color: #cd5cf0; }
.sync-history-source-badge.wishlist { background: rgba(255, 193, 7, 0.15); color: #ffc107; }
.sync-history-source-badge.library { background: rgba(158, 158, 158, 0.15); color: #9e9e9e; }
.sync-history-source-badge.discover { background: rgba(255, 152, 0, 0.15); color: #ff9800; }
.sync-history-source-badge.mirrored { background: rgba(100, 181, 246, 0.15); color: #64b5f6; }
.sync-history-source-badge.spotify_public { background: rgba(30, 215, 96, 0.1); color: #1ed760; }
.sync-history-source-badge.listenbrainz { background: rgba(255, 107, 53, 0.15); color: #ff6b35; }
.sync-history-entry-time {
font-size: 11px; color: rgba(255, 255, 255, 0.25); flex-shrink: 0; text-align: right; min-width: 50px;
}
.sync-history-resync-btn {
font-size: 11px; font-weight: 600; color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.1); border: 1px solid rgba(var(--accent-rgb), 0.25);
border-radius: 6px; padding: 4px 10px; cursor: pointer; transition: all 0.2s ease;
flex-shrink: 0; white-space: nowrap;
}
.sync-history-resync-btn:hover {
background: rgba(var(--accent-rgb), 0.2); border-color: rgba(var(--accent-rgb), 0.5);
}
.sync-history-delete-btn {
font-size: 14px; line-height: 1; color: rgba(255, 255, 255, 0.2);
background: none; border: none; cursor: pointer; padding: 2px 4px;
border-radius: 4px; transition: all 0.15s ease; flex-shrink: 0;
}
.sync-history-delete-btn:hover { color: #f44336; background: rgba(244, 67, 54, 0.1); }
.sync-history-resync-btn:disabled {
opacity: 0.4; cursor: not-allowed; pointer-events: none;
}
/* Expandable sync progress within history entry */
.sync-history-entry-wrapper { border-radius: 8px; overflow: hidden; }
.sync-history-entry-wrapper.syncing {
border: 1px solid rgba(var(--accent-rgb), 0.2);
background: rgba(var(--accent-rgb), 0.03);
}
.sync-history-live-progress {
padding: 10px 14px; background: rgba(0, 0, 0, 0.15);
border-top: 1px solid rgba(255, 255, 255, 0.05);
animation: syncHistoryFadeIn 0.2s ease;
}
@keyframes syncHistoryFadeIn { from { opacity: 0; max-height: 0; } to { opacity: 1; max-height: 120px; } }
.sync-history-progress-bar-container {
height: 4px; background: rgba(255, 255, 255, 0.08); border-radius: 4px;
overflow: hidden; margin-bottom: 8px;
}
.sync-history-progress-bar-fill {
height: 100%; background: rgb(var(--accent-rgb)); border-radius: 4px;
transition: width 0.3s ease; width: 0%;
}
.sync-history-progress-text {
display: flex; align-items: center; justify-content: space-between;
font-size: 11px; color: rgba(255, 255, 255, 0.5);
}
.sync-history-progress-step {
flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sync-history-progress-stats {
display: flex; gap: 8px; flex-shrink: 0; font-size: 11px;
}
.sync-history-progress-stats span { color: rgba(255, 255, 255, 0.4); }
.sync-history-progress-stats .matched { color: #4caf50; }
.sync-history-progress-stats .failed { color: #f44336; }
.sync-history-cancel-btn {
font-size: 10px; font-weight: 600; color: #f44336;
background: rgba(244, 67, 54, 0.1); border: 1px solid rgba(244, 67, 54, 0.25);
border-radius: 4px; padding: 3px 8px; cursor: pointer; margin-left: 8px;
transition: all 0.2s ease;
}
.sync-history-cancel-btn:hover {
background: rgba(244, 67, 54, 0.2); border-color: rgba(244, 67, 54, 0.5);
}
/* Sync to Server button in download modal */
.sync-to-server-btn {
background: rgba(30, 136, 229, 0.15) !important; color: #42a5f5 !important;
border: 1px solid rgba(30, 136, 229, 0.3) !important;
}
.sync-to-server-btn:hover {
background: rgba(30, 136, 229, 0.25) !important; border-color: rgba(30, 136, 229, 0.5) !important;
}
.sync-to-server-btn:disabled { opacity: 0.4; cursor: not-allowed; }
/* Sync progress area at bottom of download modal */
.modal-sync-progress-area {
padding: 10px 16px; background: rgba(30, 136, 229, 0.05);
border-top: 1px solid rgba(30, 136, 229, 0.15); border-radius: 0 0 12px 12px;
}
.modal-sync-progress-bar-bg {
height: 4px; background: rgba(255, 255, 255, 0.08); border-radius: 4px;
overflow: hidden; margin-bottom: 8px;
}
.modal-sync-progress-bar-fill {
height: 100%; background: #42a5f5; border-radius: 4px;
transition: width 0.3s ease; width: 0%;
}
.modal-sync-progress-info {
display: flex; align-items: center; gap: 10px; font-size: 11px;
}
.modal-sync-step {
flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
white-space: nowrap; color: rgba(255, 255, 255, 0.5);
}
.modal-sync-stats { display: flex; gap: 8px; flex-shrink: 0; }
.modal-sync-stats .matched { color: #4caf50; font-size: 11px; }
.modal-sync-stats .failed { color: #f44336; font-size: 11px; }
.modal-sync-cancel-btn {
font-size: 10px; font-weight: 600; color: #f44336;
background: rgba(244, 67, 54, 0.1); border: 1px solid rgba(244, 67, 54, 0.25);
border-radius: 4px; padding: 3px 8px; cursor: pointer; flex-shrink: 0;
}
.modal-sync-cancel-btn:hover {
background: rgba(244, 67, 54, 0.2); border-color: rgba(244, 67, 54, 0.5);
}
.sync-history-empty {
text-align: center; padding: 48px 24px; color: rgba(255, 255, 255, 0.3); font-size: 14px;
}
.sync-history-loading { text-align: center; padding: 48px; color: rgba(255, 255, 255, 0.3); }
.sync-history-pagination {
display: flex; align-items: center; justify-content: center; gap: 8px;
padding: 12px 24px; border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.sync-history-page-btn {
font-size: 12px; font-weight: 500; color: rgba(255, 255, 255, 0.5);
background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px; padding: 5px 12px; cursor: pointer; transition: all 0.2s ease;
}
.sync-history-page-btn:hover:not(:disabled) { color: rgb(var(--accent-rgb)); background: rgba(var(--accent-rgb), 0.1); }
.sync-history-page-btn:disabled { opacity: 0.3; cursor: default; }
.sync-history-page-info { font-size: 12px; color: rgba(255, 255, 255, 0.35); }
.sync-history-btn {
font-size: 12px; font-weight: 500; color: rgba(255, 255, 255, 0.5);
background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px; padding: 5px 12px; cursor: pointer; transition: all 0.2s ease;
}
.sync-history-btn:hover { color: rgb(var(--accent-rgb)); background: rgba(var(--accent-rgb), 0.1); border-color: rgba(var(--accent-rgb), 0.3); }
/* Enhanced Progress Bar Animation */
.progress-bar-fill {
height: 100%;
background: linear-gradient(90deg,
rgb(var(--accent-rgb)) 0%,
rgb(var(--accent-light-rgb)) 50%,
rgb(var(--accent-neon-rgb)) 100%);
border-radius: 4px;
width: 0%;
transition: width 0.3s ease;
position: relative;
}
/* Progress bar shimmer effect when active */
.progress-bar-fill:not([style*="width: 0%"])::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
transparent 0%,
rgba(255, 255, 255, 0.2) 50%,
transparent 100%);
animation: shimmer 2s infinite;
}
@keyframes shimmer {
0% {
left: -100%;
}
100% {
left: 100%;
}
}
/* Styles for Stats inside the DB Updater Tool Card */
.tool-card-stats {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 6px;
padding: 10px 12px;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.04);
border-radius: 10px;
}
.stat-item {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 12px;
padding: 2px 0;
}
.stat-item-label {
color: rgba(255, 255, 255, 0.35);
}
.stat-item-value {
color: #ffffff;
font-weight: 600;
background-color: rgba(var(--accent-rgb), 0.1);
border-radius: 4px;
padding: 2px 6px;
}
/* ======================================================= */
/* == STYLES FOR SYNC PAGE (REDESIGNED) == */
/* ======================================================= */
/* Main Sync Page Layout */
.sync-header {
margin-bottom: 25px;
}
.sync-header-row {
display: flex;
align-items: center;
justify-content: space-between;
}
.sync-title {
font-size: 28px;
font-weight: 700;
letter-spacing: -0.3px;
display: flex;
align-items: center;
gap: 14px;
}
.sync-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
.sync-subtitle {
font-size: 14px;
color: #b3b3b3;
margin-top: 5px;
}
.sync-content-area {
display: grid;
grid-template-columns: 1fr;
/* Sidebar hidden by default, shown when sync starts */
gap: 25px;
/* min-height: calc(90vh - 200px); Minimum height, but allow expansion */
height: 95%;
}
/* Hide sidebar on laptop and smaller screens */
@media (max-width: 1300px) {
.sync-content-area {
grid-template-columns: 1fr;
/* Single column - main panel takes full width */
gap: 0;
}
.sync-sidebar {
display: none !important;
/* Hide sidebar completely - use !important to override other rules */
}
}
.sync-main-panel,
.sync-sidebar {
background: linear-gradient(135deg, rgba(26, 26, 26, 0.65), rgba(18, 18, 18, 0.72));
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
padding: 20px;
display: flex;
flex-direction: column;
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.5);
}
.sync-main-panel {
overflow-y: auto;
overflow-x: hidden;
}
.sync-sidebar {
overflow: hidden;
display: none;
}
/* Tab System */
.sync-tabs {
display: flex;
gap: 2px;
margin-bottom: 15px;
background: rgba(0, 0, 0, 0.2);
border-radius: 12px;
padding: 4px;
}
.sync-tab-button {
flex: 1;
padding: 12px;
background: transparent;
color: #b3b3b3;
border: none;
border-radius: 10px;
font-size: 13px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.sync-tab-button.active {
background: rgb(var(--accent-rgb));
color: #000000;
box-shadow: 0 4px 15px rgba(var(--accent-rgb), 0.3);
}
.sync-tab-button[data-tab="tidal"].active {
background: #ff6600;
color: #fff;
box-shadow: 0 4px 15px rgba(255, 102, 0, 0.3);
}
.sync-tab-button[data-tab="deezer"].active {
background: #a238ff;
color: #fff;
box-shadow: 0 0 12px rgba(162, 56, 255, 0.4);
}
.sync-tab-button[data-tab="youtube"].active {
background: #ff0000;
color: #fff;
box-shadow: 0 4px 15px rgba(255, 0, 0, 0.3);
}
.sync-tab-button[data-tab="spotify-public"].active {
background: #1DB954;
color: #fff;
box-shadow: 0 4px 15px rgba(29, 185, 84, 0.3);
}
/* Server tab — prominent first tab */
.sync-tab-server {
flex: 1.4 !important;
font-size: 12px;
letter-spacing: 0.02em;
position: relative;
}
.sync-tab-server.active {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.9), rgba(var(--accent-rgb), 0.7)) !important;
color: #000 !important;
box-shadow: 0 4px 18px rgba(var(--accent-rgb), 0.35), 0 0 0 1px rgba(var(--accent-rgb), 0.2) !important;
}
.sync-tab-divider {
width: 1px;
height: 20px;
background: rgba(255, 255, 255, 0.08);
flex-shrink: 0;
margin: 0 2px;
align-self: center;
}
.sync-tab-button:hover:not(.active) {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
}
.tab-icon {
width: 16px;
height: 16px;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.spotify-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.tidal-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.deezer-icon {
display: inline-block;
width: 16px;
height: 16px;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Crect x='0' y='18' width='4' height='4' rx='0.5'/%3E%3Crect x='6' y='14' width='4' height='8' rx='0.5'/%3E%3Crect x='12' y='10' width='4' height='12' rx='0.5'/%3E%3Crect x='18' y='6' width='4' height='16' rx='0.5'/%3E%3C/svg%3E");
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.youtube-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
/* Active tab icons - make them white for better contrast */
.sync-tab-button.active .spotify-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.sync-tab-button.active .youtube-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.sync-tab-button.active .beatport-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.import-file-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.sync-tab-button[data-tab="import-file"].active {
background: #60a5fa;
color: #fff;
box-shadow: 0 4px 15px rgba(96, 165, 250, 0.3);
}
.sync-tab-button.active .import-file-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
/* Import File Tab Styles */
.import-file-zone {
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
gap: 20px;
}
.import-file-zone-inner {
position: relative;
border: 2px dashed rgba(96, 165, 250, 0.2);
border-radius: 20px;
padding: 48px 40px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
background: linear-gradient(135deg, rgba(96, 165, 250, 0.04) 0%, rgba(59, 130, 246, 0.02) 100%);
width: 100%;
max-width: 520px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.05);
}
.import-file-zone-inner::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background:
radial-gradient(circle at 30% 20%, rgba(96, 165, 250, 0.06) 0%, transparent 50%),
radial-gradient(circle at 70% 80%, rgba(59, 130, 246, 0.04) 0%, transparent 50%);
pointer-events: none;
opacity: 0;
transition: opacity 0.3s ease;
}
.import-file-zone-inner:hover {
border-color: rgba(96, 165, 250, 0.35);
background: linear-gradient(135deg, rgba(96, 165, 250, 0.06) 0%, rgba(59, 130, 246, 0.04) 100%);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3),
0 4px 16px rgba(96, 165, 250, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
}
.import-file-zone-inner:hover::before {
opacity: 1;
}
.import-file-zone-inner.drag-over {
border-color: rgba(96, 165, 250, 0.6);
border-style: solid;
background: linear-gradient(135deg, rgba(96, 165, 250, 0.1) 0%, rgba(59, 130, 246, 0.06) 100%);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3),
0 4px 24px rgba(96, 165, 250, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
transform: translateY(-2px) scale(1.01);
}
.import-file-zone-inner.drag-over::before {
opacity: 1;
}
.import-file-format-hints {
display: flex;
gap: 12px;
width: 100%;
max-width: 520px;
}
.import-file-hint {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
padding: 14px 16px;
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
border: 1px solid rgba(255, 255, 255, 0.06);
border-top: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.import-file-hint-label {
font-size: 11px;
font-weight: 700;
color: #60a5fa;
text-transform: uppercase;
letter-spacing: 0.8px;
}
.import-file-hint-text {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
line-height: 1.5;
}
.import-file-zone-icon {
font-size: 44px;
margin-bottom: 14px;
filter: drop-shadow(0 4px 8px rgba(96, 165, 250, 0.2));
}
.import-file-zone-title {
font-size: 18px;
font-weight: 700;
color: #fff;
margin-bottom: 6px;
letter-spacing: -0.2px;
}
.import-file-zone-subtitle {
font-size: 13px;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 16px;
}
.import-file-zone-formats {
font-size: 11px;
color: rgba(255, 255, 255, 0.25);
letter-spacing: 0.5px;
text-transform: uppercase;
font-weight: 600;
}
.import-file-info-bar {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 20px;
background: linear-gradient(135deg, rgba(96, 165, 250, 0.08) 0%, rgba(59, 130, 246, 0.04) 100%);
border: 1px solid rgba(96, 165, 250, 0.15);
border-top: 1px solid rgba(96, 165, 250, 0.2);
border-radius: 14px;
margin: 0 12px 14px 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
.import-file-info-filename {
font-weight: 700;
color: #60a5fa;
font-size: 14px;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.import-file-info-count {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
white-space: nowrap;
background: rgba(96, 165, 250, 0.1);
padding: 4px 10px;
border-radius: 8px;
font-weight: 600;
}
.import-file-clear-btn {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.5);
width: 30px;
height: 30px;
border-radius: 50%;
cursor: pointer;
font-size: 12px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
}
.import-file-clear-btn:hover {
background: rgba(239, 68, 68, 0.15);
border-color: rgba(239, 68, 68, 0.3);
color: #ef4444;
transform: scale(1.1);
}
.import-file-format-bar,
.import-file-mapping-bar {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 18px;
margin: 0 12px 14px 12px;
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
border: 1px solid rgba(255, 255, 255, 0.06);
border-top: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
flex-wrap: wrap;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.import-file-format-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
white-space: nowrap;
font-weight: 600;
}
.import-file-select {
background: #1a1a1a;
border: 1px solid rgba(255, 255, 255, 0.12);
color: #fff;
padding: 6px 10px;
border-radius: 8px;
font-size: 12px;
cursor: pointer;
transition: border-color 0.2s;
}
.import-file-select option {
background: #1a1a1a;
color: #fff;
}
.import-file-select:hover {
border-color: rgba(96, 165, 250, 0.3);
}
.import-file-mapping-selects {
display: flex;
gap: 8px;
flex-wrap: wrap;
align-items: center;
}
.import-file-mapping-selects .import-file-col-map {
display: flex;
align-items: center;
gap: 6px;
background: rgba(255, 255, 255, 0.03);
padding: 6px 10px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.08);
transition: border-color 0.2s;
}
.import-file-mapping-selects .import-file-col-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
max-width: 90px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 600;
}
.import-file-mapping-selects .import-file-col-map.mapped-track {
border-color: rgba(96, 165, 250, 0.25);
background: rgba(96, 165, 250, 0.04);
}
.import-file-mapping-selects .import-file-col-map.mapped-artist {
border-color: rgba(34, 197, 94, 0.25);
background: rgba(34, 197, 94, 0.04);
}
.import-file-mapping-selects .import-file-col-map.mapped-album {
border-color: rgba(251, 191, 36, 0.25);
background: rgba(251, 191, 36, 0.04);
}
.import-file-mapping-selects .import-file-col-map.mapped-track select {
border-color: rgba(96, 165, 250, 0.3);
}
.import-file-mapping-selects .import-file-col-map.mapped-artist select {
border-color: rgba(34, 197, 94, 0.3);
}
.import-file-mapping-selects .import-file-col-map.mapped-album select {
border-color: rgba(251, 191, 36, 0.3);
}
.import-file-preview-table-wrap {
margin: 0 12px;
max-height: 360px;
overflow-y: auto;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.06);
border-top: 1px solid rgba(255, 255, 255, 0.1);
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
}
.import-file-preview-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.import-file-preview-table thead th {
position: sticky;
top: 0;
background: rgba(18, 18, 18, 0.98);
padding: 10px 14px;
text-align: left;
font-weight: 700;
color: rgba(255, 255, 255, 0.5);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
z-index: 1;
}
.import-file-preview-table tbody tr {
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
transition: background 0.15s;
}
.import-file-preview-table tbody tr:hover {
background: rgba(96, 165, 250, 0.04);
}
.import-file-preview-table tbody tr.invalid-row {
opacity: 0.35;
}
.import-file-preview-table td {
padding: 9px 14px;
color: rgba(255, 255, 255, 0.8);
}
.import-file-preview-table td:first-child {
color: rgba(255, 255, 255, 0.25);
width: 44px;
font-weight: 600;
}
.import-file-action-bar {
display: flex;
align-items: center;
gap: 14px;
padding: 16px 12px 10px 12px;
margin: 0 12px;
}
.import-file-name-input {
flex: 1;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-top: 1px solid rgba(255, 255, 255, 0.15);
color: #fff;
padding: 12px 16px;
border-radius: 12px;
font-size: 14px;
font-weight: 500;
outline: none;
transition: all 0.2s;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
}
.import-file-name-input:focus {
border-color: rgba(96, 165, 250, 0.4);
background: rgba(96, 165, 250, 0.04);
box-shadow: 0 2px 12px rgba(96, 165, 250, 0.1);
}
.import-file-name-input::placeholder {
color: rgba(255, 255, 255, 0.25);
font-weight: 400;
}
.import-file-import-btn {
background: linear-gradient(135deg, #60a5fa, #3b82f6);
color: #fff;
border: none;
padding: 12px 24px;
border-radius: 12px;
font-size: 13px;
font-weight: 700;
cursor: pointer;
white-space: nowrap;
transition: all 0.25s;
letter-spacing: 0.2px;
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);
}
.import-file-import-btn:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(96, 165, 250, 0.35);
}
.import-file-import-btn:disabled {
opacity: 0.35;
cursor: not-allowed;
box-shadow: none;
}
.mirrored-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.sync-tab-button[data-tab="mirrored"].active {
background: #a78bfa;
color: #fff;
box-shadow: 0 4px 15px rgba(167, 139, 250, 0.3);
}
.sync-tab-button.active .mirrored-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
/* Mirrored playlist cards */
.mirrored-playlist-card {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
margin: 10px 6px;
padding: 18px 22px;
cursor: pointer;
display: flex;
align-items: center;
gap: 14px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
}
.mirrored-playlist-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.3), transparent);
transition: all 0.3s;
}
.mirrored-playlist-card:hover {
transform: translateY(-2px);
border-color: rgba(var(--accent-rgb), 0.15);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 20px rgba(var(--accent-rgb), 0.06);
}
.mirrored-playlist-card:hover::before {
left: 10%;
right: 10%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.6), transparent);
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.3);
}
.mirrored-playlist-card .source-icon {
width: 40px;
height: 40px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
flex-shrink: 0;
transition: all 0.25s;
}
.mirrored-playlist-card .source-icon.spotify {
background: rgba(29, 185, 84, 0.12);
border: 1px solid rgba(29, 185, 84, 0.2);
color: #1db954;
}
.mirrored-playlist-card .source-icon.tidal {
background: rgba(255, 102, 0, 0.12);
border: 1px solid rgba(255, 102, 0, 0.2);
color: #ff6600;
}
.mirrored-playlist-card .source-icon.youtube {
background: rgba(255, 0, 0, 0.12);
border: 1px solid rgba(255, 0, 0, 0.2);
color: #ff4444;
}
.mirrored-playlist-card .source-icon.deezer {
background: rgba(162, 56, 255, 0.12);
border: 1px solid rgba(162, 56, 255, 0.2);
color: #a238ff;
}
.mirrored-playlist-card .source-icon.beatport {
background: rgba(1, 255, 149, 0.12);
border: 1px solid rgba(1, 255, 149, 0.2);
color: #01ff95;
}
.mirrored-playlist-card .source-icon.file {
background: rgba(96, 165, 250, 0.12);
border: 1px solid rgba(96, 165, 250, 0.2);
color: #60a5fa;
}
.mirrored-playlist-card .source-badge {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 3px 8px;
border-radius: 6px;
color: #fff;
display: inline-block;
}
.mirrored-playlist-card .source-badge.spotify { background: #1db954; }
.mirrored-playlist-card .source-badge.tidal { background: #ff6600; }
.mirrored-playlist-card .source-badge.youtube { background: #ff0000; }
.mirrored-playlist-card .source-badge.deezer { background: #a238ff; }
.mirrored-playlist-card .source-badge.beatport { background: #01ff95; color: #000; }
.mirrored-playlist-card .source-badge.file { background: #60a5fa; }
.mirrored-card-info {
flex: 1;
min-width: 0;
}
.mirrored-card-info .card-name {
font-size: 15px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
letter-spacing: -0.01em;
line-height: 1.3;
}
.mirrored-card-info .card-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
margin-top: 5px;
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.mirrored-card-info .card-meta span {
display: inline-flex;
align-items: center;
}
.mirrored-card-info .card-meta span + span::before {
content: '\00b7';
margin-right: 8px;
color: #555;
}
.mirrored-card-info .card-meta span[style]::before {
content: none;
margin-right: 0;
}
.mirrored-card-info .card-meta span[style] {
padding: 2px 8px;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.3px;
}
.mirrored-card-delete {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
color: #555;
cursor: pointer;
font-size: 14px;
padding: 0;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.2s ease;
flex-shrink: 0;
opacity: 0;
}
.mirrored-playlist-card:hover .mirrored-card-delete {
opacity: 1;
}
.mirrored-card-delete:hover {
color: #ff4444;
background: rgba(255, 68, 68, 0.15);
border-color: rgba(255, 68, 68, 0.3);
transform: scale(1.1);
}
.mirrored-card-clear {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
color: #555;
cursor: pointer;
font-size: 14px;
padding: 0;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.2s ease;
flex-shrink: 0;
opacity: 0;
}
.mirrored-playlist-card:hover .mirrored-card-clear {
opacity: 1;
}
.mirrored-card-clear:hover {
color: #a78bfa;
background: rgba(167, 139, 250, 0.15);
border-color: rgba(167, 139, 250, 0.3);
transform: scale(1.1);
}
.discovery-ratio {
font-size: 0.8em;
color: rgba(255, 255, 255, 0.4);
}
.discovery-ratio.complete {
color: #22c55e;
}
/* Discovery Pool trigger button (secondary - dashboard card is primary entry) */
.pool-trigger-btn {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.5);
padding: 4px 10px;
border-radius: 6px;
font-size: 11px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.pool-trigger-btn:hover {
background: rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.2);
color: rgba(255, 255, 255, 0.8);
}
/* ===== Discovery Pool — Premium Modal ===== */
/* Playlist filter in header */
.pool-playlist-filter {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
padding: 5px 10px;
border-radius: 8px;
font-size: 12px;
cursor: pointer;
outline: none;
}
.pool-playlist-filter:focus {
border-color: rgba(var(--accent-rgb), 0.4);
}
.pool-playlist-filter option {
background: #1a1a1a;
color: #fff;
}
/* Header failed highlight */
.pool-header-failed-highlight {
color: #ef4444 !important;
background: rgba(239, 68, 68, 0.12) !important;
border-radius: 12px;
padding: 4px 10px !important;
}
/* ===== Category Grid ===== */
.pool-category-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
padding: 28px;
}
.pool-category-card {
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
padding: 32px 24px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
min-height: 250px;
display: flex;
align-items: center;
justify-content: center;
}
.pool-category-card .pool-category-top-bar {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
opacity: 0;
transition: opacity 0.3s ease;
}
.pool-category-card .pool-category-top-bar.failed {
background: linear-gradient(90deg, #ef4444, #f97316);
}
.pool-category-card .pool-category-top-bar.matched {
background: linear-gradient(90deg, #22c55e, rgb(var(--accent-light-rgb)));
}
.pool-category-card:hover .pool-category-top-bar {
opacity: 1;
}
/* Failed card accent */
.pool-category-card.failed {
border-color: rgba(239, 68, 68, 0.12);
}
.pool-category-card.failed:hover {
border-color: rgba(239, 68, 68, 0.35);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(239, 68, 68, 0.2);
}
/* Matched card accent */
.pool-category-card.matched {
border-color: rgba(34, 197, 94, 0.12);
}
.pool-category-card.matched:hover {
border-color: rgba(34, 197, 94, 0.35);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(34, 197, 94, 0.2);
}
/* Fallback gradient backgrounds */
.pool-category-fallback {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
opacity: 0;
animation: fadeInRow 1s ease-out forwards, gradientShift 8s ease infinite;
}
.pool-category-fallback.failed {
background: linear-gradient(135deg,
rgba(239, 68, 68, 0.25) 0%,
rgba(249, 115, 22, 0.2) 50%,
rgba(239, 68, 68, 0.15) 100%);
background-size: 200% 200%;
}
.pool-category-fallback.matched {
background: linear-gradient(135deg,
rgba(34, 197, 94, 0.25) 0%,
rgba(var(--accent-rgb), 0.2) 50%,
rgba(34, 197, 94, 0.15) 100%);
background-size: 200% 200%;
}
/* Content overlay for text readability */
.pool-category-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.82) 0%,
rgba(0, 0, 0, 0.72) 100%);
z-index: 1;
pointer-events: none;
}
.pool-category-content {
position: relative;
z-index: 2;
width: 100%;
}
.pool-category-icon {
font-size: 48px;
margin-bottom: 16px;
}
.pool-category-card.failed .pool-category-icon {
filter: drop-shadow(0 4px 12px rgba(239, 68, 68, 0.4));
color: #ef4444;
}
.pool-category-card.matched .pool-category-icon {
filter: drop-shadow(0 4px 12px rgba(34, 197, 94, 0.4));
color: #22c55e;
}
.pool-category-count {
font-size: 36px;
font-weight: 700;
margin: 8px 0;
}
.pool-category-count.failed {
color: #ef4444;
}
.pool-category-count.matched {
color: #22c55e;
}
.pool-category-label {
font-size: 14px;
color: rgba(255, 255, 255, 0.55);
font-weight: 500;
}
/* Matched card mosaic hover */
.pool-category-card.matched:hover .wishlist-mosaic-image {
transform: scale(1.1);
}
.pool-category-card.matched:hover .pool-category-overlay {
background: linear-gradient(135deg,
rgba(34, 197, 94, 0.12) 0%,
rgba(0, 0, 0, 0.78) 100%);
}
.pool-category-card.failed:hover .pool-category-overlay {
background: linear-gradient(135deg,
rgba(239, 68, 68, 0.12) 0%,
rgba(0, 0, 0, 0.78) 100%);
}
/* ===== List View ===== */
.pool-list-view {
display: flex;
flex-direction: column;
height: 100%;
padding: 0 28px;
}
.pool-list-header {
display: flex;
align-items: center;
gap: 12px;
padding: 16px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
margin-bottom: 8px;
position: sticky;
top: 0;
z-index: 3;
}
.pool-list-search {
margin-left: auto;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 7px 12px;
color: #fff;
font-size: 13px;
font-family: inherit;
width: 200px;
transition: border-color 0.15s ease, width 0.2s ease;
}
.pool-list-search:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.4);
width: 260px;
}
.pool-list-search::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.pool-rematch-btn {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
padding: 5px 10px;
color: rgba(255, 255, 255, 0.6);
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
white-space: nowrap;
flex-shrink: 0;
}
.pool-rematch-btn:hover {
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.3);
color: rgba(255, 255, 255, 0.9);
}
.pool-back-btn {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
color: #e0e0e0;
padding: 8px 16px;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.pool-back-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
transform: translateX(-2px);
}
.pool-list-title {
font-size: 18px;
font-weight: 600;
color: #ffffff;
flex: 1;
}
.pool-list-content {
flex: 1;
overflow-y: auto;
padding-right: 8px;
max-height: 55vh;
}
.pool-list-content::-webkit-scrollbar {
width: 8px;
}
.pool-list-content::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.pool-list-content::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.4);
border-radius: 4px;
}
/* ===== Track Rows (Premium) ===== */
.pool-empty {
text-align: center;
color: rgba(255, 255, 255, 0.3);
padding: 40px 20px;
font-size: 14px;
}
.pool-track-row {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
border-radius: 8px;
transition: background 0.15s ease;
}
.pool-track-row:hover {
background: rgba(255, 255, 255, 0.03);
}
.pool-track-row:last-child {
border-bottom: none;
}
.pool-track-info {
flex: 1;
min-width: 0;
overflow: hidden;
}
.pool-track-name {
font-size: 14px;
font-weight: 500;
color: rgba(255, 255, 255, 0.9);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.pool-track-meta {
display: flex;
align-items: center;
gap: 8px;
margin-top: 4px;
flex-wrap: wrap;
}
.pool-track-artist {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
}
.pool-track-playlist-badge {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(var(--accent-rgb), 0.8);
background: rgba(var(--accent-rgb), 0.1);
border: 1px solid rgba(var(--accent-rgb), 0.2);
padding: 2px 8px;
border-radius: 10px;
}
.pool-track-arrow {
color: rgba(var(--accent-rgb), 0.5);
font-size: 12px;
}
.pool-match-name {
font-size: 12px;
color: rgb(var(--accent-light-rgb));
font-weight: 500;
}
.pool-match-provider {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.35);
background: rgba(255, 255, 255, 0.06);
padding: 2px 6px;
border-radius: 4px;
}
/* Album art thumbnail */
.pool-match-image {
width: 40px;
height: 40px;
border-radius: 6px;
flex-shrink: 0;
object-fit: cover;
}
.pool-match-image-placeholder {
width: 40px;
height: 40px;
border-radius: 6px;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
}
/* Confidence badge */
.pool-confidence-badge {
font-size: 12px;
font-weight: 600;
padding: 3px 10px;
border-radius: 8px;
flex-shrink: 0;
}
.pool-confidence-badge.high {
color: #22c55e;
background: rgba(34, 197, 94, 0.12);
}
.pool-confidence-badge.mid {
color: #eab308;
background: rgba(234, 179, 8, 0.12);
}
.pool-confidence-badge.low {
color: #ef4444;
background: rgba(239, 68, 68, 0.12);
}
/* Use count */
.pool-use-count {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
flex-shrink: 0;
min-width: 30px;
text-align: right;
}
/* Fix button in list */
.pool-fix-btn {
flex-shrink: 0;
font-size: 12px !important;
padding: 6px 14px !important;
}
/* Remove button */
.pool-remove-btn {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.3);
width: 28px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.pool-remove-btn:hover {
color: #ef4444;
background: rgba(239, 68, 68, 0.15);
border-color: rgba(239, 68, 68, 0.3);
}
/* ===== Pool Fix Match Modal ===== */
.pool-fix-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(8px);
z-index: 10001;
display: flex;
align-items: center;
justify-content: center;
animation: fadeIn 0.2s ease;
}
.pool-fix-modal {
background: rgba(18, 18, 18, 0.98);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14px;
width: 560px;
max-width: 92vw;
/* FIXED HEIGHT — prevents layout shift when results load */
height: 600px;
max-height: 85vh;
display: flex;
flex-direction: column;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);
animation: slideUp 0.2s ease;
overflow: hidden;
}
.pool-fix-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 18px 22px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
}
.pool-fix-header h2 {
font-size: 17px;
font-weight: 700;
color: #fff;
margin: 0;
letter-spacing: -0.2px;
}
.pool-fix-close {
width: 32px;
height: 32px;
border-radius: 8px;
border: none;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.5);
font-size: 14px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s ease;
}
.pool-fix-close:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.pool-fix-body {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
padding: 18px 22px 0;
overflow: hidden;
}
/* Source track display — compact */
.pool-fix-source {
padding: 12px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
margin-bottom: 16px;
flex-shrink: 0;
}
.pool-fix-source-label {
font-size: 10px;
font-weight: 700;
color: rgba(255, 255, 255, 0.35);
text-transform: uppercase;
letter-spacing: 0.06em;
margin-bottom: 6px;
}
.pool-fix-source-row {
display: flex;
align-items: baseline;
gap: 8px;
flex-wrap: wrap;
}
.pool-fix-source-title {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
}
.pool-fix-source-sep {
color: rgba(255, 255, 255, 0.2);
font-size: 13px;
}
.pool-fix-source-artist {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
}
/* Search inputs */
.pool-fix-search {
margin-bottom: 14px;
flex-shrink: 0;
}
.pool-fix-input-row {
display: flex;
gap: 10px;
align-items: flex-end;
}
.pool-fix-input-wrap {
flex: 1;
display: flex;
flex-direction: column;
gap: 4px;
}
.pool-fix-input-wrap label {
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.pool-fix-input-wrap input {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 9px 12px;
color: #fff;
font-size: 14px;
font-family: inherit;
transition: border-color 0.15s ease, box-shadow 0.15s ease;
box-sizing: border-box;
}
.pool-fix-input-wrap input:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.1);
}
.pool-fix-input-wrap input::placeholder {
color: rgba(255, 255, 255, 0.25);
}
.pool-fix-search-btn {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 9px 18px;
color: rgba(255, 255, 255, 0.8);
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
white-space: nowrap;
flex-shrink: 0;
height: 38px;
}
.pool-fix-search-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
/* Results area — FIXED, scrolls internally, no layout shift */
.pool-fix-results-area {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.pool-fix-results-list {
flex: 1;
min-height: 0;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 4px;
padding-bottom: 8px;
}
.pool-fix-results-list::-webkit-scrollbar {
width: 5px;
}
.pool-fix-results-list::-webkit-scrollbar-track {
background: transparent;
}
.pool-fix-results-list::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
}
.pool-fix-results-list::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.2);
}
/* Result rows */
.pool-fix-result {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border-radius: 8px;
cursor: pointer;
transition: background 0.12s ease;
flex-shrink: 0;
}
.pool-fix-result:hover {
background: rgba(255, 255, 255, 0.06);
}
.pool-fix-result-main {
flex: 1;
min-width: 0;
}
.pool-fix-result-title {
font-size: 14px;
font-weight: 500;
color: rgba(255, 255, 255, 0.9);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pool-fix-result-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-top: 2px;
}
.pool-fix-result-dur {
font-size: 12px;
color: rgba(255, 255, 255, 0.3);
flex-shrink: 0;
font-variant-numeric: tabular-nums;
}
/* Empty / loading states */
.pool-fix-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 10px;
padding: 40px 20px;
color: rgba(255, 255, 255, 0.3);
font-size: 13px;
flex: 1;
}
.pool-fix-spinner {
width: 24px;
height: 24px;
border: 2px solid rgba(255, 255, 255, 0.08);
border-top-color: rgba(255, 255, 255, 0.4);
border-radius: 50%;
animation: spin 0.7s linear infinite;
}
/* Footer */
.pool-fix-footer {
padding: 14px 22px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
display: flex;
justify-content: flex-end;
flex-shrink: 0;
}
.pool-fix-cancel {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 8px 18px;
color: rgba(255, 255, 255, 0.6);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
}
.pool-fix-cancel:hover {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.85);
}
/* Mobile */
@media (max-width: 600px) {
.pool-fix-modal {
width: 100%;
max-width: 100%;
height: 100vh;
max-height: 100vh;
border-radius: 0;
}
.pool-fix-input-row {
flex-direction: column;
gap: 8px;
}
.pool-fix-search-btn {
width: 100%;
height: 44px;
}
}
/* Mirrored playlist track modal */
.mirrored-modal-overlay {
position: fixed;
inset: 0;
background: rgba(18, 18, 18, 0.85);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(12px);
animation: mirroredOverlayFadeIn 0.3s ease forwards;
}
@keyframes mirroredOverlayFadeIn {
from { opacity: 0; backdrop-filter: blur(0px); }
to { opacity: 1; backdrop-filter: blur(12px); }
}
@keyframes mirroredModalSlideIn {
from { opacity: 0; transform: scale(0.92) translateY(20px); }
to { opacity: 1; transform: scale(1) translateY(0); }
}
.mirrored-modal {
background: linear-gradient(135deg, rgba(20, 20, 20, 0.95) 0%, rgba(12, 12, 12, 0.98) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
width: 90%;
max-width: 950px;
max-height: 85vh;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow:
0 25px 80px rgba(0, 0, 0, 0.7),
0 8px 32px rgba(0, 0, 0, 0.4),
0 0 40px rgba(var(--accent-rgb), 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
animation: mirroredModalSlideIn 0.35s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
.mirrored-modal-header {
background: linear-gradient(135deg, rgba(45, 45, 45, 0.8) 0%, rgba(26, 26, 26, 0.9) 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
padding: 0;
position: relative;
overflow: hidden;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
}
.mirrored-modal-hero {
display: flex;
align-items: center;
padding: 28px 32px;
padding-right: 60px;
gap: 20px;
position: relative;
z-index: 2;
min-height: 110px;
}
.mirrored-modal-hero-icon {
width: 72px;
height: 72px;
display: flex;
align-items: center;
justify-content: center;
font-size: 32px;
border-radius: 14px;
background: linear-gradient(135deg, rgba(167, 139, 250, 0.2) 0%, rgba(167, 139, 250, 0.08) 100%);
border: 1px solid rgba(167, 139, 250, 0.3);
box-shadow: 0 8px 24px rgba(167, 139, 250, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1);
flex-shrink: 0;
color: #a78bfa;
}
.mirrored-modal-hero-icon.spotify { background: linear-gradient(135deg, rgba(29, 185, 84, 0.2) 0%, rgba(29, 185, 84, 0.08) 100%); border-color: rgba(29, 185, 84, 0.3); box-shadow: 0 8px 24px rgba(29, 185, 84, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1); color: #1db954; }
.mirrored-modal-hero-icon.tidal { background: linear-gradient(135deg, rgba(255, 102, 0, 0.2) 0%, rgba(255, 102, 0, 0.08) 100%); border-color: rgba(255, 102, 0, 0.3); box-shadow: 0 8px 24px rgba(255, 102, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1); color: #ff6600; }
.mirrored-modal-hero-icon.youtube { background: linear-gradient(135deg, rgba(255, 0, 0, 0.2) 0%, rgba(255, 0, 0, 0.08) 100%); border-color: rgba(255, 0, 0, 0.3); box-shadow: 0 8px 24px rgba(255, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1); color: #ff4444; }
.mirrored-modal-hero-icon.beatport { background: linear-gradient(135deg, rgba(1, 255, 149, 0.2) 0%, rgba(1, 255, 149, 0.08) 100%); border-color: rgba(1, 255, 149, 0.3); box-shadow: 0 8px 24px rgba(1, 255, 149, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1); color: #01ff95; }
.mirrored-modal-hero-info {
flex: 1;
min-width: 0;
}
.mirrored-modal-hero-title {
color: #ffffff;
font-size: 22px;
font-weight: 700;
margin: 0;
line-height: 1.3;
letter-spacing: -0.5px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.mirrored-modal-hero-subtitle {
color: #b3b3b3;
font-size: 14px;
margin-top: 6px;
display: flex;
align-items: center;
gap: 10px;
}
.mirrored-modal-hero-badge {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 3px 10px;
border-radius: 6px;
color: rgb(var(--accent-light-rgb));
background: rgba(var(--accent-rgb), 0.1);
border: 1px solid rgba(var(--accent-rgb), 0.2);
}
.mirrored-modal-close {
position: absolute;
top: 24px;
right: 24px;
z-index: 3;
color: #b3b3b3;
font-size: 18px;
font-weight: 300;
cursor: pointer;
transition: all 0.2s ease;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
}
.mirrored-modal-close:hover {
color: #ffffff;
background: rgba(255, 255, 255, 0.15);
transform: scale(1.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.mirrored-modal-tracks {
flex: 1;
overflow-y: auto;
padding: 0;
background: #121212;
}
.mirrored-modal-tracks::-webkit-scrollbar { width: 8px; }
.mirrored-modal-tracks::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.05); }
.mirrored-modal-tracks::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb), 0.3); border-radius: 4px; }
.mirrored-modal-tracks::-webkit-scrollbar-thumb:hover { background: rgba(var(--accent-rgb), 0.5); }
.mirrored-track-header {
display: grid;
grid-template-columns: 40px 1.6fr 1.4fr 1fr 56px;
align-items: center;
padding: 10px 28px;
font-size: 11px;
font-weight: 600;
color: #666;
text-transform: uppercase;
letter-spacing: 0.8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
position: sticky;
top: 0;
background: #121212;
z-index: 1;
}
.mirrored-track-row {
display: grid;
grid-template-columns: 40px 1.6fr 1.4fr 1fr 56px;
align-items: center;
padding: 11px 28px;
font-size: 13px;
color: #b3b3b3;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
}
.mirrored-track-row:hover {
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.06) 0%, rgba(var(--accent-rgb), 0.02) 100%);
transform: translateX(2px);
}
.mirrored-track-row .track-pos {
color: #555;
text-align: center;
font-size: 12px;
font-weight: 500;
}
.mirrored-track-row:hover .track-pos {
color: rgb(var(--accent-light-rgb));
}
.mirrored-track-row .track-title {
color: #fff;
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-right: 12px;
}
.mirrored-track-row .track-artist {
width: auto;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-right: 12px;
}
.mirrored-track-row .track-album {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-right: 12px;
color: #777;
}
.mirrored-track-row .track-duration {
text-align: right;
color: #666;
font-size: 12px;
font-variant-numeric: tabular-nums;
}
.mirrored-modal-footer {
background: linear-gradient(135deg, rgba(42, 42, 42, 0.9) 0%, rgba(30, 30, 30, 0.95) 100%);
border-top: 1px solid rgba(255, 255, 255, 0.08);
padding: 18px 32px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05);
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
}
.mirrored-modal-footer button {
padding: 10px 20px;
border-radius: 10px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
border: none;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
min-width: 100px;
}
.mirrored-btn-close {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(255, 255, 255, 0.15) !important;
}
.mirrored-btn-close:hover {
background: rgba(255, 255, 255, 0.18);
color: #ffffff;
border-color: rgba(255, 255, 255, 0.25) !important;
transform: translateY(-1px);
}
.mirrored-btn-discover {
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
color: #000;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3);
border: 1px solid rgba(var(--accent-rgb), 0.3) !important;
}
.mirrored-btn-discover:hover {
transform: translateY(-1px);
box-shadow: 0 8px 24px rgba(var(--accent-rgb), 0.4);
}
.mirrored-btn-delete {
background: rgba(244, 67, 54, 0.12);
color: #ef5350;
border: 1px solid rgba(244, 67, 54, 0.2) !important;
}
.mirrored-btn-delete:hover {
background: rgba(244, 67, 54, 0.2);
color: #ff6659;
border-color: rgba(244, 67, 54, 0.35) !important;
transform: translateY(-1px);
}
.sync-tab-content {
display: none;
flex-direction: column;
gap: 15px;
flex-grow: 1;
overflow: hidden;
}
.sync-tab-content.active {
display: flex;
}
/* Playlist Section Styling */
.playlist-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
}
.playlist-header h3 {
font-size: 16px;
font-weight: bold;
color: #ffffff;
}
.refresh-button {
background: rgb(var(--accent-rgb));
border: none;
border-radius: 17px;
color: #000000;
font-size: 11px;
font-weight: bold;
padding: 8px 16px;
cursor: pointer;
transition: all 0.2s ease;
}
.refresh-button:hover {
transform: scale(1.05);
}
.refresh-button.tidal {
background: #ff6600;
color: #fff;
}
.refresh-button.tidal:hover {
background: #ff7700;
}
.refresh-button.beatport {
background: #01FF95;
color: #000;
}
.refresh-button.beatport:hover {
background: #00E085;
}
/* ================================= */
/* BEATPORT NESTED TABS SYSTEM */
/* ================================= */
.beatport-tabs {
display: flex;
gap: 5px;
margin-bottom: 20px;
padding: 5px;
background: rgba(20, 20, 20, 0.6);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.beatport-tab-button {
flex: 1;
background: transparent;
border: none;
padding: 12px 20px;
border-radius: 8px;
color: #888;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.beatport-tab-button:hover {
background: rgba(1, 255, 149, 0.1);
color: #01FF95;
}
.beatport-tab-button.active {
background: linear-gradient(135deg, #01FF95 0%, #00E085 100%);
color: #000;
font-weight: 600;
}
.beatport-tab-button .tab-icon {
width: 14px;
height: 14px;
}
.browse-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-tab-button.active .browse-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.playlist-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-tab-button.active .playlist-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.rebuild-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-tab-button.active .rebuild-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-tab-content {
display: none;
overflow-y: auto;
overflow-x: hidden;
flex: 1;
}
.beatport-tab-content.active {
display: flex;
flex-direction: column;
}
/* Hide Browse Charts tab */
.beatport-tab-button[data-beatport-tab="browse"] {
display: none;
}
/* ================================= */
/* BEATPORT REBUILD TAB STYLES */
/* ================================= */
/* Beatport Rebuild Slider Container */
.beatport-rebuild-slider-container {
flex: 1;
padding: 30px;
}
/* Loading State */
.beatport-rebuild-loading {
width: 100%;
height: 400px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
border-radius: 20px;
text-align: center;
}
.beatport-rebuild-loading-content h2 {
color: #01FF95;
font-size: 24px;
margin-bottom: 10px;
animation: pulse 2s ease-in-out infinite;
}
.beatport-rebuild-loading-content p {
color: rgba(255, 255, 255, 0.7);
font-size: 16px;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.beatport-rebuild-slider {
position: relative;
width: 100%;
height: 500px;
border-radius: 20px;
overflow: hidden;
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.4),
0 8px 32px rgba(0, 0, 0, 0.3),
0 0 40px rgba(1, 255, 149, 0.1);
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
}
.beatport-rebuild-slider-track {
position: relative;
width: 100%;
height: 100%;
transition: transform 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
/* Individual Slides */
.beatport-rebuild-slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transform: translateX(100px);
transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
display: flex;
align-items: center;
justify-content: center;
}
.beatport-rebuild-slide.active {
opacity: 1;
z-index: 10;
transform: translateX(0);
}
.beatport-rebuild-slide.prev {
transform: translateX(-100px);
}
.beatport-rebuild-slide.next {
transform: translateX(100px);
}
/* Slide Background */
.beatport-rebuild-slide-background {
opacity: .6;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(45deg,
rgba(1, 255, 149, 0.1) 0%,
rgba(0, 224, 133, 0.08) 25%,
rgba(var(--accent-rgb), 0.06) 50%,
rgba(0, 185, 112, 0.04) 75%,
rgba(1, 255, 149, 0.02) 100%);
z-index: 1;
}
/* Dynamic background images from Beatport */
.beatport-rebuild-slide[data-image]::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: var(--slide-bg-image);
background-size: cover;
background-position: center;
background-repeat: no-repeat;
opacity: 0.3;
z-index: 0;
}
.beatport-rebuild-slide-gradient {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
radial-gradient(circle at 30% 40%, rgba(1, 255, 149, 0.15) 0%, transparent 50%),
radial-gradient(circle at 70% 60%, rgba(0, 224, 133, 0.1) 0%, transparent 50%),
linear-gradient(135deg,
rgba(20, 20, 20, 0.8) 0%,
rgba(12, 12, 12, 0.9) 100%);
}
/* Slide Content */
.beatport-rebuild-slide-content {
position: relative;
z-index: 2;
text-align: center;
padding: 40px;
max-width: 1000px;
}
.beatport-rebuild-track-info {
margin-bottom: 25px;
}
.beatport-rebuild-track-title {
font-size: 36px;
font-weight: 800;
color: #01FF95;
margin: 0 0 12px 0;
letter-spacing: -1px;
text-shadow: 0 2px 20px rgba(1, 255, 149, 0.3);
line-height: 1.2;
}
.beatport-rebuild-artist-name {
font-size: 24px;
font-weight: 600;
color: #ffffff;
margin: 0 0 8px 0;
letter-spacing: -0.5px;
}
.beatport-rebuild-album-name {
font-size: 18px;
font-weight: 400;
color: rgba(255, 255, 255, 0.8);
margin: 0;
font-style: italic;
}
.beatport-rebuild-track-meta {
display: flex;
gap: 20px;
justify-content: center;
align-items: center;
}
.beatport-rebuild-genre,
.beatport-rebuild-year {
padding: 8px 16px;
background: rgba(1, 255, 149, 0.15);
border: 1px solid rgba(1, 255, 149, 0.3);
border-radius: 20px;
font-size: 12px;
font-weight: 600;
color: #01FF95;
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Navigation Buttons */
.beatport-rebuild-slider-nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 100;
width: 100%;
display: flex;
justify-content: space-between;
padding: 0 25px;
pointer-events: none;
}
.beatport-rebuild-nav-btn {
width: 50px;
height: 50px;
border: none;
border-radius: 50%;
background: rgba(1, 255, 149, 0.2);
color: #01FF95;
font-size: 24px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
pointer-events: all;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
.beatport-rebuild-nav-btn:hover {
background: rgba(1, 255, 149, 0.3);
transform: scale(1.1);
box-shadow: 0 6px 25px rgba(1, 255, 149, 0.4);
}
.beatport-rebuild-nav-btn:active {
transform: scale(0.95);
}
/* Slider Indicators */
.beatport-rebuild-slider-indicators {
position: absolute;
bottom: 25px;
left: 50%;
transform: translateX(-50%);
z-index: 100;
display: flex;
gap: 12px;
}
.beatport-rebuild-indicator {
width: 12px;
height: 12px;
border: none;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
cursor: pointer;
transition: all 0.3s ease;
}
.beatport-rebuild-indicator.active {
background: #01FF95;
box-shadow: 0 0 15px rgba(1, 255, 149, 0.6);
transform: scale(1.2);
}
.beatport-rebuild-indicator:hover:not(.active) {
background: rgba(1, 255, 149, 0.6);
transform: scale(1.1);
}
/* Responsive Design */
@media (max-width: 768px) {
.beatport-rebuild-slider {
height: 320px;
}
.beatport-rebuild-track-title {
font-size: 28px;
}
.beatport-rebuild-artist-name {
font-size: 20px;
}
.beatport-rebuild-album-name {
font-size: 16px;
}
.beatport-rebuild-slide-content {
padding: 30px 20px;
}
}
/* ================================= */
/* BEATPORT HERO SECTION */
/* ================================= */
.beatport-hero {
position: relative;
height: fit-content;
border-radius: 20px;
margin-bottom: 40px;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
/* Premium shadow effect matching modal hero sections */
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.5),
0 8px 32px rgba(1, 255, 149, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-hero-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
/* Premium glassmorphic foundation matching modal hero backgrounds */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 50%,
rgba(12, 12, 12, 0.99) 100%);
/* Enhanced borders matching modal hero */
border: 1px solid rgba(1, 255, 149, 0.3);
border-top: 1px solid rgba(1, 255, 149, 0.4);
}
.beatport-hero-bg::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
/* Enhanced ambient lighting effects matching modal backgrounds */
background:
radial-gradient(circle at 25% 25%, rgba(1, 255, 149, 0.15) 0%, transparent 60%),
radial-gradient(circle at 75% 75%, rgba(0, 224, 133, 0.12) 0%, transparent 60%),
radial-gradient(circle at 50% 50%, rgba(1, 255, 149, 0.08) 0%, transparent 80%);
opacity: 0.8;
}
.beatport-hero-content {
position: relative;
z-index: 2;
text-align: center;
color: #ffffff;
padding: 32px;
max-width: 800px;
}
.beatport-hero-content h2 {
/* Enhanced typography matching modal hero titles */
font-size: 42px;
font-weight: 700;
margin: 0 0 16px 0;
line-height: 1.1;
letter-spacing: -0.5px;
/* Premium gradient text effect */
background: linear-gradient(135deg, #01FF95 0%, #00E085 50%, rgb(var(--accent-light-rgb)) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
/* Subtle text shadow for depth */
text-shadow: 0 4px 8px rgba(1, 255, 149, 0.2);
}
.beatport-hero-content p {
/* Enhanced subtitle styling matching modal metadata */
font-size: 18px;
color: #e0e0e0;
margin: 0 0 24px 0;
font-weight: 500;
opacity: 0.9;
line-height: 1.4;
letter-spacing: 0.2px;
}
.beatport-stats {
display: flex;
align-items: center;
justify-content: center;
gap: 16px;
margin-top: 12px;
}
.beatport-hero .stat-item {
/* Premium badge styling matching modal detail badges - scoped to Beatport hero only */
background: rgba(1, 255, 149, 0.15);
color: #01FF95;
font-size: 14px;
font-weight: 600;
padding: 8px 16px;
border-radius: 12px;
border: 1px solid rgba(1, 255, 149, 0.3);
/* Subtle shadow for depth */
box-shadow:
0 4px 12px rgba(1, 255, 149, 0.2),
0 2px 6px rgba(0, 0, 0, 0.2);
/* Glassmorphic effect */
backdrop-filter: blur(8px);
transition: all 0.3s ease;
}
.beatport-hero .stat-item:hover {
background: rgba(1, 255, 149, 0.2);
border-color: rgba(1, 255, 149, 0.4);
transform: translateY(-2px) scale(1.05);
box-shadow:
0 6px 16px rgba(1, 255, 149, 0.3),
0 3px 8px rgba(0, 0, 0, 0.3);
}
.stat-divider {
color: rgba(255, 255, 255, 0.3);
font-weight: 300;
}
/* ================================= */
/* BEATPORT NAVIGATION CARDS */
/* ================================= */
.beatport-navigation {
flex: 1;
overflow-y: auto;
padding: 0 5px;
}
.beatport-category-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
padding: 10px 0;
}
.beatport-category-card {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 24px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
}
.beatport-category-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(1, 255, 149, 0.4), transparent);
transition: all 0.3s;
}
.beatport-category-card:hover {
transform: translateY(-2px);
border-color: rgba(1, 255, 149, 0.15);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 20px rgba(1, 255, 149, 0.06);
}
.beatport-category-card:hover::before {
left: 10%;
right: 10%;
background: linear-gradient(90deg, transparent, rgba(1, 255, 149, 0.7), transparent);
box-shadow: 0 0 8px rgba(1, 255, 149, 0.3);
}
.category-icon {
width: 48px;
height: 48px;
background: linear-gradient(135deg, #01FF95 0%, #00E085 100%);
border-radius: 12px;
margin-bottom: 15px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.beatport-category-card h3 {
font-size: 18px;
font-weight: 600;
color: #ffffff;
margin: 0 0 8px 0;
position: relative;
z-index: 2;
}
.beatport-category-card p {
font-size: 14px;
color: #888;
margin: 0 0 15px 0;
line-height: 1.4;
position: relative;
z-index: 2;
}
.category-count {
display: inline-block;
background: rgba(1, 255, 149, 0.15);
color: #01FF95;
font-size: 12px;
font-weight: 600;
padding: 6px 12px;
border-radius: 20px;
border: 1px solid rgba(1, 255, 149, 0.3);
position: relative;
z-index: 2;
}
/* ================================= */
/* BEATPORT NAVIGATION VIEWS */
/* ================================= */
.beatport-main-view,
.beatport-sub-view {
display: none;
height: 100%;
overflow-y: auto;
padding: 0 5px;
}
.beatport-main-view.active,
.beatport-sub-view.active {
display: block;
}
/* ================================= */
/* BEATPORT BREADCRUMB NAVIGATION */
/* ================================= */
.beatport-breadcrumb {
display: flex;
align-items: center;
gap: 20px;
margin-bottom: 30px;
padding: 20px 24px;
/* Premium glassmorphic foundation matching modal header */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
/* Enhanced borders matching modal */
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
/* Premium shadow effect matching modal sections */
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.breadcrumb-back {
/* Premium button matching modal action buttons */
background: linear-gradient(135deg, #01FF95 0%, #00E085 100%);
border: 1px solid rgba(1, 255, 149, 0.3);
border-radius: 12px;
color: #000000;
font-size: 14px;
font-weight: 700;
padding: 12px 20px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
white-space: nowrap;
/* Premium shadow matching modal buttons */
box-shadow:
0 4px 16px rgba(1, 255, 149, 0.3),
0 2px 8px rgba(0, 0, 0, 0.2);
}
.breadcrumb-back:hover {
/* Enhanced hover state matching modal button hover */
background: linear-gradient(135deg, #00E085 0%, #01FF95 100%);
transform: translateY(-3px) scale(1.05);
border-color: rgba(1, 255, 149, 0.5);
/* Premium enhanced shadow matching modal hover */
box-shadow:
0 8px 24px rgba(1, 255, 149, 0.4),
0 4px 12px rgba(0, 0, 0, 0.3);
}
.breadcrumb-path {
/* Enhanced text styling matching modal metadata */
color: #e0e0e0;
font-size: 16px;
font-weight: 500;
opacity: 0.9;
letter-spacing: 0.3px;
}
/* ================================= */
/* BEATPORT CHART LIST VIEW */
/* ================================= */
.beatport-chart-list {
display: flex;
flex-direction: column;
gap: 15px;
}
.beatport-chart-item {
/* Premium glassmorphic foundation matching modal hero sections */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
/* Enhanced borders matching modal */
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
padding: 24px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 24px;
position: relative;
overflow: hidden;
/* Premium shadow effect matching modal cards */
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-chart-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(1, 255, 149, 0.1) 0%,
transparent 50%);
opacity: 0;
transition: opacity 0.3s ease;
}
.beatport-chart-item:hover {
/* Enhanced glassmorphic hover state matching modal hero hover */
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(22, 22, 22, 1.0) 100%);
transform: translateY(-4px) scale(1.02);
border-color: rgba(1, 255, 149, 0.4);
border-top-color: rgba(1, 255, 149, 0.6);
/* Premium enhanced shadow matching modal hover */
box-shadow:
0 20px 48px rgba(0, 0, 0, 0.5),
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 32px rgba(1, 255, 149, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.beatport-chart-item:hover::before {
opacity: 1;
}
.chart-icon {
font-size: 32px;
width: 60px;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #01FF95 0%, #00E085 100%);
border-radius: 12px;
flex-shrink: 0;
position: relative;
z-index: 2;
}
.chart-info {
flex: 1;
position: relative;
z-index: 2;
}
.chart-info h3 {
font-size: 18px;
font-weight: 600;
color: #ffffff;
margin: 0 0 5px 0;
}
.chart-info p {
font-size: 14px;
color: #888;
margin: 0 0 8px 0;
line-height: 1.4;
}
.track-count {
display: inline-block;
background: rgba(1, 255, 149, 0.15);
color: #01FF95;
font-size: 12px;
font-weight: 600;
padding: 4px 10px;
border-radius: 15px;
border: 1px solid rgba(1, 255, 149, 0.3);
}
/* ================================= */
/* BEATPORT GENRE GRID VIEW */
/* ================================= */
.beatport-genre-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
padding: 10px 0;
}
.beatport-genre-item {
background: linear-gradient(135deg,
rgba(25, 25, 25, 0.95) 0%,
rgba(15, 15, 15, 0.98) 100%);
backdrop-filter: blur(20px);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
padding: 20px;
cursor: pointer;
transition: all 0.3s ease;
text-align: center;
position: relative;
overflow: hidden;
min-height: 120px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 10px;
}
.beatport-genre-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(1, 255, 149, 0.1) 0%,
transparent 50%);
opacity: 0;
transition: opacity 0.3s ease;
}
.beatport-genre-item:hover {
transform: translateY(-5px);
border-color: rgba(1, 255, 149, 0.3);
box-shadow:
0 15px 30px rgba(0, 0, 0, 0.3),
0 0 20px rgba(1, 255, 149, 0.2);
}
.beatport-genre-item:hover::before {
opacity: 1;
}
.genre-icon {
font-size: 28px;
width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #01FF95 0%, #00E085 100%);
border-radius: 10px;
position: relative;
z-index: 2;
}
.beatport-genre-item h3 {
font-size: 16px;
font-weight: 600;
color: #ffffff;
margin: 0;
position: relative;
z-index: 2;
text-align: center;
line-height: 1.2;
}
.genre-track-count {
display: inline-block;
background: rgba(1, 255, 149, 0.15);
color: #01FF95;
font-size: 11px;
font-weight: 600;
padding: 4px 8px;
border-radius: 12px;
border: 1px solid rgba(1, 255, 149, 0.3);
position: relative;
z-index: 2;
}
/* Dynamic Genre Loading States */
.genre-loading-placeholder,
.genre-error-placeholder {
grid-column: 1 / -1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 20px;
text-align: center;
color: #888;
}
.genre-loading-placeholder .loading-spinner {
width: 40px;
height: 40px;
border: 3px solid rgba(1, 255, 149, 0.2);
border-top: 3px solid #01FF95;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 15px;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.refresh-genres-btn {
background: linear-gradient(135deg, #01FF95 0%, #00E085 100%);
color: #000;
border: none;
padding: 10px 20px;
border-radius: 8px;
font-weight: 600;
cursor: pointer;
font-size: 14px;
margin-top: 15px;
transition: all 0.3s ease;
}
.refresh-genres-btn:hover {
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(1, 255, 149, 0.3);
}
/* Genre Images */
.beatport-genre-item .genre-image {
width: 50px;
height: 50px;
border-radius: 12px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border: 2px solid rgba(1, 255, 149, 0.3);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
position: relative;
z-index: 2;
}
.beatport-genre-item:hover .genre-image {
transform: scale(1.1);
border-color: rgba(1, 255, 149, 0.6);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.4),
0 0 20px rgba(1, 255, 149, 0.3);
}
/* ================================= */
/* BEATPORT GENRE DETAIL VIEW */
/* ================================= */
.genre-detail-header {
margin-bottom: 30px;
padding: 20px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.genre-detail-info h2 {
font-size: 32px;
font-weight: 700;
color: #ffffff;
margin: 0 0 8px 0;
background: linear-gradient(135deg, #01ff95, #00d4ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.genre-detail-info p {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* Section Styling */
.genre-main-charts-section,
.genre-releases-section,
.genre-editorial-section,
.genre-new-charts-section,
.homepage-genre-section,
.homepage-main-charts-section,
.homepage-releases-section,
.homepage-hype-section,
.homepage-dj-charts-section,
.homepage-featured-charts-section {
margin-bottom: 40px;
padding: 28px;
/* Premium glassmorphic foundation matching modal design */
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
/* Enhanced borders */
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
/* Premium shadow effect matching modal */
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.5),
0 8px 32px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.section-title {
font-size: 20px;
font-weight: 600;
color: #ffffff;
margin: 0 0 16px 0;
display: flex;
align-items: center;
gap: 8px;
}
.section-description {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
margin: 0 0 20px 0;
font-style: italic;
}
/* Chart Types Grid */
.genre-chart-types-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
}
/* Chart Type Cards */
.genre-chart-type-card {
/* Premium glassmorphic foundation matching modal section design */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
/* Enhanced borders matching modal */
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
padding: 24px;
display: flex;
align-items: center;
gap: 20px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
/* Premium shadow effect matching modal sections */
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.genre-chart-type-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(1, 255, 149, 0.1) 0%,
transparent 50%);
opacity: 0;
transition: opacity 0.3s ease;
}
.genre-chart-type-card:hover {
/* Enhanced glassmorphic hover state matching modal section hover */
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(22, 22, 22, 1.0) 100%);
transform: translateY(-4px) scale(1.02);
border-color: rgba(1, 255, 149, 0.4);
border-top-color: rgba(1, 255, 149, 0.6);
/* Premium enhanced shadow matching modal hover */
box-shadow:
0 20px 48px rgba(0, 0, 0, 0.5),
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 32px rgba(1, 255, 149, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.genre-chart-type-card:hover::before {
opacity: 1;
}
.chart-type-icon {
font-size: 32px;
min-width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg,
rgba(1, 255, 149, 0.2) 0%,
rgba(0, 212, 255, 0.2) 100%);
border-radius: 12px;
border: 1px solid rgba(1, 255, 149, 0.3);
position: relative;
z-index: 2;
}
.chart-type-info {
flex: 1;
position: relative;
z-index: 2;
}
.chart-type-info h3 {
font-size: 18px;
font-weight: 600;
color: #ffffff;
margin: 0 0 4px 0;
}
.chart-type-info p {
font-size: 14px;
color: rgba(255, 255, 255, 0.7);
margin: 0 0 8px 0;
}
.track-count {
font-size: 12px;
color: rgba(1, 255, 149, 0.8);
font-weight: 500;
background: rgba(1, 255, 149, 0.1);
padding: 4px 8px;
border-radius: 6px;
display: inline-block;
}
/* Special Chart Card (New Charts) */
.genre-new-charts-container {
display: flex;
justify-content: center;
}
.genre-chart-type-card.special-chart {
background: linear-gradient(135deg,
rgba(30, 20, 40, 0.95) 0%,
rgba(20, 15, 30, 0.98) 100%);
border: 2px solid rgba(138, 43, 226, 0.3);
max-width: 400px;
position: relative;
}
.genre-chart-type-card.special-chart::before {
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.15) 0%,
transparent 50%);
}
.genre-chart-type-card.special-chart:hover {
border-color: rgba(138, 43, 226, 0.5);
box-shadow:
0 12px 30px rgba(0, 0, 0, 0.4),
0 0 20px rgba(138, 43, 226, 0.3);
}
.genre-chart-type-card.special-chart .chart-type-icon {
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.3) 0%,
rgba(75, 0, 130, 0.3) 100%);
border-color: rgba(138, 43, 226, 0.4);
}
.special-badge {
position: absolute;
top: 8px;
right: 8px;
background: linear-gradient(135deg, #8a2be2, #4b0082);
color: #ffffff;
font-size: 10px;
font-weight: 600;
padding: 4px 8px;
border-radius: 6px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Empty Section Placeholder */
.empty-section-placeholder {
display: flex;
align-items: center;
gap: 20px;
padding: 40px 20px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.5) 0%,
rgba(20, 20, 20, 0.7) 100%);
border-radius: 12px;
border: 2px dashed rgba(255, 255, 255, 0.15);
text-align: center;
opacity: 0.8;
transition: all 0.3s ease;
min-height: 120px;
justify-content: center;
}
.empty-section-placeholder:hover {
opacity: 1;
border-color: rgba(255, 255, 255, 0.25);
background: linear-gradient(135deg,
rgba(35, 35, 35, 0.6) 0%,
rgba(25, 25, 25, 0.8) 100%);
}
.empty-section-icon {
font-size: 48px;
opacity: 0.6;
filter: grayscale(1);
}
.empty-section-text h4 {
font-size: 18px;
font-weight: 600;
color: rgba(255, 255, 255, 0.8);
margin: 0 0 8px 0;
}
.empty-section-text p {
font-size: 14px;
color: rgba(255, 255, 255, 0.5);
margin: 0;
font-style: italic;
}
.expand-indicator {
position: absolute;
top: 50%;
right: 12px;
transform: translateY(-50%);
font-size: 16px;
color: rgba(138, 43, 226, 0.8);
transition: transform 0.3s ease;
z-index: 5;
background: rgba(0, 0, 0, 0.3);
padding: 4px;
border-radius: 4px;
}
.expand-indicator.expanded {
transform: translateY(-50%) rotate(180deg);
}
/* Always Visible New Charts Content */
.new-charts-content {
margin-top: 20px;
padding: 20px;
background: linear-gradient(135deg,
rgba(35, 25, 45, 0.9) 0%,
rgba(25, 20, 35, 0.95) 100%);
border-radius: 12px;
border: 1px solid rgba(138, 43, 226, 0.15);
}
@keyframes expandDown {
from {
opacity: 0;
max-height: 0;
padding-top: 0;
padding-bottom: 0;
}
to {
opacity: 1;
max-height: 1000px;
padding-top: 20px;
padding-bottom: 20px;
}
}
.charts-loading-inline {
text-align: center;
padding: 40px 20px;
color: rgba(255, 255, 255, 0.6);
}
.charts-loading-inline .loading-spinner-small {
width: 30px;
height: 30px;
border: 3px solid rgba(138, 43, 226, 0.3);
border-top: 3px solid #8a2be2;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto 12px auto;
}
.charts-loading-inline p {
font-size: 14px;
margin: 0;
}
.new-charts-grid,
.dj-charts-grid,
.featured-charts-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
.new-chart-item {
/* Premium glassmorphic foundation matching modal card design */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
/* Enhanced borders matching modal */
border-radius: 16px;
border: 1px solid rgba(138, 43, 226, 0.3);
border-top: 1px solid rgba(138, 43, 226, 0.4);
padding: 20px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
/* Premium shadow effect matching modal cards */
box-shadow:
0 8px 24px rgba(138, 43, 226, 0.2),
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.new-chart-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.1) 0%,
transparent 50%);
opacity: 0;
transition: opacity 0.3s ease;
}
.new-chart-item:hover {
/* Enhanced glassmorphic hover state matching modal card hover */
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(22, 22, 22, 1.0) 100%);
transform: translateY(-4px) scale(1.02);
border-color: rgba(138, 43, 226, 0.5);
border-top-color: rgba(138, 43, 226, 0.7);
/* Premium enhanced shadow matching modal hover */
box-shadow:
0 16px 40px rgba(138, 43, 226, 0.3),
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 32px rgba(138, 43, 226, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.new-chart-item:hover::before {
opacity: 1;
}
.new-chart-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
position: relative;
z-index: 2;
}
.new-chart-icon {
width: 32px;
height: 32px;
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.3) 0%,
rgba(75, 0, 130, 0.3) 100%);
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
border: 1px solid rgba(138, 43, 226, 0.4);
}
.new-chart-title {
flex: 1;
}
.new-chart-title h5 {
font-size: 14px;
font-weight: 600;
color: #ffffff;
margin: 0 0 2px 0;
line-height: 1.3;
}
.new-chart-artist {
font-size: 12px;
color: rgba(138, 43, 226, 0.8);
margin: 0;
font-weight: 500;
}
.new-chart-description {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
margin: 0 0 10px 0;
line-height: 1.4;
position: relative;
z-index: 2;
}
.new-chart-footer {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
z-index: 2;
}
.new-chart-type {
font-size: 9px;
background: rgba(138, 43, 226, 0.2);
color: rgba(138, 43, 226, 0.9);
padding: 3px 6px;
border-radius: 4px;
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.5px;
}
.new-chart-action {
font-size: 10px;
color: rgba(1, 255, 149, 0.8);
font-weight: 500;
display: flex;
align-items: center;
gap: 3px;
}
.new-charts-empty {
text-align: center;
padding: 40px 20px;
color: rgba(255, 255, 255, 0.6);
}
.new-charts-empty h4 {
font-size: 16px;
margin: 0 0 8px 0;
color: rgba(255, 255, 255, 0.8);
}
.new-charts-empty p {
font-size: 12px;
margin: 0;
line-height: 1.4;
}
/* ================================= */
/* BEATPORT GENRE CHARTS LIST VIEW */
/* ================================= */
.genre-charts-list-header {
margin-bottom: 30px;
padding: 20px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.genre-charts-list-info h2 {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin: 0 0 8px 0;
background: linear-gradient(135deg, #8a2be2, #4b0082);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.genre-charts-list-info p {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
.genre-charts-list-container {
position: relative;
min-height: 400px;
}
.charts-loading-placeholder {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
color: rgba(255, 255, 255, 0.6);
}
.charts-loading-placeholder .loading-spinner {
width: 40px;
height: 40px;
border: 4px solid rgba(138, 43, 226, 0.3);
border-top: 4px solid #8a2be2;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto 16px auto;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.charts-loading-placeholder p {
font-size: 16px;
margin: 0;
}
.genre-charts-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 20px;
padding: 10px 0;
}
.genre-chart-item {
/* Premium glassmorphic foundation matching modal card design */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
/* Enhanced borders matching modal */
border-radius: 16px;
border: 1px solid rgba(138, 43, 226, 0.3);
border-top: 1px solid rgba(138, 43, 226, 0.4);
padding: 24px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
/* Premium shadow effect matching modal cards */
box-shadow:
0 8px 24px rgba(138, 43, 226, 0.2),
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.genre-chart-item::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.1) 0%,
transparent 50%);
opacity: 0;
transition: opacity 0.3s ease;
}
.genre-chart-item:hover {
/* Enhanced glassmorphic hover state matching modal card hover */
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(22, 22, 22, 1.0) 100%);
transform: translateY(-6px) scale(1.02);
border-color: rgba(138, 43, 226, 0.5);
border-top-color: rgba(138, 43, 226, 0.7);
/* Premium enhanced shadow matching modal hover */
box-shadow:
0 20px 48px rgba(138, 43, 226, 0.3),
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 40px rgba(138, 43, 226, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.genre-chart-item:hover::before {
opacity: 1;
}
.chart-item-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 12px;
position: relative;
z-index: 2;
}
.chart-item-icon {
width: 40px;
height: 40px;
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.3) 0%,
rgba(75, 0, 130, 0.3) 100%);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
border: 1px solid rgba(138, 43, 226, 0.4);
}
.chart-item-title {
flex: 1;
}
.chart-item-title h4 {
font-size: 16px;
font-weight: 600;
color: #ffffff;
margin: 0 0 4px 0;
line-height: 1.3;
}
.chart-item-artist {
font-size: 14px;
color: rgba(138, 43, 226, 0.8);
margin: 0;
font-weight: 500;
}
.chart-item-description {
font-size: 13px;
color: rgba(255, 255, 255, 0.6);
margin: 0 0 12px 0;
line-height: 1.4;
position: relative;
z-index: 2;
}
.chart-item-footer {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
z-index: 2;
}
.chart-item-type {
font-size: 11px;
background: rgba(138, 43, 226, 0.2);
color: rgba(138, 43, 226, 0.9);
padding: 4px 8px;
border-radius: 6px;
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.5px;
}
.chart-item-action {
font-size: 12px;
color: rgba(1, 255, 149, 0.8);
font-weight: 500;
display: flex;
align-items: center;
gap: 4px;
}
.genre-charts-empty {
text-align: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.6);
}
.genre-charts-empty h3 {
font-size: 20px;
margin: 0 0 12px 0;
color: rgba(255, 255, 255, 0.8);
}
.genre-charts-empty p {
font-size: 14px;
margin: 0;
line-height: 1.5;
}
/* ================================= */
/* RESPONSIVE DESIGN */
/* ================================= */
@media (max-width: 768px) {
.beatport-genre-grid {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 15px;
}
/* Genre Detail Responsive */
.genre-detail-info h2 {
font-size: 24px;
}
.genre-chart-types-grid {
grid-template-columns: 1fr;
gap: 12px;
}
.genre-chart-type-card {
padding: 16px;
gap: 12px;
}
.chart-type-icon {
font-size: 28px;
min-width: 40px;
height: 40px;
}
.chart-type-info h3 {
font-size: 16px;
}
.section-title {
font-size: 18px;
}
.genre-main-charts-section,
.genre-releases-section,
.genre-editorial-section,
.genre-new-charts-section,
.homepage-genre-section,
.homepage-main-charts-section,
.homepage-releases-section,
.homepage-hype-section {
margin-bottom: 24px;
padding: 16px;
}
/* Genre Charts List Responsive */
.genre-charts-list-info h2 {
font-size: 22px;
}
.genre-charts-grid {
grid-template-columns: 1fr;
gap: 16px;
}
.genre-chart-item {
padding: 16px;
}
.chart-item-header {
gap: 10px;
}
.chart-item-icon {
width: 35px;
height: 35px;
font-size: 16px;
}
.chart-item-title h4 {
font-size: 15px;
}
.beatport-chart-item {
flex-direction: column;
text-align: center;
gap: 15px;
}
.chart-icon {
width: 50px;
height: 50px;
font-size: 24px;
}
.beatport-breadcrumb {
flex-direction: column;
align-items: stretch;
gap: 10px;
}
.breadcrumb-back {
text-align: center;
}
}
.playlist-scroll-container {
flex-grow: 1;
overflow-y: auto;
background: rgba(0, 0, 0, 0.2);
border-radius: 8px;
padding: 10px;
}
.playlist-placeholder {
text-align: center;
color: #b3b3b3;
font-size: 14px;
padding: 40px;
}
/* URL History Bar (saved playlist URLs) */
.url-history-bar {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 2px;
overflow-x: auto;
scrollbar-width: none;
-ms-overflow-style: none;
flex-shrink: 0;
}
.url-history-bar::-webkit-scrollbar {
display: none;
}
.url-history-bar-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap;
flex-shrink: 0;
padding-left: 4px;
}
.url-history-pill {
display: flex;
align-items: center;
gap: 6px;
padding: 4px 10px 4px 8px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
cursor: pointer;
white-space: nowrap;
flex-shrink: 0;
transition: all 0.2s ease;
max-width: 220px;
}
.url-history-pill:hover {
background: rgba(255, 255, 255, 0.1);
border-color: rgba(255, 255, 255, 0.15);
}
.url-history-pill-icon {
font-size: 12px;
flex-shrink: 0;
}
.url-history-pill-name {
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.75);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.url-history-pill:hover .url-history-pill-name {
color: rgba(255, 255, 255, 0.95);
}
.url-history-pill-remove {
display: flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
border-radius: 50%;
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
background: transparent;
border: none;
cursor: pointer;
flex-shrink: 0;
transition: all 0.15s ease;
padding: 0;
line-height: 1;
}
.url-history-pill-remove:hover {
color: #ff4444;
background: rgba(255, 68, 68, 0.15);
}
/* Source-specific pill accent on hover */
#youtube-url-history .url-history-pill:hover {
border-color: rgba(255, 32, 32, 0.3);
}
#deezer-url-history .url-history-pill:hover {
border-color: rgba(162, 56, 255, 0.3);
}
#spotify-public-url-history .url-history-pill:hover {
border-color: rgba(29, 185, 84, 0.3);
}
/* Playlist URL input section (YouTube, Deezer) */
.youtube-input-section {
display: flex;
align-items: center;
gap: 0;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 4px;
transition: border-color 0.25s ease, box-shadow 0.25s ease;
}
.youtube-input-section:focus-within {
border-color: rgba(255, 255, 255, 0.15);
box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
}
#youtube-url-input,
#deezer-url-input,
#spotify-public-url-input {
flex: 1;
background: transparent;
border: none;
padding: 12px 16px;
color: rgba(255, 255, 255, 0.9);
font-size: 13.5px;
font-family: 'SF Pro Text', -apple-system, sans-serif;
outline: none;
min-width: 0;
}
#youtube-url-input::placeholder,
#deezer-url-input::placeholder,
#spotify-public-url-input::placeholder {
color: rgba(255, 255, 255, 0.3);
font-weight: 400;
}
#youtube-parse-btn,
#deezer-parse-btn,
#spotify-public-parse-btn {
flex-shrink: 0;
padding: 10px 22px;
border: none;
border-radius: 9px;
font-size: 12.5px;
font-weight: 600;
font-family: 'SF Pro Text', -apple-system, sans-serif;
cursor: pointer;
transition: all 0.2s ease;
letter-spacing: 0.2px;
white-space: nowrap;
}
#youtube-parse-btn {
background: linear-gradient(135deg, #ff2020, #e00000);
color: #fff;
box-shadow: 0 2px 8px rgba(255, 0, 0, 0.2);
}
#youtube-parse-btn:hover {
background: linear-gradient(135deg, #ff3333, #ff1111);
box-shadow: 0 4px 16px rgba(255, 0, 0, 0.3);
transform: translateY(-1px);
}
#youtube-parse-btn:active {
transform: translateY(0);
box-shadow: 0 1px 4px rgba(255, 0, 0, 0.2);
}
#deezer-parse-btn {
background: linear-gradient(135deg, #a238ff, #b44dff);
color: #fff;
box-shadow: 0 2px 8px rgba(162, 56, 255, 0.2);
}
#deezer-parse-btn:hover {
background: linear-gradient(135deg, #b044ff, #c058ff);
box-shadow: 0 4px 16px rgba(162, 56, 255, 0.3);
transform: translateY(-1px);
}
#deezer-parse-btn:active {
transform: translateY(0);
box-shadow: 0 1px 4px rgba(162, 56, 255, 0.2);
}
#youtube-parse-btn:disabled,
#deezer-parse-btn:disabled,
#spotify-public-parse-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* Brand-colored focus glow per tab */
#youtube-tab-content .youtube-input-section:focus-within {
border-color: rgba(255, 0, 0, 0.25);
box-shadow: 0 0 16px rgba(255, 0, 0, 0.08);
}
#deezer-tab-content .youtube-input-section:focus-within {
border-color: rgba(162, 56, 255, 0.25);
box-shadow: 0 0 16px rgba(162, 56, 255, 0.08);
}
#spotify-public-parse-btn {
background: linear-gradient(135deg, #1DB954, #1ed760);
color: #fff;
box-shadow: 0 2px 8px rgba(29, 185, 84, 0.2);
}
#spotify-public-parse-btn:hover {
background: linear-gradient(135deg, #1ed760, #2de86e);
box-shadow: 0 4px 16px rgba(29, 185, 84, 0.3);
transform: translateY(-1px);
}
#spotify-public-parse-btn:active {
transform: translateY(0);
box-shadow: 0 1px 4px rgba(29, 185, 84, 0.2);
}
#spotify-public-tab-content .youtube-input-section:focus-within {
border-color: rgba(29, 185, 84, 0.25);
box-shadow: 0 0 16px rgba(29, 185, 84, 0.08);
}
/* Right Sidebar */
.sync-sidebar {
gap: 20px;
}
.sidebar-section {
display: flex;
flex-direction: column;
gap: 10px;
}
.sidebar-section h4 {
font-size: 14px;
font-weight: bold;
color: #ffffff;
}
#selection-info {
font-size: 12px;
color: #b3b3b3;
text-align: center;
}
.neo-button {
width: 100%;
padding: 12px;
background: rgb(var(--accent-rgb));
border: none;
border-radius: 22px;
color: #000000;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 5px 15px rgba(var(--accent-rgb), 0.2);
}
.neo-button:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(var(--accent-rgb), 0.3);
}
.neo-button:disabled {
background: #404040;
color: #666666;
cursor: not-allowed;
box-shadow: none;
}
.sync-sidebar .progress-section {
flex-grow: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}
#sync-progress-text {
font-size: 11px;
color: #b3b3b3;
}
#sync-log-area {
flex-grow: 1;
background: #181818;
border: 1px solid #404040;
border-radius: 4px;
color: #b3b3b3;
font-size: 10px;
font-family: monospace;
padding: 8px;
resize: none;
}
/* Playlist Cards Styling - Premium Glassmorphic Design */
.playlist-card {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
margin: 10px 6px;
padding: 20px 22px;
cursor: pointer;
position: relative;
overflow: hidden;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.playlist-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.3), transparent);
transition: all 0.3s;
}
.playlist-card:hover {
transform: translateY(-2px);
border-color: rgba(var(--accent-rgb), 0.15);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 20px rgba(var(--accent-rgb), 0.06);
}
.playlist-card:hover::before {
left: 10%;
right: 10%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.6), transparent);
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.3);
}
.playlist-card.selected {
border-color: rgba(var(--accent-rgb), 0.3);
background: rgba(var(--accent-rgb), 0.04);
}
.playlist-card.selected::before {
left: 5%;
right: 5%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.7), transparent);
}
.playlist-card-main {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.playlist-card-content {
flex: 1;
min-width: 0;
}
.playlist-card-name {
font-size: 16px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 6px;
line-height: 1.3;
}
.playlist-card-info {
font-size: 13px;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 8px;
}
.playlist-card-status {
font-weight: 600;
padding: 4px 10px;
border-radius: 6px;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.05em;
border: 1px solid rgba(255, 255, 255, 0.06);
display: inline-block;
}
.status-never-synced {
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.4);
border-color: rgba(255, 255, 255, 0.06);
}
.status-synced {
background: rgba(var(--accent-rgb), 0.1);
color: rgb(var(--accent-light-rgb));
border-color: rgba(var(--accent-rgb), 0.2);
}
.status-needs-sync {
background: rgba(255, 149, 0, 0.1);
color: #ffb84d;
border-color: rgba(255, 149, 0, 0.15);
}
.playlist-card-actions {
flex-shrink: 0;
margin-left: 16px;
}
.playlist-card-actions button {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
padding: 9px 18px;
border-radius: 10px;
cursor: pointer;
font-size: 13px;
font-weight: 600;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
}
.playlist-card-actions button::before {
content: '';
position: absolute;
inset: 0;
border-radius: 10px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.05) 100%);
opacity: 0;
transition: opacity 0.3s;
}
.playlist-card-actions button:hover::before {
opacity: 1;
}
.playlist-card-actions button:hover {
color: #fff;
border-color: rgba(var(--accent-rgb), 0.35);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.15);
}
.sync-progress-indicator {
font-size: 12px;
color: rgb(var(--accent-rgb));
margin-top: 8px;
display: none;
}
/* ===============================
YOUTUBE PLAYLIST CARD STYLES
=============================== */
/* Source-specific playlist cards — unified glass style with brand color accents */
.youtube-playlist-card,
.tidal-playlist-card,
.deezer-playlist-card,
.spotify-public-card {
background: rgba(18, 18, 22, 0.9);
backdrop-filter: blur(12px);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
margin: 10px 6px;
padding: 18px 22px;
cursor: pointer;
position: relative;
overflow: hidden;
height: auto;
min-height: 70px;
display: flex;
align-items: center;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.youtube-playlist-card::before,
.tidal-playlist-card::before,
.deezer-playlist-card::before,
.spotify-public-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
transition: all 0.3s;
}
/* Brand accent lines */
.youtube-playlist-card::before { background: linear-gradient(90deg, transparent, rgba(255, 0, 0, 0.4), transparent); }
.tidal-playlist-card::before { background: linear-gradient(90deg, transparent, rgba(255, 102, 0, 0.4), transparent); }
.deezer-playlist-card::before { background: linear-gradient(90deg, transparent, rgba(162, 56, 255, 0.4), transparent); }
.spotify-public-card::before { background: linear-gradient(90deg, transparent, rgba(29, 185, 84, 0.4), transparent); }
/* Hover — brand glow */
.youtube-playlist-card:hover { border-color: rgba(255, 0, 0, 0.15); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 16px rgba(255, 0, 0, 0.06); transform: translateY(-2px); }
.tidal-playlist-card:hover { border-color: rgba(255, 102, 0, 0.15); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 16px rgba(255, 102, 0, 0.06); transform: translateY(-2px); }
.deezer-playlist-card:hover { border-color: rgba(162, 56, 255, 0.15); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 16px rgba(162, 56, 255, 0.06); transform: translateY(-2px); }
.spotify-public-card:hover { border-color: rgba(29, 185, 84, 0.15); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 16px rgba(29, 185, 84, 0.06); transform: translateY(-2px); }
.youtube-playlist-card:hover::before { left: 10%; right: 10%; background: linear-gradient(90deg, transparent, rgba(255, 0, 0, 0.7), transparent); }
.tidal-playlist-card:hover::before { left: 10%; right: 10%; background: linear-gradient(90deg, transparent, rgba(255, 102, 0, 0.7), transparent); }
.deezer-playlist-card:hover::before { left: 10%; right: 10%; background: linear-gradient(90deg, transparent, rgba(162, 56, 255, 0.7), transparent); }
.spotify-public-card:hover::before { left: 10%; right: 10%; background: linear-gradient(90deg, transparent, rgba(29, 185, 84, 0.7), transparent); }
/* Source icons */
.youtube-playlist-card .playlist-card-icon,
.tidal-playlist-card .playlist-card-icon,
.deezer-playlist-card .playlist-card-icon,
.spotify-public-card .playlist-card-icon {
width: 40px;
height: 40px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
color: #ffffff;
margin-right: 16px;
flex-shrink: 0;
transition: all 0.25s;
}
.youtube-playlist-card .playlist-card-icon { background: rgba(255, 0, 0, 0.12); border: 1px solid rgba(255, 0, 0, 0.2); color: #ff4444; }
.tidal-playlist-card .playlist-card-icon { background: rgba(255, 102, 0, 0.12); border: 1px solid rgba(255, 102, 0, 0.2); color: #ff6600; font-size: 16px; }
.deezer-playlist-card .playlist-card-icon { background: rgba(162, 56, 255, 0.12); border: 1px solid rgba(162, 56, 255, 0.2); color: #a238ff; }
.spotify-public-card .playlist-card-icon { background: rgba(29, 185, 84, 0.12); border: 1px solid rgba(29, 185, 84, 0.2); color: #1DB954; }
.youtube-playlist-card .playlist-card-content,
.tidal-playlist-card .playlist-card-content,
.deezer-playlist-card .playlist-card-content,
.spotify-public-card .playlist-card-content { flex: 1; min-width: 0; }
.youtube-playlist-card .playlist-card-name,
.tidal-playlist-card .playlist-card-name,
.deezer-playlist-card .playlist-card-name,
.spotify-public-card .playlist-card-name { font-size: 15px; font-weight: 600; color: rgba(255, 255, 255, 0.9); margin-bottom: 4px; }
.youtube-playlist-card .playlist-card-info,
.tidal-playlist-card .playlist-card-info,
.deezer-playlist-card .playlist-card-info,
.spotify-public-card .playlist-card-info { font-size: 13px; color: rgba(255, 255, 255, 0.4); display: flex; align-items: center; gap: 10px; }
.youtube-playlist-card .playlist-card-track-count { color: rgba(255, 255, 255, 0.7); }
.youtube-playlist-card .playlist-card-phase-text { font-weight: 500; }
.youtube-playlist-card .playlist-card-progress { font-size: 12px; color: #ff6b6b; margin-top: 4px; font-weight: 500; }
/* Action buttons — glass style with brand hover */
.youtube-playlist-card .playlist-card-action-btn,
.tidal-playlist-card .playlist-card-action-btn,
.deezer-playlist-card .playlist-card-action-btn,
.spotify-public-card .playlist-card-action-btn {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
padding: 9px 18px;
border-radius: 10px;
cursor: pointer;
font-size: 13px;
font-weight: 600;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
margin-left: 16px;
flex-shrink: 0;
position: relative;
overflow: hidden;
}
.youtube-playlist-card .playlist-card-action-btn::before,
.tidal-playlist-card .playlist-card-action-btn::before,
.deezer-playlist-card .playlist-card-action-btn::before,
.spotify-public-card .playlist-card-action-btn::before {
content: '';
position: absolute;
inset: 0;
border-radius: 10px;
opacity: 0;
transition: opacity 0.3s;
}
.youtube-playlist-card .playlist-card-action-btn::before { background: linear-gradient(135deg, rgba(255, 0, 0, 0.2), rgba(255, 0, 0, 0.05)); }
.tidal-playlist-card .playlist-card-action-btn::before { background: linear-gradient(135deg, rgba(255, 102, 0, 0.2), rgba(255, 102, 0, 0.05)); }
.deezer-playlist-card .playlist-card-action-btn::before { background: linear-gradient(135deg, rgba(162, 56, 255, 0.2), rgba(162, 56, 255, 0.05)); }
.spotify-public-card .playlist-card-action-btn::before { background: linear-gradient(135deg, rgba(29, 185, 84, 0.2), rgba(29, 185, 84, 0.05)); }
.youtube-playlist-card .playlist-card-action-btn:hover:not(:disabled)::before,
.tidal-playlist-card .playlist-card-action-btn:hover:not(:disabled)::before,
.deezer-playlist-card .playlist-card-action-btn:hover:not(:disabled)::before,
.spotify-public-card .playlist-card-action-btn:hover:not(:disabled)::before { opacity: 1; }
.youtube-playlist-card .playlist-card-action-btn:hover:not(:disabled) { color: #fff; border-color: rgba(255, 0, 0, 0.35); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(255, 0, 0, 0.15); }
.tidal-playlist-card .playlist-card-action-btn:hover:not(:disabled) { color: #fff; border-color: rgba(255, 102, 0, 0.35); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(255, 102, 0, 0.15); }
.deezer-playlist-card .playlist-card-action-btn:hover:not(:disabled) { color: #fff; border-color: rgba(162, 56, 255, 0.35); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(162, 56, 255, 0.15); }
.spotify-public-card .playlist-card-action-btn:hover:not(:disabled) { color: #fff; border-color: rgba(29, 185, 84, 0.35); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(29, 185, 84, 0.15); }
.youtube-playlist-card .playlist-card-action-btn:disabled,
.tidal-playlist-card .playlist-card-action-btn:disabled,
.deezer-playlist-card .playlist-card-action-btn:disabled,
.spotify-public-card .playlist-card-action-btn:disabled {
background: rgba(255, 255, 255, 0.03);
border-color: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.2);
cursor: not-allowed;
box-shadow: none;
transform: none;
}
/* ===============================
YOUTUBE DISCOVERY MODAL STYLES
=============================== */
.youtube-discovery-modal {
max-width: 1200px;
width: 90%;
max-height: 90vh;
display: flex;
flex-direction: column;
/* Premium glassmorphic foundation */
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255, 0, 0, 0.2);
border-top: 1px solid rgba(255, 0, 0, 0.3);
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.5),
0 8px 32px rgba(255, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.youtube-discovery-modal .modal-header {
padding: 30px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
position: relative;
}
.youtube-discovery-modal .modal-header h2 {
color: #ffffff;
font-size: 24px;
font-weight: 700;
margin: 0 0 8px 0;
}
.youtube-discovery-modal .modal-subtitle {
color: rgba(255, 255, 255, 0.8);
font-size: 16px;
margin: 0 0 4px 0;
}
.youtube-discovery-modal .modal-description {
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
margin: 0;
}
.youtube-discovery-modal .modal-close-btn {
position: absolute;
top: 30px;
right: 30px;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
color: #ffffff;
width: 32px;
height: 32px;
border-radius: 16px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
transition: all 0.2s ease;
}
.youtube-discovery-modal .modal-close-btn:hover {
background: rgba(255, 0, 0, 0.2);
border-color: rgba(255, 0, 0, 0.4);
}
.youtube-discovery-modal .modal-body {
flex: 1;
padding: 30px;
overflow: hidden;
display: flex;
flex-direction: column;
gap: 20px;
}
.youtube-discovery-modal .progress-section {
background: rgba(255, 255, 255, 0.05);
border-radius: 12px;
padding: 20px;
}
.youtube-discovery-modal .progress-label {
color: #ffffff;
font-size: 16px;
font-weight: 600;
margin-bottom: 12px;
}
.youtube-discovery-modal .progress-bar-container {
background: rgba(0, 0, 0, 0.3);
border-radius: 8px;
overflow: hidden;
height: 20px !important;
margin-bottom: 8px;
}
.youtube-discovery-modal .progress-bar-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
width: 0%;
transition: width 0.5s ease;
}
.youtube-discovery-modal .progress-text {
color: rgba(255, 255, 255, 0.8);
font-size: 14px;
text-align: center;
}
.youtube-discovery-modal .discovery-table-container {
flex: 1;
overflow: auto;
background: rgba(0, 0, 0, 0.2);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.youtube-discovery-modal .discovery-table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
/* Enable fixed layout for consistent column widths */
}
.youtube-discovery-modal .discovery-table th {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
font-weight: 600;
padding: 12px 8px;
text-align: left;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
font-size: 14px;
position: sticky;
top: 0;
z-index: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Column width distribution for balanced layout */
.youtube-discovery-modal .discovery-table th:nth-child(1),
/* YT Track */
.youtube-discovery-modal .discovery-table td:nth-child(1) {
width: 17.5%;
}
.youtube-discovery-modal .discovery-table th:nth-child(2),
/* YT Artist */
.youtube-discovery-modal .discovery-table td:nth-child(2) {
width: 15%;
}
.youtube-discovery-modal .discovery-table th:nth-child(3),
/* Status */
.youtube-discovery-modal .discovery-table td:nth-child(3) {
width: 12%;
}
.youtube-discovery-modal .discovery-table th:nth-child(4),
/* Spotify Track */
.youtube-discovery-modal .discovery-table td:nth-child(4) {
width: 17.5%;
}
.youtube-discovery-modal .discovery-table th:nth-child(5),
/* Spotify Artist */
.youtube-discovery-modal .discovery-table td:nth-child(5) {
width: 15%;
}
.youtube-discovery-modal .discovery-table th:nth-child(6),
/* Album */
.youtube-discovery-modal .discovery-table td:nth-child(6) {
width: 13%;
}
.youtube-discovery-modal .discovery-table th:nth-child(7),
/* Duration */
.youtube-discovery-modal .discovery-table td:nth-child(7) {
width: 10%;
text-align: center;
}
.youtube-discovery-modal .discovery-table td {
padding: 10px 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.youtube-discovery-modal .discovery-table .yt-track,
.youtube-discovery-modal .discovery-table .yt-artist {
color: rgba(255, 255, 255, 0.8);
}
.youtube-discovery-modal .discovery-table .discovery-status.found {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.youtube-discovery-modal .discovery-table .discovery-status.not-found {
color: #ff6b6b;
font-weight: 600;
}
.youtube-discovery-modal .discovery-table .discovery-status.error {
color: #ffb84d;
font-weight: 600;
}
.youtube-discovery-modal .discovery-table .spotify-track,
.youtube-discovery-modal .discovery-table .spotify-artist,
.youtube-discovery-modal .discovery-table .spotify-album {
color: #ffffff;
}
.youtube-discovery-modal .modal-footer {
padding: 30px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: space-between;
}
.youtube-discovery-modal .modal-footer-left {
display: flex;
gap: 12px;
align-items: center;
}
.youtube-discovery-modal .modal-footer-right {
display: flex;
gap: 12px;
}
.youtube-discovery-modal .modal-btn {
padding: 12px 24px;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
border: none;
}
.youtube-discovery-modal .modal-btn-secondary {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.2);
}
.youtube-discovery-modal .modal-btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.3);
}
.youtube-discovery-modal .modal-btn-primary {
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
color: #ffffff;
border: 1px solid rgba(var(--accent-rgb), 0.3);
}
.youtube-discovery-modal .modal-btn-primary:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)) 0%, #1fbc56 100%);
border-color: rgba(var(--accent-rgb), 0.5);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}
.youtube-discovery-modal .modal-btn-danger {
background: linear-gradient(135deg, #ff6b6b 0%, #ff5555 100%);
color: #ffffff;
border: 1px solid rgba(255, 107, 107, 0.3);
}
.youtube-discovery-modal .modal-btn-danger:hover {
background: linear-gradient(135deg, #ff5555 0%, #ff4444 100%);
border-color: rgba(255, 107, 107, 0.5);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(255, 107, 107, 0.3);
}
.youtube-discovery-modal .sync-progress-display {
color: rgb(var(--accent-light-rgb));
font-size: 14px;
font-weight: 500;
padding: 8px 12px;
background: rgba(var(--accent-rgb), 0.1);
border-radius: 8px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
}
/* Modal state management */
.modal-overlay.hidden {
display: none !important;
}
/* Playlist Details Modal - Clean Premium Design */
.playlist-modal {
max-width: 900px;
width: 90%;
max-height: 90vh;
display: flex;
flex-direction: column;
/* Premium glassmorphic foundation */
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
/* Premium shadow effect */
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.6),
0 8px 32px rgba(0, 0, 0, 0.4),
0 0 40px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
overflow: hidden;
}
.playlist-modal-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
padding: 24px 28px 16px 28px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.playlist-header-content h2 {
color: #ffffff;
font-size: 22px;
font-weight: 700;
margin: 0 0 8px 0;
line-height: 1.2;
}
.playlist-quick-info {
display: flex;
gap: 16px;
font-size: 14px;
}
.playlist-track-count {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.playlist-owner {
color: #b3b3b3;
}
.playlist-modal-close {
color: #b3b3b3;
font-size: 28px;
cursor: pointer;
line-height: 1;
transition: all 0.2s ease;
padding: 4px;
margin: -4px;
}
.playlist-modal-close:hover {
color: #ffffff;
transform: scale(1.1);
}
.playlist-modal-body {
flex: 1;
padding: 0 28px;
padding-left: 0;
overflow: hidden;
display: flex;
flex-direction: column;
}
.playlist-description {
color: #e0e0e0;
font-size: 14px;
line-height: 1.5;
margin-bottom: 20px;
padding: 16px;
background: rgba(var(--accent-rgb), 0.05);
border-radius: 12px;
border-left: 3px solid rgb(var(--accent-light-rgb));
}
.playlist-tracks-container {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}
.playlist-tracks-list {
flex: 1;
overflow-y: auto;
margin: 0;
/* Negative margin for better scrolling */
padding: 0 12px;
}
/* Custom scrollbar for playlist tracks list */
*::-webkit-scrollbar {
width: 12px;
}
*::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 6px;
}
*::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.3);
border-radius: 6px;
border: 2px solid rgba(255, 255, 255, 0.1);
}
*::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.5);
}
.playlist-track-item {
display: flex;
align-items: center;
padding: 12px 16px;
border-radius: 8px;
margin-bottom: 2px;
transition: all 0.2s ease;
}
.playlist-track-item:hover {
background: rgba(255, 255, 255, 0.05);
}
.playlist-track-number {
width: 32px;
text-align: center;
color: #666666;
font-size: 13px;
font-weight: 500;
}
.playlist-track-info {
flex: 1;
margin-left: 16px;
min-width: 0;
}
.playlist-track-name {
color: #ffffff;
font-size: 14px;
font-weight: 500;
margin-bottom: 3px;
line-height: 1.3;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.playlist-track-artists {
color: #b3b3b3;
font-size: 12px;
line-height: 1.2;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.playlist-track-duration {
color: #b3b3b3;
font-size: 12px;
font-weight: 500;
margin-left: 16px;
min-width: 40px;
text-align: right;
}
.playlist-modal-footer {
padding: 20px 28px 24px 28px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
gap: 12px;
justify-content: space-between;
align-items: center;
}
.playlist-modal-footer-left {
display: flex;
gap: 12px;
}
.playlist-modal-footer-right {
display: flex;
gap: 12px;
}
.playlist-modal-btn {
padding: 12px 24px;
border-radius: 10px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
border: none;
min-width: 100px;
}
.playlist-modal-btn-secondary {
background: rgba(255, 255, 255, 0.08);
color: #e0e0e0;
border: 1px solid rgba(255, 255, 255, 0.12);
}
.playlist-modal-btn-secondary:hover {
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
transform: translateY(-1px);
}
.playlist-modal-btn-primary {
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
color: #000000;
font-weight: 700;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3);
}
.playlist-modal-btn-primary:hover {
transform: translateY(-1px);
box-shadow: 0 6px 20px rgba(var(--accent-rgb), 0.4);
}
.playlist-modal-btn-tertiary {
background: #404040;
color: #ffffff;
border: 1px solid #666666;
}
.playlist-modal-btn-tertiary:hover {
background: #505050;
border-color: #777777;
transform: translateY(-1px);
}
.playlist-modal-btn-danger {
background: linear-gradient(135deg, #dc2626, #ef4444);
color: #ffffff;
font-weight: 700;
box-shadow: 0 4px 16px rgba(220, 38, 38, 0.3);
}
.playlist-modal-btn-danger:hover {
background: linear-gradient(135deg, #b91c1c, #dc2626);
transform: translateY(-1px);
box-shadow: 0 6px 20px rgba(220, 38, 38, 0.4);
}
.playlist-modal-btn-warning {
background: linear-gradient(135deg, #f59e0b, #fbbf24);
color: #000000;
font-weight: 700;
box-shadow: 0 4px 16px rgba(245, 158, 11, 0.3);
}
.playlist-modal-btn-warning:hover {
background: linear-gradient(135deg, #d97706, #f59e0b);
transform: translateY(-1px);
box-shadow: 0 6px 20px rgba(245, 158, 11, 0.4);
}
/* Watchlist Modal Styles */
/* Fullscreen modifier for watchlist modal */
.watchlist-fullscreen {
max-width: 95vw;
width: 95vw;
max-height: 95vh;
position: relative;
overflow: hidden;
border-top: 1px solid rgba(255, 255, 255, 0.15);
}
/* Override playlist-modal-body within watchlist to allow grid scrolling */
.watchlist-fullscreen .playlist-modal-body {
overflow-y: auto;
padding: 0;
min-height: 0;
}
/* ── Header polish ─────────────────────────────── */
.watchlist-fullscreen .playlist-header-content h2 {
font-size: 26px;
letter-spacing: -0.3px;
padding-bottom: 12px;
position: relative;
display: flex;
align-items: center;
gap: 10px;
}
.watchlist-fullscreen .playlist-header-content h2::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 48px;
height: 3px;
background: linear-gradient(90deg, rgb(var(--accent-rgb)), transparent);
border-radius: 2px;
}
.watchlist-header-icon {
flex-shrink: 0;
filter: drop-shadow(0 0 8px rgba(var(--accent-rgb), 0.4));
}
.watchlist-fullscreen .playlist-quick-info {
gap: 10px;
}
.watchlist-fullscreen .playlist-track-count,
.watchlist-fullscreen .playlist-owner {
background: rgba(255, 255, 255, 0.05);
padding: 4px 14px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.3px;
}
.watchlist-fullscreen .playlist-track-count {
border: 1px solid rgba(var(--accent-rgb), 0.2);
}
.watchlist-fullscreen .playlist-owner {
border: 1px solid rgba(255, 255, 255, 0.08);
}
/* ── Close button ──────────────────────────────── */
.watchlist-fullscreen .playlist-modal-close {
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: rgba(255, 255, 255, 0.06);
transition: all 0.25s ease;
font-size: 20px;
}
.watchlist-fullscreen .playlist-modal-close:hover {
background: rgba(255, 59, 48, 0.15);
color: #ff6b6b;
transform: rotate(90deg) scale(1.1);
}
/* ── Action buttons ────────────────────────────── */
.watchlist-actions {
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
padding-bottom: 16px !important;
}
.watchlist-actions .playlist-modal-btn {
display: inline-flex;
align-items: center;
gap: 8px;
white-space: nowrap;
}
.watchlist-actions .playlist-modal-btn svg {
flex-shrink: 0;
}
/* Scan button: shimmer on hover */
/* ── Processing Button Animation (rotating border gradient) ── */
.btn-processing {
position: relative !important;
overflow: hidden !important;
color: rgba(255, 255, 255, 0.6) !important;
pointer-events: none;
}
.btn-processing::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
padding: 2px;
background: conic-gradient(
from var(--border-angle, 0deg),
transparent 0%,
rgb(var(--accent-rgb)) 25%,
transparent 50%,
rgb(var(--accent-rgb)) 75%,
transparent 100%
);
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask-composite: exclude;
animation: btn-border-spin 2.5s linear infinite;
pointer-events: none;
}
@keyframes btn-border-spin {
0% { --border-angle: 0deg; }
100% { --border-angle: 360deg; }
}
@property --border-angle {
syntax: '';
initial-value: 0deg;
inherits: false;
}
.watchlist-btn-scan {
position: relative;
overflow: hidden;
}
.watchlist-btn-scan::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.15), transparent);
transform: translateX(-100%);
transition: none;
}
.watchlist-btn-scan:not(:disabled):hover::before {
transform: translateX(100%);
transition: transform 0.6s ease;
}
/* Similar Artists button: discovery blue identity */
.watchlist-btn-similar {
border: 1px solid rgba(99, 179, 237, 0.15) !important;
transition: all 0.25s ease !important;
}
.watchlist-btn-similar:not(:disabled):hover {
background: rgba(99, 179, 237, 0.1) !important;
border-color: rgba(99, 179, 237, 0.35) !important;
color: #90cdf4 !important;
box-shadow: 0 0 20px rgba(99, 179, 237, 0.08);
}
/* Settings button: subtle warm */
.watchlist-btn-settings {
transition: all 0.25s ease !important;
}
.watchlist-btn-settings:hover {
background: rgba(255, 255, 255, 0.1) !important;
}
/* ── Search bar ────────────────────────────────── */
.watchlist-search-container {
padding: 0 32px;
position: relative;
}
.watchlist-search-icon {
position: absolute;
left: 48px;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
transition: fill 0.2s ease;
z-index: 1;
}
.watchlist-search-container:focus-within .watchlist-search-icon {
fill: rgb(var(--accent-rgb));
}
/* Card grid */
.watchlist-artists-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 24px;
padding: 24px 32px 32px;
}
/* ── Artist cards ──────────────────────────────── */
.watchlist-artist-card {
position: relative;
border-radius: 16px;
overflow: hidden;
cursor: pointer;
background: rgba(18, 18, 18, 1);
border: 1px solid rgba(255, 255, 255, 0.06);
transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
contain: layout style paint;
will-change: transform;
}
.watchlist-artist-card:hover {
transform: translateY(-4px);
border-color: rgba(var(--accent-rgb), 0.25);
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);
}
.watchlist-artist-card:active {
transform: translateY(-2px);
}
/* Image container with gradient fade */
.watchlist-card-image {
position: relative;
width: 100%;
aspect-ratio: 1;
overflow: hidden;
background: linear-gradient(135deg,
rgba(30, 30, 30, 1) 0%,
rgba(20, 20, 20, 1) 100%);
}
.watchlist-card-image::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 55%;
background: linear-gradient(to top, rgba(18, 18, 18, 1) 0%, rgba(18, 18, 18, 0.5) 45%, transparent 100%);
pointer-events: none;
z-index: 1;
}
.watchlist-card-image img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
transition: transform 0.3s ease;
}
.watchlist-artist-card:hover .watchlist-card-image img {
transform: scale(1.05);
filter: brightness(1.1);
}
/* Image fallback */
.watchlist-card-image-fallback {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 56px;
color: rgba(255, 255, 255, 0.3);
}
/* Info overlapping the gradient fade */
.watchlist-card-info {
position: relative;
z-index: 2;
margin-top: -36px;
padding: 0 16px 8px;
display: flex;
flex-direction: column;
gap: 3px;
background: transparent;
}
.watchlist-card-name {
font-size: 15px;
font-weight: 700;
color: #ffffff;
line-height: 1.25;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: color 0.25s ease;
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.5);
}
.watchlist-artist-card:hover .watchlist-card-name {
color: rgb(var(--accent-light-rgb));
}
.watchlist-card-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
font-weight: 500;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}
/* Card release-type pills */
.watchlist-card-sources {
position: relative;
z-index: 2;
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 2px 16px 4px;
}
.watchlist-source-badge {
font-size: 8px;
font-weight: 700;
text-transform: uppercase;
padding: 2px 6px;
border-radius: 3px;
letter-spacing: 0.4px;
line-height: 1.3;
}
.watchlist-source-spotify {
background: rgba(30, 215, 96, 0.15);
color: #1ed760;
}
.watchlist-source-itunes {
background: rgba(252, 60, 68, 0.15);
color: #fc3c44;
}
.watchlist-source-deezer {
background: rgba(162, 101, 230, 0.15);
color: #a265e6;
}
.watchlist-card-pills {
position: relative;
z-index: 2;
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 4px 16px 12px;
}
.watchlist-pill {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
padding: 3px 8px;
border-radius: 20px;
line-height: 1.3;
letter-spacing: 0.5px;
transition: transform 0.15s ease;
}
.watchlist-pill:hover {
transform: scale(1.08);
}
.watchlist-pill-active {
background: rgba(var(--accent-rgb), 0.18);
color: rgb(var(--accent-light-rgb));
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.12);
}
.watchlist-pill-filter {
background: rgba(255, 152, 0, 0.15);
color: #ffb74d;
box-shadow: 0 0 8px rgba(255, 152, 0, 0.08);
}
/* Checkbox — top-left, hidden until hover or checked */
.watchlist-card-checkbox {
position: absolute;
top: 10px;
left: 10px;
z-index: 3;
opacity: 0;
transition: opacity 0.15s ease;
cursor: pointer;
margin: 0;
display: flex;
align-items: center;
justify-content: center;
}
.watchlist-card-checkbox input[type="checkbox"] {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.watchlist-card-checkbox input:checked+.watchlist-checkbox-custom {
background: rgba(var(--accent-rgb), 0.3);
border-color: rgb(var(--accent-rgb));
}
.watchlist-card-checkbox input:checked+.watchlist-checkbox-custom::after {
content: '✓';
color: rgb(var(--accent-rgb));
font-size: 13px;
font-weight: 700;
}
.watchlist-artist-card:hover .watchlist-card-checkbox,
.watchlist-card-checkbox:has(input:checked) {
opacity: 1;
}
/* Remove × button — top-right, visible on hover */
.watchlist-card-remove {
position: absolute;
top: 10px;
right: 10px;
z-index: 3;
opacity: 0;
transition: opacity 0.2s ease, background 0.2s ease;
width: 30px;
height: 30px;
border-radius: 50%;
border: none;
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(8px);
color: rgba(255, 255, 255, 0.7);
font-size: 18px;
line-height: 1;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.watchlist-artist-card:hover .watchlist-card-remove {
opacity: 1;
}
.watchlist-card-remove:hover {
background: rgba(255, 59, 48, 0.7);
color: #ffffff;
}
/* Gear icon — top-right, visible on hover */
.watchlist-card-gear {
position: absolute;
top: 10px;
right: 10px;
z-index: 3;
opacity: 0;
transition: opacity 0.2s ease, background 0.2s ease, transform 0.3s ease;
width: 30px;
height: 30px;
border-radius: 50%;
border: none;
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(8px);
color: rgba(255, 255, 255, 0.7);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
padding: 0;
}
.watchlist-artist-card:hover .watchlist-card-gear {
opacity: 1;
}
.watchlist-card-gear:hover {
background: rgba(var(--accent-rgb), 0.7);
color: #ffffff;
transform: rotate(45deg);
}
.watchlist-card-gear svg {
width: 16px;
height: 16px;
fill: currentColor;
}
/* Watchlist Artist Detail Overlay */
.watchlist-artist-detail-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(18, 18, 18, 0.98);
z-index: 10;
transform: translateX(100%);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
overflow-y: auto;
}
.watchlist-artist-detail-overlay.visible {
transform: translateX(0);
}
/* Banner at top of detail view */
.watchlist-detail-banner {
position: relative;
width: 100%;
}
.watchlist-detail-banner img {
width: 100%;
height: auto;
display: block;
}
.watchlist-detail-banner-fade {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 80px;
background: linear-gradient(to bottom, transparent, rgba(18, 18, 18, 0.98));
}
.watchlist-detail-content {
padding: 32px;
max-width: 640px;
margin: 0 auto;
}
.watchlist-detail-content.has-banner {
padding-top: 16px;
}
/* Bio text */
.watchlist-detail-bio {
font-size: 13px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.6);
margin: 0;
display: -webkit-box;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Watchlist info row */
.watchlist-detail-watchlist-info {
display: flex;
align-items: center;
gap: 8px;
}
.watchlist-detail-info-sep {
color: rgba(255, 255, 255, 0.3);
font-size: 11px;
}
/* Recent releases grid */
.watchlist-detail-releases {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 10px;
}
.watchlist-detail-release {
display: flex;
align-items: center;
gap: 10px;
padding: 8px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.04);
transition: background 0.15s ease;
}
.watchlist-detail-release:hover {
background: rgba(255, 255, 255, 0.08);
}
.watchlist-detail-release img {
width: 48px;
height: 48px;
border-radius: 4px;
object-fit: cover;
flex-shrink: 0;
}
.watchlist-detail-release-info {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.watchlist-detail-release-name {
font-size: 13px;
font-weight: 600;
color: #ffffff;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.watchlist-detail-release-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
}
.watchlist-detail-back {
display: inline-flex;
align-items: center;
gap: 8px;
background: none;
border: none;
color: rgba(255, 255, 255, 0.7);
font-size: 14px;
cursor: pointer;
padding: 8px 0;
margin-bottom: 24px;
transition: color 0.15s ease;
}
.watchlist-detail-back:hover {
color: rgb(var(--accent-rgb));
}
.watchlist-detail-hero {
display: flex;
align-items: center;
gap: 24px;
margin-bottom: 32px;
}
.watchlist-detail-hero img {
width: 120px;
height: 120px;
border-radius: 50%;
object-fit: cover;
border: 3px solid rgba(var(--accent-rgb), 0.3);
background: #1a1a1a;
flex-shrink: 0;
}
.watchlist-detail-hero-info {
display: flex;
flex-direction: column;
gap: 8px;
min-width: 0;
}
.watchlist-detail-hero-name {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin: 0;
line-height: 1.2;
}
.watchlist-detail-hero-stats {
display: flex;
gap: 20px;
}
.watchlist-detail-stat {
display: flex;
flex-direction: column;
gap: 2px;
}
.watchlist-detail-stat-value {
font-size: 16px;
font-weight: 700;
color: rgb(var(--accent-rgb));
}
.watchlist-detail-stat-label {
font-size: 10px;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.4);
font-weight: 600;
letter-spacing: 0.5px;
}
.watchlist-detail-hero-genres {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 4px;
}
.watchlist-detail-genre-tag {
font-size: 10px;
padding: 3px 8px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.6);
text-transform: capitalize;
}
.watchlist-detail-section {
margin-bottom: 24px;
}
.watchlist-detail-section-title {
font-size: 11px;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.4);
font-weight: 600;
letter-spacing: 0.5px;
margin-bottom: 12px;
}
.watchlist-detail-actions {
display: flex;
gap: 12px;
margin-top: 32px;
}
.watchlist-detail-actions button {
flex: 1;
padding: 12px 20px;
border-radius: 8px;
border: none;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease, transform 0.1s ease;
}
.watchlist-detail-actions button:active {
transform: scale(0.98);
}
.watchlist-detail-discog-btn {
background: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-rgb));
font-weight: 600;
}
.watchlist-detail-discog-btn:hover {
background: rgba(var(--accent-rgb), 0.35);
}
.watchlist-detail-settings-btn {
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.7);
}
.watchlist-detail-settings-btn:hover {
background: rgba(255, 255, 255, 0.12);
}
.watchlist-detail-remove-btn {
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.7);
}
.watchlist-detail-remove-btn:hover {
background: rgba(255, 59, 48, 0.2);
color: #ff3b30;
}
/* Live activity classes (replaces inline styles) */
.watchlist-live-activity {
display: flex;
gap: 18px;
margin-top: 15px;
padding: 16px 20px;
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
border: 1px solid rgba(var(--accent-rgb), 0.15);
backdrop-filter: blur(8px);
justify-content: center;
align-items: flex-start;
}
.watchlist-live-activity-col {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.watchlist-live-activity-artist-img {
width: 80px;
height: 80px;
border-radius: 50%;
border: 2px solid rgb(var(--accent-rgb));
box-shadow: 0 0 16px rgba(var(--accent-rgb), 0.25);
object-fit: cover;
background: #1a1a1a;
}
.watchlist-live-activity-album-img {
width: 80px;
height: 80px;
border-radius: 8px;
border: 2px solid #ffc107;
box-shadow: 0 0 16px rgba(255, 193, 7, 0.2);
object-fit: cover;
background: #1a1a1a;
}
.watchlist-live-activity-label {
font-size: 11px;
font-weight: bold;
color: #fff;
text-align: center;
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.watchlist-live-activity-feed {
display: flex;
flex-direction: column;
gap: 6px;
min-width: 250px;
max-width: 300px;
}
.watchlist-live-activity-feed-label {
font-size: 10px;
color: #b3b3b3;
text-transform: uppercase;
}
.watchlist-live-activity-feed-label-orange {
font-size: 10px;
color: #ff9800;
text-transform: uppercase;
}
.watchlist-live-activity-track {
font-size: 11px;
font-weight: bold;
color: rgb(var(--accent-light-rgb));
margin-bottom: 8px;
}
.watchlist-live-addition-item {
display: flex;
gap: 6px;
align-items: center;
padding: 3px;
background: #1a1a1a;
border-radius: 4px;
}
.watchlist-live-addition-item img {
width: 24px;
height: 24px;
border-radius: 3px;
object-fit: cover;
}
.watchlist-live-addition-item-info {
flex: 1;
overflow: hidden;
}
.watchlist-live-addition-item-track {
font-weight: bold;
font-size: 10px;
color: rgb(var(--accent-light-rgb));
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.watchlist-live-addition-item-artist {
font-size: 9px;
color: #b3b3b3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.watchlist-live-addition-empty {
color: #666;
font-size: 10px;
}
.watchlist-scan-completion {
text-align: center;
padding: 15px;
background: #2a2a2a;
border-radius: 8px;
border: 1px solid #444;
}
.watchlist-scan-completion-message {
font-size: 14px;
color: rgb(var(--accent-light-rgb));
margin-bottom: 10px;
}
/* Watchlist Search */
.watchlist-search-input {
width: 100%;
padding: 12px 16px 12px 40px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
color: #ffffff;
font-size: 14px;
font-family: inherit;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.watchlist-search-input:focus {
outline: none;
background: rgba(255, 255, 255, 0.08);
border-color: rgba(var(--accent-rgb), 0.4);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1);
}
.watchlist-search-input::placeholder {
color: rgba(255, 255, 255, 0.4);
}
/* Watchlist & Wishlist Batch Action Bar */
.watchlist-batch-bar,
.wishlist-batch-bar {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 20px;
margin: 0 32px 12px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
}
.watchlist-select-all-label {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
color: rgba(255, 255, 255, 0.6);
cursor: pointer;
user-select: none;
}
.watchlist-select-all-label input[type="checkbox"] {
cursor: pointer;
}
@keyframes batchBarSlideIn {
from {
opacity: 0;
transform: translateY(-8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.watchlist-batch-count,
.wishlist-batch-count {
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.8);
}
.watchlist-batch-remove-btn,
.wishlist-batch-remove-btn {
border-color: rgba(255, 59, 48, 0.4) !important;
color: #ff6b6b !important;
}
.watchlist-batch-remove-btn:hover,
.wishlist-batch-remove-btn:hover {
background: rgba(255, 59, 48, 0.2) !important;
border-color: rgba(255, 59, 48, 0.6) !important;
}
/* Watchlist & Wishlist Checkbox */
.watchlist-checkbox-wrapper,
.wishlist-checkbox-wrapper {
position: relative;
display: flex;
align-items: center;
justify-content: center;
margin-right: 12px;
flex-shrink: 0;
cursor: pointer;
}
.watchlist-checkbox-wrapper input[type="checkbox"],
.wishlist-checkbox-wrapper input[type="checkbox"] {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.watchlist-checkbox-custom,
.wishlist-checkbox-custom {
width: 20px;
height: 20px;
border: 2px solid rgba(255, 255, 255, 0.2);
border-radius: 4px;
background: rgba(255, 255, 255, 0.03);
transition: all 0.15s ease;
display: flex;
align-items: center;
justify-content: center;
}
.watchlist-checkbox-wrapper:hover .watchlist-checkbox-custom,
.wishlist-checkbox-wrapper:hover .wishlist-checkbox-custom {
border-color: rgba(255, 255, 255, 0.4);
background: rgba(255, 255, 255, 0.06);
}
.watchlist-checkbox-wrapper input:checked+.watchlist-checkbox-custom,
.wishlist-checkbox-wrapper input:checked+.wishlist-checkbox-custom {
background: rgba(var(--accent-rgb), 0.3);
border-color: rgb(var(--accent-rgb));
}
.watchlist-checkbox-wrapper input:checked+.watchlist-checkbox-custom::after,
.wishlist-checkbox-wrapper input:checked+.wishlist-checkbox-custom::after {
content: '✓';
color: rgb(var(--accent-rgb));
font-size: 13px;
font-weight: 700;
}
/* ===== WISHLIST OVERVIEW MODAL STYLES ===== */
/* Category Grid */
.wishlist-category-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20px;
padding: 28px;
}
/* Category Card */
.wishlist-category-card {
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
padding: 32px 24px;
text-align: center;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
min-height: 250px;
display: flex;
align-items: center;
justify-content: center;
}
/* Mosaic Background with Scrolling Rows */
.wishlist-mosaic-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
z-index: 0;
}
.wishlist-mosaic-row-wrapper {
flex: 1;
overflow: hidden;
position: relative;
}
.wishlist-mosaic-row {
display: flex;
width: fit-content;
height: 100%;
opacity: 0;
animation: fadeInRow 1s ease-out forwards, infiniteScroll var(--speed, 30s) linear infinite;
will-change: transform;
}
.wishlist-mosaic-row.scroll-right {
animation-direction: normal, reverse;
}
.wishlist-mosaic-tile {
width: 80px;
height: 100%;
flex-shrink: 0;
overflow: hidden;
}
.wishlist-mosaic-image {
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
transition: transform 0.5s ease;
}
/* Fallback gradient for small collections */
.wishlist-mosaic-fallback {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.35) 0%,
rgba(138, 43, 226, 0.35) 50%,
rgba(255, 20, 147, 0.35) 100%);
background-size: 200% 200%;
animation: gradientShift 8s ease infinite;
z-index: 0;
opacity: 0;
animation: fadeInRow 1s ease-out forwards, gradientShift 8s ease infinite;
}
@keyframes gradientShift {
0%,
100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
}
/* Overlay for text readability */
.wishlist-mosaic-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.85) 0%,
rgba(0, 0, 0, 0.75) 100%);
z-index: 1;
pointer-events: none;
}
/* Content layer above mosaic */
.wishlist-category-content {
position: relative;
z-index: 2;
width: 100%;
}
/* Fade in rows initially */
@keyframes fadeInRow {
0% {
opacity: 0;
}
100% {
opacity: 0.7;
}
}
/* Infinite scrolling animation */
/* Content is duplicated 2x, animation moves by -50% (one set) for seamless loop */
@keyframes infiniteScroll {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
.wishlist-category-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
opacity: 0;
transition: opacity 0.3s ease;
}
.wishlist-category-card:hover::before {
opacity: 1;
}
.wishlist-category-card:hover {
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(var(--accent-rgb), 0.2);
}
.wishlist-category-card:hover .wishlist-mosaic-image {
transform: scale(1.1);
}
.wishlist-category-card:hover .wishlist-mosaic-overlay {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(0, 0, 0, 0.8) 100%);
}
.wishlist-category-card.next-in-queue {
border-color: rgba(var(--accent-rgb), 0.4);
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.08) 0%,
rgba(18, 18, 18, 0.98) 100%);
}
.wishlist-category-icon {
font-size: 48px;
margin-bottom: 16px;
filter: drop-shadow(0 4px 12px rgba(var(--accent-rgb), 0.3));
}
.wishlist-category-title {
font-size: 20px;
font-weight: 600;
color: #ffffff;
margin-bottom: 8px;
}
.wishlist-category-count {
font-size: 32px;
font-weight: 700;
color: rgb(var(--accent-light-rgb));
margin: 12px 0;
}
.wishlist-category-badge {
display: inline-block;
background: rgba(var(--accent-rgb), 0.2);
border: 1px solid rgba(var(--accent-rgb), 0.4);
color: rgb(var(--accent-light-rgb));
font-size: 12px;
font-weight: 600;
padding: 6px 12px;
border-radius: 20px;
margin-top: 12px;
}
/* Category Tracks View */
.wishlist-category-tracks {
padding: 0 28px;
display: flex;
flex-direction: column;
height: 100%;
}
.wishlist-category-header {
display: flex;
align-items: center;
gap: 16px;
padding: 16px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
margin-bottom: 16px;
}
.wishlist-back-btn {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
color: #e0e0e0;
padding: 8px 16px;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.wishlist-back-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
transform: translateX(-2px);
}
.wishlist-category-name {
font-size: 18px;
font-weight: 600;
color: #ffffff;
flex: 1;
}
.wishlist-select-all-btn {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.15);
color: #e0e0e0;
padding: 6px 14px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.wishlist-select-all-btn:hover {
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.4);
color: rgb(var(--accent-rgb));
}
.wishlist-batch-bar {
margin: 0 0 12px;
}
.loading-indicator {
text-align: center;
padding: 60px 20px;
color: #b3b3b3;
font-size: 16px;
}
.empty-state {
text-align: center;
padding: 60px 20px;
color: #b3b3b3;
font-size: 16px;
}
.playlist-tracks-scroll {
flex: 1;
overflow-y: auto;
max-height: 600px;
padding-right: 8px;
}
.playlist-tracks-scroll::-webkit-scrollbar {
width: 8px;
}
.playlist-tracks-scroll::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.playlist-tracks-scroll::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.4);
border-radius: 4px;
}
.playlist-tracks-scroll::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.6);
}
/* Album Grouping Cards */
.wishlist-album-grid {
display: flex;
flex-direction: column;
gap: 12px;
padding: 8px 0;
}
.wishlist-album-card {
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
overflow: hidden;
transition: all 0.3s ease;
cursor: pointer;
}
.wishlist-album-card:hover {
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.15);
}
.wishlist-album-header {
display: flex;
align-items: center;
padding: 16px;
gap: 16px;
}
.wishlist-album-image {
width: 64px;
height: 64px;
background-size: cover;
background-position: center;
background-color: rgba(255, 255, 255, 0.05);
border-radius: 8px;
flex-shrink: 0;
}
.wishlist-album-info {
flex: 1;
min-width: 0;
}
.wishlist-album-name {
font-size: 16px;
font-weight: 600;
color: #ffffff;
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wishlist-album-artist {
font-size: 14px;
color: #b3b3b3;
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wishlist-album-track-count {
font-size: 12px;
color: rgb(var(--accent-rgb));
font-weight: 500;
}
.wishlist-album-expand-icon {
font-size: 14px;
color: #b3b3b3;
transition: transform 0.3s ease;
flex-shrink: 0;
}
.wishlist-album-tracks {
border-top: 1px solid rgba(255, 255, 255, 0.05);
padding: 0;
background: rgba(0, 0, 0, 0.2);
}
.wishlist-album-track {
padding: 12px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
transition: background 0.2s ease;
}
.wishlist-album-track:last-child {
border-bottom: none;
}
.wishlist-album-track:hover {
background: rgba(var(--accent-rgb), 0.05);
}
.wishlist-album-track-name {
font-size: 14px;
color: #e0e0e0;
}
/* Singles Track Items with Images */
.playlist-track-item-with-image {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
border-radius: 8px;
transition: background 0.2s ease;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
}
.playlist-track-item-with-image:hover {
background: rgba(var(--accent-rgb), 0.05);
}
.playlist-track-image {
width: 48px;
height: 48px;
background-size: cover;
background-position: center;
background-color: rgba(255, 255, 255, 0.05);
border-radius: 6px;
flex-shrink: 0;
}
/* Wishlist Delete Buttons */
.wishlist-track-item {
position: relative;
}
.wishlist-delete-btn {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
background: rgba(220, 53, 69, 0.9);
border: none;
border-radius: 6px;
padding: 8px 12px;
font-size: 16px;
cursor: pointer;
transition: all 0.2s ease;
opacity: 0;
pointer-events: none;
z-index: 10;
}
.wishlist-track-item:hover .wishlist-delete-btn {
opacity: 1;
pointer-events: all;
}
.wishlist-delete-btn:hover {
background: rgba(220, 53, 69, 1);
transform: translateY(-50%) scale(1.1);
}
.wishlist-delete-btn:active {
transform: translateY(-50%) scale(0.95);
}
/* Smaller delete button for tracks within albums */
.wishlist-delete-btn-small {
padding: 6px 10px;
font-size: 14px;
}
/* Album header delete button */
.wishlist-album-header {
position: relative;
}
.wishlist-delete-album-btn {
position: absolute;
right: 40px;
top: 50%;
transform: translateY(-50%);
background: rgba(220, 53, 69, 0.9);
border: none;
border-radius: 6px;
padding: 8px 12px;
font-size: 16px;
cursor: pointer;
transition: all 0.2s ease;
opacity: 0;
pointer-events: none;
z-index: 10;
}
.wishlist-album-card:hover .wishlist-delete-album-btn {
opacity: 1;
pointer-events: all;
}
.wishlist-delete-album-btn:hover {
background: rgba(220, 53, 69, 1);
transform: translateY(-50%) scale(1.1);
}
.wishlist-delete-album-btn:active {
transform: translateY(-50%) scale(0.95);
}
/* Ensure album track items have proper positioning for delete button */
.wishlist-album-track.wishlist-track-item {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
}
.wishlist-album-track.wishlist-track-item .wishlist-album-track-name {
flex: 1;
}
/* Confirmation Modal - Higher z-index to show above wishlist modal */
.confirmation-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(8px);
z-index: 200000;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease;
}
.confirmation-modal-overlay.show {
opacity: 1;
pointer-events: all;
}
.confirmation-modal {
background: #1a1a1a;
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 12px;
padding: 32px;
max-width: 400px;
width: 90%;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6);
transform: scale(0.9);
transition: transform 0.2s ease;
}
.confirmation-modal-overlay.show .confirmation-modal {
transform: scale(1);
}
.confirmation-modal-icon {
font-size: 48px;
text-align: center;
margin-bottom: 16px;
}
.confirmation-modal-title {
font-size: 20px;
font-weight: 600;
color: #ffffff;
text-align: center;
margin-bottom: 12px;
}
.confirmation-modal-message {
font-size: 14px;
color: #b3b3b3;
text-align: center;
margin-bottom: 24px;
line-height: 1.5;
}
.confirmation-modal-buttons {
display: flex;
gap: 12px;
justify-content: center;
}
.confirmation-modal-btn {
padding: 12px 32px;
border-radius: 8px;
border: none;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
min-width: 100px;
}
.confirmation-modal-btn-cancel {
background: rgba(255, 255, 255, 0.1);
color: #ffffff;
}
.confirmation-modal-btn-cancel:hover {
background: rgba(255, 255, 255, 0.15);
}
.confirmation-modal-btn-confirm {
background: #dc3545;
color: #ffffff;
}
.confirmation-modal-btn-confirm:hover {
background: #c82333;
transform: scale(1.05);
}
.confirmation-modal-btn:active {
transform: scale(0.95);
}
/* Mobile Responsive */
@media (max-width: 768px) {
.wishlist-category-grid {
grid-template-columns: 1fr;
gap: 16px;
padding: 20px;
}
.wishlist-category-card {
padding: 24px 20px;
min-height: 200px;
}
.wishlist-mosaic-tile {
width: 60px;
/* Smaller tiles on mobile */
}
.wishlist-category-icon {
font-size: 36px;
}
.wishlist-category-title {
font-size: 18px;
}
.wishlist-category-count {
font-size: 28px;
}
}
.watchlist-artist-info {
display: flex;
flex-direction: column;
gap: 4px;
flex: 1;
}
.watchlist-artist-name {
font-size: 16px;
font-weight: 600;
color: #ffffff;
margin-bottom: 4px;
}
.watchlist-artist-date {
font-size: 13px;
color: rgba(255, 255, 255, 0.6);
font-weight: 400;
}
.watchlist-artist-scan {
font-size: 12px;
color: rgba(var(--accent-rgb), 0.7);
font-weight: 500;
}
.watchlist-actions {
display: flex;
gap: 12px;
align-items: center;
justify-content: center;
padding: 20px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
/* ===== WATCHLIST ARTIST CONFIG MODAL STYLES ===== */
#watchlist-artist-config-modal-overlay {
z-index: 11000;
/* Higher than default modal-overlay to appear on top of watchlist modal */
}
.watchlist-artist-config-modal {
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.98) 0%,
rgba(18, 18, 18, 0.98) 100%);
border-radius: 24px;
box-shadow: 0 25px 80px rgba(0, 0, 0, 0.6);
max-width: 580px;
width: 90%;
max-height: 90vh;
overflow: hidden;
display: flex;
flex-direction: column;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.watchlist-artist-config-header {
position: relative;
background: linear-gradient(180deg,
rgba(var(--accent-rgb), 0.15) 0%,
rgba(var(--accent-rgb), 0.05) 50%,
transparent 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.watchlist-artist-config-hero {
padding: 32px 28px;
display: flex;
align-items: center;
gap: 24px;
}
.watchlist-artist-config-hero-image {
width: 100px;
height: 100px;
border-radius: 50%;
object-fit: cover;
border: 3px solid rgba(var(--accent-rgb), 0.3);
box-shadow: 0 8px 24px rgba(var(--accent-rgb), 0.2);
flex-shrink: 0;
}
.watchlist-artist-config-hero-info {
flex: 1;
min-width: 0;
}
.watchlist-artist-config-hero-name {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
.watchlist-artist-config-hero-stats {
display: flex;
gap: 20px;
margin-top: 12px;
flex-wrap: wrap;
}
.watchlist-artist-config-stat {
display: flex;
flex-direction: column;
gap: 2px;
}
.watchlist-artist-config-stat-value {
font-size: 18px;
font-weight: 600;
color: rgba(var(--accent-rgb), 1);
}
.watchlist-artist-config-stat-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.watchlist-artist-config-hero-genres {
margin-top: 12px;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.watchlist-artist-config-genre-tag {
padding: 4px 12px;
background: rgba(var(--accent-rgb), 0.15);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 12px;
font-size: 12px;
color: rgba(var(--accent-rgb), 1);
font-weight: 500;
}
.watchlist-artist-config-close {
position: absolute;
top: 20px;
right: 20px;
font-size: 32px;
color: rgba(255, 255, 255, 0.6);
cursor: pointer;
transition: all 0.2s ease;
line-height: 1;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
}
.watchlist-artist-config-close:hover {
color: #ffffff;
background: rgba(255, 59, 48, 0.2);
transform: scale(1.1);
}
.watchlist-artist-config-content {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.watchlist-artist-config-body {
padding: 28px;
flex: 1;
}
.config-section {
margin-bottom: 24px;
}
.config-section-title {
font-size: 20px;
font-weight: 600;
color: #ffffff;
margin-bottom: 8px;
}
.config-section-subtitle {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 24px;
}
.config-options {
display: flex;
flex-direction: column;
gap: 16px;
}
.config-option {
display: flex;
align-items: center;
padding: 20px;
background: rgba(255, 255, 255, 0.03);
border: 2px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
}
.config-option:hover {
background: rgba(255, 255, 255, 0.05);
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateY(-2px);
}
.config-option input[type="checkbox"] {
width: 24px;
height: 24px;
margin-right: 16px;
cursor: pointer;
accent-color: rgb(var(--accent-rgb));
flex-shrink: 0;
}
.config-option-content {
display: flex;
align-items: center;
flex: 1;
gap: 16px;
}
.config-option-icon {
font-size: 32px;
flex-shrink: 0;
}
.config-option-text {
display: flex;
flex-direction: column;
gap: 4px;
}
.config-option-title {
font-size: 16px;
font-weight: 600;
color: #ffffff;
}
.config-option-description {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
}
.config-option input[type="checkbox"]:checked+.config-option-content {
opacity: 1;
}
.config-option input[type="checkbox"]:not(:checked)+.config-option-content {
opacity: 0.5;
}
.config-exclude-terms-container {
padding: 4px 0;
}
.config-exclude-terms-input {
width: 100%;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 10px;
color: #fff;
font-size: 14px;
font-family: inherit;
outline: none;
transition: border-color 0.2s ease, background 0.2s ease;
box-sizing: border-box;
}
.config-exclude-terms-input:focus {
border-color: rgba(var(--accent-rgb), 0.5);
background: rgba(255, 255, 255, 0.08);
}
.config-exclude-terms-input::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.config-exclude-terms-hint {
margin: 8px 0 0;
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
line-height: 1.4;
}
.watchlist-artist-config-footer {
padding: 20px 28px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(0, 0, 0, 0.2);
}
.config-modal-actions {
display: flex;
gap: 12px;
justify-content: flex-end;
}
.config-modal-btn {
padding: 12px 28px;
border-radius: 12px;
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
border: none;
outline: none;
}
.config-modal-btn-primary {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)), rgb(var(--accent-rgb)));
color: #000;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3);
}
.config-modal-btn-primary:hover {
background: linear-gradient(135deg, #1fdf64, rgb(var(--accent-light-rgb)));
box-shadow: 0 6px 20px rgba(var(--accent-rgb), 0.4);
transform: translateY(-1px);
}
.config-modal-btn-primary:active {
transform: translateY(0);
}
.config-modal-btn-primary:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.config-modal-btn-secondary {
background: rgba(255, 255, 255, 0.08);
color: #ffffff;
border: 1px solid rgba(255, 255, 255, 0.15);
}
.config-modal-btn-secondary:hover {
background: rgba(255, 255, 255, 0.12);
border-color: rgba(255, 255, 255, 0.25);
}
/* Linked Provider Artist */
.watchlist-linked-artist-card {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
}
.watchlist-linked-artist-img {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
}
.watchlist-linked-artist-img-placeholder {
width: 48px;
height: 48px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
flex-shrink: 0;
}
.watchlist-linked-artist-info {
flex: 1;
min-width: 0;
}
.watchlist-linked-artist-name {
font-size: 14px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.watchlist-linked-artist-providers {
display: flex;
gap: 6px;
margin-top: 4px;
}
.watchlist-provider-badge {
padding: 2px 8px;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.watchlist-provider-badge.spotify {
background: rgba(30, 215, 96, 0.15);
color: #1ed760;
border: 1px solid rgba(30, 215, 96, 0.3);
}
.watchlist-provider-badge.itunes {
background: rgba(252, 60, 68, 0.15);
color: #fc3c44;
border: 1px solid rgba(252, 60, 68, 0.3);
}
.watchlist-provider-badge.deezer {
background: rgba(162, 56, 255, 0.15);
color: #a238ff;
border: 1px solid rgba(162, 56, 255, 0.3);
}
.watchlist-linked-mismatch-warning {
margin-top: 6px;
font-size: 12px;
color: #ffc107;
line-height: 1.3;
}
.watchlist-linked-mismatch-warning strong {
color: #fff;
}
.watchlist-linked-change-btn {
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
color: #ccc;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.15);
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.watchlist-linked-change-btn:hover {
background: rgba(var(--accent-rgb), 0.15);
color: #fff;
border-color: rgba(var(--accent-rgb), 0.3);
}
/* Linked Provider Search */
.watchlist-linked-search {
margin-top: 12px;
}
.watchlist-linked-search-input-row {
display: flex;
gap: 8px;
}
.watchlist-linked-search-input {
flex: 1;
padding: 10px 14px;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.15);
background: rgba(255, 255, 255, 0.06);
color: #fff;
font-size: 13px;
outline: none;
font-family: inherit;
}
.watchlist-linked-search-input:focus {
border-color: rgba(var(--accent-rgb), 0.5);
}
.watchlist-linked-search-btn {
padding: 10px 16px;
border-radius: 10px;
border: none;
background: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-rgb));
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.watchlist-linked-search-btn:hover {
background: rgba(var(--accent-rgb), 0.3);
}
.watchlist-linked-search-results {
margin-top: 8px;
max-height: 260px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 4px;
}
.watchlist-linked-search-result {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
transition: background 0.15s;
}
.watchlist-linked-search-result:hover {
background: rgba(255, 255, 255, 0.07);
}
.watchlist-linked-result-img {
width: 36px;
height: 36px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
}
.watchlist-linked-result-img-placeholder {
width: 36px;
height: 36px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
flex-shrink: 0;
}
.watchlist-linked-result-info {
flex: 1;
min-width: 0;
}
.watchlist-linked-result-name {
font-size: 13px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.watchlist-linked-result-meta {
font-size: 11px;
color: #888;
margin-top: 2px;
}
.watchlist-linked-select-btn {
padding: 5px 12px;
border-radius: 6px;
border: none;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
flex-shrink: 0;
}
.watchlist-linked-select-btn:hover {
background: rgba(var(--accent-rgb), 0.3);
}
/* Mobile Responsive */
@media (max-width: 640px) {
.watchlist-artist-config-modal {
width: 95%;
max-width: none;
}
.watchlist-artist-config-hero {
flex-direction: column;
text-align: center;
padding: 24px 20px;
}
.watchlist-artist-config-hero-stats {
justify-content: center;
}
.config-modal-actions {
flex-direction: column-reverse;
}
.config-modal-btn {
width: 100%;
}
}
/* Watchlist Global Settings */
#watchlist-global-config-modal-overlay {
z-index: 11000;
}
.global-override-toggle {
border: 2px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 16px;
transition: border-color 0.3s;
}
.include-everything-option {
border: 1px dashed rgba(255, 152, 0, 0.4);
border-radius: 12px;
padding: 12px;
}
.watchlist-global-settings-active {
background: rgba(255, 152, 0, 0.2) !important;
border-color: rgba(255, 152, 0, 0.4) !important;
color: #ff9800 !important;
}
.watchlist-global-override-banner {
background: rgba(255, 152, 0, 0.15);
border: 1px solid rgba(255, 152, 0, 0.3);
border-radius: 8px;
padding: 10px 16px;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: #ff9800;
animation: fadeIn 0.3s ease;
}
/* Add these styles to the end of style.css */
.sync-progress-indicator {
margin-top: 10px;
display: none;
/* Hidden by default */
}
.progress-bar-sync {
height: 8px;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 4px;
overflow: hidden;
}
.progress-fill-sync {
height: 100%;
background-color: rgb(var(--accent-light-rgb));
width: 0%;
border-radius: 4px;
transition: width 0.5s ease-in-out;
}
.progress-text-sync {
font-size: 11px;
color: #b3b3b3;
text-align: center;
margin-top: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
line-height: 1.2;
}
/* Modal sync status display (matches GUI) */
.playlist-modal-sync-status {
background: rgba(var(--accent-rgb), 0.1);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 12px;
padding: 8px 12px;
margin-top: 8px;
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
font-weight: 500;
}
.sync-stat.total-tracks {
color: #ffa500;
}
.sync-stat.matched-tracks {
color: rgb(var(--accent-rgb));
}
.sync-stat.failed-tracks {
color: #e22134;
}
.sync-stat.percentage {
color: rgb(var(--accent-rgb));
font-weight: 700;
}
.sync-separator {
color: #666666;
}
/* Playlist card sync status display */
.playlist-card-sync-status {
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.2);
border-radius: 8px;
padding: 4px 8px;
margin-bottom: 6px;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-size: 11px;
font-weight: 500;
}
/* ==============================================
DOWNLOAD MISSING TRACKS MODAL STYLES
============================================== */
#download-missing-modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(18, 18, 18, 0.85);
backdrop-filter: blur(12px);
z-index: 10000;
align-items: center;
justify-content: center;
opacity: 1;
transition: opacity 0.4s ease-in-out;
}
.download-missing-modal-content {
background: rgba(16, 16, 20, 0.96);
backdrop-filter: blur(20px);
border-radius: 18px;
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
width: 1400px;
height: 900px;
max-width: 95vw;
max-height: 95vh;
display: flex;
flex-direction: column;
overflow: hidden;
transform: scale(1);
transition: transform 0.4s ease-in-out;
}
.download-missing-modal-header {
background: rgba(20, 20, 24, 0.9);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
padding: 0;
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
}
/* Hero Section for Context-Aware Display */
.download-missing-modal-hero {
display: flex;
align-items: center;
padding: 14px 28px;
gap: 16px;
position: relative;
min-height: 80px;
}
/* Hero Background Image (for artist/album context) */
.download-missing-modal-hero-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-size: cover;
background-position: center;
opacity: 0.15;
filter: blur(8px);
z-index: 1;
}
.download-missing-modal-hero-bg::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.7) 0%,
rgba(0, 0, 0, 0.3) 100%);
}
/* Hero Content */
.download-missing-modal-hero-content {
display: flex;
align-items: center;
gap: 20px;
position: relative;
z-index: 2;
flex: 1;
}
/* Hero Images Container */
.download-missing-modal-hero-images {
display: flex;
align-items: center;
gap: 16px;
flex-shrink: 0;
}
.download-missing-modal-hero-image {
width: 80px;
height: 80px;
border-radius: 12px;
object-fit: cover;
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
}
.download-missing-modal-hero-image:hover {
transform: scale(1.05);
box-shadow:
0 12px 32px rgba(0, 0, 0, 0.5),
0 6px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
/* Artist Image (circular) */
.download-missing-modal-hero-image.artist {
border-radius: 50%;
width: 70px;
height: 70px;
}
/* Album Image (rounded square) */
.download-missing-modal-hero-image.album {
border-radius: 12px;
width: 80px;
height: 80px;
}
/* Hero Icon (for wishlist/playlist without images) */
.download-missing-modal-hero-icon {
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(var(--accent-light-rgb), 0.1) 100%);
border-radius: 12px;
font-size: 40px;
color: rgb(var(--accent-light-rgb));
border: 1px solid rgba(var(--accent-rgb), 0.3);
box-shadow:
0 8px 24px rgba(var(--accent-rgb), 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Hero Metadata */
.download-missing-modal-hero-metadata {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
min-width: 0;
}
.download-missing-modal-hero-title {
color: #ffffff;
font-size: 22px;
font-weight: 700;
margin: 0;
line-height: 1.2;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.download-missing-modal-hero-subtitle {
color: #e0e0e0;
font-size: 16px;
font-weight: 500;
margin: 0;
opacity: 0.9;
}
.hero-artist-link {
color: rgb(var(--accent-light-rgb));
text-decoration: none;
transition: color 0.15s ease, opacity 0.15s ease;
cursor: pointer;
}
.hero-artist-link:hover {
color: rgb(var(--accent-rgb));
text-decoration: underline;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.download-missing-modal-hero-details {
display: flex;
gap: 16px;
font-size: 14px;
margin-top: 4px;
}
.download-missing-modal-hero-detail {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
padding: 4px 8px;
background: rgba(var(--accent-rgb), 0.1);
border-radius: 6px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
text-transform: uppercase;
letter-spacing: 0.5px;
font-size: 12px;
}
/* Header Actions (close button) */
.download-missing-modal-header-actions {
position: absolute;
top: 12px;
right: 16px;
z-index: 3;
display: flex;
}
/* ===============================
CONTEXT-SPECIFIC STYLING
=============================== */
/* Artist Album Context */
.download-missing-modal-content[data-context="artist_album"] .download-missing-modal-hero-bg {
opacity: 0.15;
}
.download-missing-modal-content[data-context="artist_album"] .download-missing-modal-hero {
background: rgba(20, 20, 24, 0.9);
}
.download-missing-modal-content[data-context="artist_album"] .download-missing-modal-hero-detail {
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.15);
}
/* Playlist Context */
.download-missing-modal-content[data-context="playlist"] .download-missing-modal-hero {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.06) 0%, rgba(20, 20, 24, 0.9) 100%);
}
.download-missing-modal-content[data-context="playlist"] .download-missing-modal-hero-icon {
background: rgba(var(--accent-rgb), 0.12);
border-color: rgba(var(--accent-rgb), 0.25);
}
.download-missing-modal-content[data-context="playlist"] .download-missing-modal-hero-detail {
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.15);
}
/* Wishlist Context */
.download-missing-modal-content[data-context="wishlist"] .download-missing-modal-hero {
background: linear-gradient(135deg, rgba(123, 31, 162, 0.06) 0%, rgba(20, 20, 24, 0.9) 100%);
}
.download-missing-modal-content[data-context="wishlist"] .download-missing-modal-hero-icon {
background: rgba(123, 31, 162, 0.12);
border-color: rgba(123, 31, 162, 0.25);
color: #DA70D6;
}
.download-missing-modal-content[data-context="wishlist"] .download-missing-modal-hero-detail {
background: rgba(123, 31, 162, 0.08);
border-color: rgba(123, 31, 162, 0.15);
color: #DA70D6;
}
.download-missing-modal-content[data-context="wishlist"] .stat-total .dashboard-stat-number {
color: #DA70D6;
}
/* ===============================
ANIMATIONS & POLISH
=============================== */
/* Modal entrance animation */
@keyframes modalFadeIn {
0% {
opacity: 0;
transform: scale(0.9) translateY(20px);
filter: blur(4px);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
filter: blur(0px);
}
}
@keyframes modalOverlayFadeIn {
0% {
opacity: 0;
backdrop-filter: blur(0px);
}
100% {
opacity: 1;
backdrop-filter: blur(12px);
}
}
/* Apply entrance animations */
#download-missing-modal:not(.hidden) {
animation: modalOverlayFadeIn 0.4s ease-out;
}
#download-missing-modal:not(.hidden) .download-missing-modal-content {
animation: modalFadeIn 0.4s ease-out;
}
/* Hero section animations */
.download-missing-modal-hero-image {
animation: imageSlideIn 0.6s ease-out 0.2s both;
}
@keyframes imageSlideIn {
0% {
opacity: 0;
transform: translateX(-20px) scale(0.8);
}
100% {
opacity: 1;
transform: translateX(0) scale(1);
}
}
.download-missing-modal-hero-metadata {
animation: textSlideIn 0.6s ease-out 0.3s both;
}
@keyframes textSlideIn {
0% {
opacity: 0;
transform: translateY(10px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.download-missing-modal-hero-detail {
animation: detailPop 0.4s ease-out 0.5s both;
}
@keyframes detailPop {
0% {
opacity: 0;
transform: scale(0.8);
}
100% {
opacity: 1;
transform: scale(1);
}
}
/* Stats dashboard animation */
.dashboard-stat {
animation: statSlideUp 0.5s ease-out calc(0.4s + var(--stat-index, 0) * 0.1s) both;
}
@keyframes statSlideUp {
0% {
opacity: 0;
transform: translateY(20px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
/* Progress section animation */
.progress-item {
animation: progressSlideIn 0.5s ease-out calc(0.6s + var(--progress-index, 0) * 0.1s) both;
}
@keyframes progressSlideIn {
0% {
opacity: 0;
transform: translateX(-20px);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
/* Enhanced hover effects */
.dashboard-stat:hover .dashboard-stat-number {
transform: scale(1.1);
filter: brightness(1.2);
}
.download-missing-modal-hero-detail:hover {
transform: translateY(-2px) scale(1.05);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}
/* Subtle pulse animation for active elements */
.progress-fill {
position: relative;
overflow: hidden;
}
.progress-fill::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
transparent 0%,
rgba(255, 255, 255, 0.3) 50%,
transparent 100%);
animation: progressShimmer 2s infinite;
}
@keyframes progressShimmer {
0% {
left: -100%;
}
100% {
left: 100%;
}
}
/* ===============================
RESPONSIVE DESIGN
=============================== */
/* Large screens (1600px+) */
@media (min-width: 1600px) {
.download-missing-modal-content {
width: 1500px;
height: 90vh;
}
.download-missing-modal-hero {
min-height: 140px;
padding: 28px 32px;
}
.download-missing-modal-hero-image.album {
width: 90px;
height: 90px;
}
.download-missing-modal-hero-image.artist {
width: 80px;
height: 80px;
}
}
/* Medium screens (1200px - 1599px) */
@media (max-width: 1599px) and (min-width: 1200px) {
.download-missing-modal-content {
width: 1200px;
height: 90vh;
}
}
/* Small screens (768px - 1199px) */
@media (max-width: 1199px) and (min-width: 768px) {
.download-missing-modal-content {
width: 95vw;
height: 90vh;
max-width: 1000px;
}
.download-missing-modal-hero {
min-height: 100px;
padding: 20px 24px;
}
.download-missing-modal-hero-image.album {
width: 70px;
height: 70px;
}
.download-missing-modal-hero-image.artist {
width: 60px;
height: 60px;
}
.download-missing-modal-hero-icon {
width: 70px;
height: 70px;
font-size: 32px;
}
.download-missing-modal-hero-title {
font-size: 20px;
}
.download-missing-modal-hero-subtitle {
font-size: 14px;
}
}
/* Mobile screens (767px and below) */
@media (max-width: 767px) {
.download-missing-modal-content {
width: 95vw;
height: 95vh;
max-width: none;
border-radius: 16px;
}
.download-missing-modal-hero {
flex-direction: column;
text-align: center;
min-height: auto;
padding: 20px;
gap: 16px;
}
.download-missing-modal-hero-content {
flex-direction: column;
gap: 16px;
}
.download-missing-modal-hero-images {
justify-content: center;
}
.download-missing-modal-hero-image.album,
.download-missing-modal-hero-image.artist {
width: 60px;
height: 60px;
}
.download-missing-modal-hero-icon {
width: 60px;
height: 60px;
font-size: 28px;
margin: 0 auto;
}
.download-missing-modal-hero-title {
font-size: 18px;
white-space: normal;
text-align: center;
}
.download-missing-modal-hero-subtitle {
font-size: 14px;
white-space: normal;
text-align: center;
}
.download-missing-modal-hero-details {
justify-content: center;
flex-wrap: wrap;
}
.download-missing-modal-body {
padding: 0 20px 20px 20px;
gap: 20px;
}
.download-dashboard-stats {
grid-template-columns: repeat(4, 1fr);
gap: 4px;
width: 100%;
padding: 8px 0 0 0;
border-top: 1px solid rgba(255, 255, 255, 0.08);
margin-top: 8px;
}
.download-missing-modal-footer {
padding: 20px;
flex-direction: column;
gap: 16px;
}
.download-phase-controls {
width: 100%;
justify-content: center;
}
.download-control-btn {
flex: 1;
max-width: 200px;
}
}
/* Small height screens (below 800px height) - Better scrollability */
@media (max-height: 800px) {
.download-missing-modal-content {
height: 95vh;
max-height: 95vh;
}
.download-progress-section {
padding: 16px;
}
.download-tracks-section {
min-height: 300px;
/* Ensure tracks list is always usable */
}
.download-tracks-table-container {
min-height: 200px;
/* Ensure at least 200px for the table */
}
}
/* Very small height screens (below 600px height) - Compact mode */
@media (max-height: 600px) {
.download-missing-modal-content {
height: 98vh;
max-height: 98vh;
}
.download-missing-modal-hero {
min-height: auto;
padding: 12px 20px;
}
.download-progress-section {
padding: 12px;
gap: 10px;
}
.progress-label {
font-size: 13px;
}
.download-tracks-section {
min-height: 250px;
/* Smaller but still usable */
}
.download-tracks-table-container {
min-height: 150px;
}
.download-tracks-table th,
.download-tracks-table td {
padding: 8px 10px;
font-size: 12px;
}
.download-missing-modal-footer {
padding: 12px 20px;
}
}
/* Legacy title styling - now handled by hero section */
.download-missing-modal-title {
color: #ffffff;
font-size: 18px;
font-weight: 700;
margin: 0;
line-height: 1.2;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
}
.download-missing-modal-close {
color: #b3b3b3;
font-size: 28px;
font-weight: 300;
cursor: pointer;
transition: all 0.3s ease;
line-height: 1;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
padding: 4px;
margin: -4px;
}
.download-missing-modal-close:hover {
color: #ffffff;
background: rgba(255, 255, 255, 0.15);
transform: scale(1.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.download-missing-modal-body {
flex: 1;
display: flex;
flex-direction: column;
padding: 12px 28px 12px 28px;
gap: 10px;
overflow-y: auto;
/* Allow vertical scrolling */
overflow-x: hidden;
}
/* Dashboard Stats Section — sits inside hero header, 2x2 grid */
.download-dashboard-stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 4px 16px;
flex-shrink: 0;
position: relative;
z-index: 2;
padding: 0;
background: none;
backdrop-filter: none;
border: none;
border-radius: 0;
box-shadow: none;
}
.dashboard-stat {
text-align: center;
padding: 2px 8px;
border-radius: 8px;
transition: all 0.3s ease;
}
.dashboard-stat:hover {
background: rgba(255, 255, 255, 0.05);
}
.dashboard-stat-number {
font-size: 18px;
font-weight: 700;
margin-bottom: 0;
line-height: 1.2;
transition: all 0.3s ease;
}
.dashboard-stat-label {
font-size: 10px;
color: rgba(255, 255, 255, 0.5);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Stat colors */
.stat-total .dashboard-stat-number {
color: rgb(var(--accent-light-rgb));
}
.stat-found .dashboard-stat-number {
color: #4CAF50;
}
.stat-missing .dashboard-stat-number {
color: #FF6B35;
}
.stat-downloaded .dashboard-stat-number {
color: #2196F3;
}
/* Progress Section */
.download-progress-section {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: 12px 16px;
display: flex;
flex-direction: column;
gap: 8px;
}
.progress-item {
display: flex;
flex-direction: column;
gap: 4px;
padding: 0;
}
.progress-label {
font-size: 12px;
font-weight: 600;
color: #e8e8e8;
display: flex;
align-items: center;
gap: 8px;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.progress-bar {
background: rgba(64, 64, 64, 0.8);
border-radius: 8px;
height: 8px;
overflow: hidden;
box-shadow:
inset 0 2px 4px rgba(0, 0, 0, 0.3),
0 1px 2px rgba(0, 0, 0, 0.2);
}
.progress-fill {
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
height: 100%;
border-radius: 10px;
transition: width 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
width: 0%;
box-shadow:
0 0 15px rgba(var(--accent-rgb), 0.6),
inset 0 1px 2px rgba(255, 255, 255, 0.3);
position: relative;
}
.progress-fill::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 50%;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.3) 0%, transparent 100%);
border-radius: 10px 10px 0 0;
}
.progress-fill.analysis {
background: linear-gradient(90deg, #2196F3, #21CBF3);
box-shadow:
0 0 15px rgba(33, 150, 243, 0.6),
inset 0 1px 2px rgba(255, 255, 255, 0.3);
}
.progress-fill.download {
background: linear-gradient(90deg, #FF6B35, #FF8A35);
box-shadow:
0 0 15px rgba(255, 107, 53, 0.6),
inset 0 1px 2px rgba(255, 255, 255, 0.3);
}
/* Track Table Section */
.download-tracks-section {
/* Premium glassmorphic card matching other sections */
background: linear-gradient(135deg,
rgba(35, 35, 35, 0.7) 0%,
rgba(25, 25, 25, 0.8) 100%);
backdrop-filter: blur(10px) saturate(1.1);
border: 1px solid rgba(255, 255, 255, 0.1);
border-top: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 16px;
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
/* Premium shadow with subtle glow */
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.4),
0 4px 16px rgba(0, 0, 0, 0.2),
0 0 20px rgba(var(--accent-rgb), 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.download-tracks-header {
padding: 10px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
background: linear-gradient(135deg,
rgba(40, 40, 40, 0.8) 0%,
rgba(30, 30, 30, 0.9) 100%);
display: flex;
align-items: center;
justify-content: space-between;
}
.download-tracks-title {
font-size: 13px;
font-weight: 700;
color: #ffffff;
margin: 0;
display: flex;
align-items: center;
gap: 8px;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.track-render-indicator {
font-size: 11px;
font-weight: 400;
color: #888888;
margin-left: auto;
white-space: nowrap;
}
.download-tracks-table-container {
flex: 1;
overflow-y: auto;
}
.download-tracks-table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
/* Enable fixed layout for even column distribution */
}
.download-tracks-table th {
background: #404040;
color: #ffffff;
font-weight: 600;
font-size: 12px;
text-align: center;
padding: 12px 15px;
border-bottom: 1px solid #555555;
position: sticky;
top: 0;
z-index: 10;
}
.download-tracks-table td {
padding: 12px 15px;
border-bottom: 1px solid #333333;
color: #e0e0e0;
font-size: 13px;
}
.download-tracks-table tr:hover {
background: rgba(var(--accent-rgb), 0.05);
}
.track-number {
color: #888888;
font-weight: 500;
width: 4%;
/* 4% for track numbers */
text-align: center;
}
.track-name {
font-weight: 600;
color: #ffffff;
width: 24%;
/* 24% for track names */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
position: relative;
cursor: default;
}
.track-artist {
color: #cccccc;
width: 20%;
/* 20% for artist names */
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
position: relative;
cursor: default;
}
.track-duration {
color: #999999;
text-align: center;
width: 8%;
/* 8% for duration */
}
.track-match-status {
text-align: center;
width: 15%;
/* 15% for library match status */
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
position: relative;
cursor: default;
}
.match-found {
color: #4CAF50;
}
.match-missing {
color: #FF6B35;
}
.match-checking {
color: #2196F3;
}
.track-download-status {
text-align: center;
width: 19%;
/* 19% for download status with progress */
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
position: relative;
cursor: default;
}
.download-searching {
color: #2196F3;
}
.download-downloading {
color: #FF6B35;
}
.download-complete {
color: #4CAF50;
}
.download-failed {
color: #f44336;
}
/* Hover/tap tooltip for truncated track and artist names */
.track-name:hover::after,
.track-artist:hover::after,
.track-match-status:hover::after,
.track-download-status:hover::after {
content: attr(title);
position: absolute;
left: 0;
bottom: calc(100% + 4px);
background: rgba(20, 20, 20, 0.95);
color: #ffffff;
padding: 8px 12px;
border-radius: 8px;
font-size: 12px;
font-weight: 500;
white-space: normal;
word-break: break-word;
max-width: 320px;
min-width: 120px;
z-index: 100;
pointer-events: none;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
border: 1px solid rgba(255, 255, 255, 0.1);
line-height: 1.4;
}
/* Only show tooltip when content is actually truncated (has title attr) */
.track-name:hover::after,
.track-artist:hover::after,
.track-match-status:hover::after,
.track-download-status:hover::after {
content: attr(title);
}
.track-name:not([title]):hover::after,
.track-artist:not([title]):hover::after,
.track-match-status:not([title]):hover::after,
.track-download-status:not([title]):hover::after {
display: none;
}
.track-actions {
text-align: center;
width: 7%;
/* 7% for action buttons */
}
.track-result-card .track-actions {
width: auto;
}
.track-select-header,
.track-select-cell {
width: 3%;
text-align: center;
padding: 12px 6px !important;
}
.track-select-header input[type="checkbox"],
.track-select-cell input[type="checkbox"] {
width: 16px;
height: 16px;
cursor: pointer;
accent-color: rgb(var(--accent-rgb));
}
.track-select-cell input[type="checkbox"]:disabled {
cursor: default;
opacity: 0.5;
}
.track-deselected td:not(.track-select-cell) {
opacity: 0.4;
}
.track-deselected .track-name,
.track-deselected .track-artist {
text-decoration: line-through;
text-decoration-color: rgba(255, 255, 255, 0.3);
}
.track-selection-count {
font-size: 12px;
color: #999;
font-weight: 500;
white-space: nowrap;
}
.cancel-track-btn {
background: #f44336;
color: #ffffff;
border: none;
border-radius: 6px;
padding: 4px 8px;
font-size: 11px;
cursor: pointer;
transition: all 0.2s ease;
}
.cancel-track-btn:hover {
background: #d32f2f;
transform: scale(1.05);
}
/* Modal Footer */
.download-missing-modal-footer {
background: linear-gradient(135deg,
rgba(42, 42, 42, 0.9) 0%,
rgba(30, 30, 30, 0.95) 100%);
border-top: 1px solid rgba(255, 255, 255, 0.08);
padding: 14px 28px;
display: flex;
align-items: center;
justify-content: space-between;
/* Subtle inner glow */
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.download-phase-controls {
display: flex;
align-items: center;
gap: 12px;
}
.download-control-btn {
padding: 10px 20px;
border-radius: 10px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
border: 1px solid rgba(255, 255, 255, 0.1);
min-width: 120px;
position: relative;
overflow: hidden;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
color: rgba(255, 255, 255, 0.8);
}
.download-control-btn::before {
content: '';
position: absolute;
inset: 0;
border-radius: 10px;
opacity: 0;
transition: opacity 0.3s;
}
.download-control-btn:hover:not(:disabled)::before {
opacity: 1;
}
.download-control-btn:hover:not(:disabled) {
color: #fff;
transform: translateY(-1px);
}
.download-control-btn.primary::before {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.25) 0%, rgba(var(--accent-rgb), 0.08) 100%);
}
.download-control-btn.primary {
border-color: rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-light-rgb));
}
.download-control-btn.primary:hover:not(:disabled) {
border-color: rgba(var(--accent-rgb), 0.4);
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.2);
}
.download-control-btn.secondary::before {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.03) 100%);
}
.download-control-btn.secondary:hover:not(:disabled) {
border-color: rgba(255, 255, 255, 0.2);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.download-control-btn.danger::before {
background: linear-gradient(135deg, rgba(244, 67, 54, 0.2) 0%, rgba(244, 67, 54, 0.05) 100%);
}
.download-control-btn.danger {
border-color: rgba(244, 67, 54, 0.2);
color: rgba(244, 67, 54, 0.8);
}
.download-control-btn.danger:hover:not(:disabled) {
border-color: rgba(244, 67, 54, 0.4);
color: #ff6b6b;
box-shadow: 0 4px 16px rgba(244, 67, 54, 0.15);
}
.download-control-btn.export::before {
background: linear-gradient(135deg, rgba(102, 126, 234, 0.2) 0%, rgba(118, 75, 162, 0.08) 100%);
}
.download-control-btn.export {
border-color: rgba(102, 126, 234, 0.2);
color: rgba(142, 160, 255, 0.85);
}
.download-control-btn.export:hover:not(:disabled) {
border-color: rgba(102, 126, 234, 0.4);
box-shadow: 0 4px 16px rgba(102, 126, 234, 0.15);
}
.download-control-btn:disabled {
background: rgba(255, 255, 255, 0.03);
border-color: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.15);
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* Force Download Toggle Styling */
.force-download-toggle-container {
display: flex;
align-items: center;
justify-content: center;
padding: 8px 16px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
transition: all 0.2s ease;
}
.force-download-toggle-container:hover {
background: rgba(255, 255, 255, 0.05);
border-color: rgba(255, 255, 255, 0.12);
}
.force-download-toggle {
display: flex;
align-items: center;
gap: 12px;
cursor: pointer;
user-select: none;
}
.force-download-toggle span {
font-size: 13px;
font-weight: 500;
color: rgba(255, 255, 255, 0.8);
transition: color 0.2s ease;
}
/* Toggle Switch */
.force-download-toggle input[type="checkbox"] {
position: relative;
width: 48px;
height: 24px;
appearance: none;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
cursor: pointer;
transition: all 0.3s ease;
outline: none;
}
.force-download-toggle input[type="checkbox"]:before {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 18px;
height: 18px;
background: #ffffff;
border-radius: 50%;
transition: all 0.3s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.force-download-toggle input[type="checkbox"]:checked {
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
border-color: rgba(var(--accent-rgb), 0.4);
box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.3);
}
.force-download-toggle input[type="checkbox"]:checked:before {
transform: translateX(24px);
background: #ffffff;
}
.force-download-toggle input[type="checkbox"]:checked+span {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.force-download-toggle:hover input[type="checkbox"] {
border-color: rgba(255, 255, 255, 0.3);
}
.force-download-toggle:hover input[type="checkbox"]:checked {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow: 0 0 16px rgba(var(--accent-rgb), 0.4);
}
.modal-close-section {
display: flex;
align-items: center;
gap: 12px;
}
/* ==============================================
PERSISTENT DOWNLOAD MODAL STYLES
============================================== */
.download-missing-modal {
display: none;
/* Hidden by default */
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(8px);
z-index: 9000;
align-items: center;
justify-content: center;
}
.playlist-card-actions button {
background: transparent;
border: 1px solid rgb(var(--accent-rgb));
border-radius: 15px;
color: rgb(var(--accent-rgb));
font-size: 10px;
font-weight: bold;
padding: 8px 16px;
cursor: pointer;
transition: all 0.2s ease;
}
.playlist-card-actions .view-progress-btn {
background: rgb(var(--accent-rgb));
color: #000000;
}
.playlist-card-actions button:hover {
background: rgb(var(--accent-rgb));
color: #000000;
}
.playlist-card-actions .view-progress-btn {
background: rgb(var(--accent-rgb));
color: #000000;
}
.playlist-card-actions .view-progress-btn:hover {
background: rgb(var(--accent-light-rgb));
}
/* Download Complete Styling - Ready for Review State */
.playlist-card.download-complete {
/* Add subtle green left border to indicate completion */
border-left: 4px solid #28a745;
background: linear-gradient(135deg,
rgba(40, 167, 69, 0.05) 0%,
rgba(26, 26, 26, 0.95) 20%,
rgba(18, 18, 18, 0.98) 100%);
}
.playlist-card.download-complete:hover {
/* Enhanced hover for completed cards */
background: linear-gradient(135deg,
rgba(40, 167, 69, 0.08) 0%,
rgba(30, 30, 30, 0.98) 20%,
rgba(22, 22, 22, 1.0) 100%);
box-shadow:
0 8px 32px rgba(40, 167, 69, 0.15),
0 2px 8px rgba(0, 0, 0, 0.4),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
/* ============================================================================ */
/* ARTISTS PAGE STYLES - ELEGANT GLASSMORPHIC DESIGN */
/* ============================================================================ */
/* Artists Search State - Initial centered interface with downloads section support */
.artists-search-state {
display: flex;
flex-direction: column;
align-items: center;
gap: 10vh;
justify-content: center;
min-height: 70vh;
padding: 40px 20px;
opacity: 1;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
gap: 32px;
}
.artists-search-state.fade-out {
opacity: 0;
transform: translateY(-20px);
}
.artists-search-container {
max-width: 600px;
width: 100%;
text-align: center;
margin-top: auto;
margin-bottom: auto;
}
/* When downloads section is present, adjust positioning */
.artists-search-state:has(.artist-downloads-section) .artists-search-container {
margin-top: 0;
margin-bottom: 0;
}
.artists-welcome-section {
margin-bottom: 40px;
}
.artists-welcome-title {
font-size: 36px;
font-weight: 700;
margin-bottom: 12px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
letter-spacing: -0.3px;
display: flex;
align-items: center;
gap: 14px;
}
.artists-welcome-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
.artists-welcome-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
font-weight: 400;
line-height: 1.5;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artists-search-input-container {
position: relative;
margin-bottom: 20px;
}
.artists-search-input {
width: 100%;
padding: 18px 24px 18px 60px;
font-size: 16px;
font-weight: 500;
color: #ffffff;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
/* Premium glassmorphic foundation */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.9) 0%,
rgba(18, 18, 18, 0.95) 100%);
backdrop-filter: blur(12px) saturate(1.1);
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-top: 1px solid rgba(255, 255, 255, 0.15);
/* Elegant shadow system */
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.08),
inset 0 -1px 0 rgba(0, 0, 0, 0.1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
outline: none;
}
.artists-search-input:focus {
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.95) 0%,
rgba(22, 22, 22, 1.0) 100%);
border-color: rgba(var(--accent-rgb), 0.3);
border-top-color: rgba(var(--accent-rgb), 0.4);
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.15),
0 0 20px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.12),
inset 0 -1px 0 rgba(0, 0, 0, 0.15);
transform: translateY(-1px);
}
.artists-search-input::placeholder {
color: rgba(255, 255, 255, 0.5);
font-weight: 400;
}
.artists-search-icon {
position: absolute;
left: 22px;
top: 50%;
transform: translateY(-50%);
font-size: 18px;
color: rgba(255, 255, 255, 0.6);
pointer-events: none;
transition: color 0.3s ease;
}
.artists-search-input:focus+.artists-search-icon {
color: rgba(var(--accent-rgb), 0.8);
}
.artists-search-status {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
font-weight: 400;
min-height: 20px;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
transition: all 0.3s ease;
}
.artists-search-status.searching {
color: rgba(var(--accent-rgb), 0.8);
}
.artists-search-status.error {
color: rgba(255, 65, 54, 0.8);
}
/* Artists Results State */
.artists-results-state {
opacity: 0;
transform: translateY(20px);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
padding: 20px;
}
.artists-results-state.show {
opacity: 1;
transform: translateY(0);
}
.artists-results-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 30px;
gap: 20px;
}
.artists-back-button {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 20px;
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
cursor: pointer;
transition: all 0.2s ease;
outline: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artists-back-button:hover {
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
transform: translateY(-1px);
}
.back-icon {
font-size: 16px;
}
.artists-search-header {
flex: 1;
max-width: 400px;
}
.artists-header-search-input {
width: 100%;
padding: 12px 20px;
font-size: 14px;
font-weight: 500;
color: #ffffff;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
background: rgba(255, 255, 255, 0.08);
backdrop-filter: blur(8px);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
transition: all 0.2s ease;
outline: none;
}
.artists-header-search-input:focus {
background: rgba(255, 255, 255, 0.12);
border-color: rgba(var(--accent-rgb), 0.3);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1);
}
.artists-header-search-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.artists-results-content {
margin-bottom: 40px;
}
.artists-results-title {
font-size: 20px;
font-weight: 600;
color: #ffffff;
margin-bottom: 20px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artists-cards-container {
display: flex;
gap: 20px;
overflow-x: auto;
overflow-y: visible;
padding: 30px;
scroll-behavior: smooth;
/* Custom scrollbar styling */
scrollbar-width: thin;
scrollbar-color: rgba(var(--accent-rgb), 0.6) rgba(255, 255, 255, 0.1);
}
.artists-cards-container::-webkit-scrollbar {
height: 8px;
}
.artists-cards-container::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
.artists-cards-container::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.6);
border-radius: 4px;
transition: background 0.3s ease;
}
.artists-cards-container::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.8);
}
/* Artist Card Styles with Background Images */
.artist-card {
position: relative;
width: 280px;
height: 350px;
flex-shrink: 0;
border-radius: 20px;
overflow: hidden;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
/* Premium glassmorphic foundation */
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
/* Elegant shadow system */
box-shadow:
0 10px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.artist-card:hover {
transform: translateY(-5px) scale(1.01);
z-index: 10;
box-shadow:
0 12px 15px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.15),
0 0 20px rgba(var(--accent-rgb), 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Dynamic glow effects based on image colors */
.artist-card.has-dynamic-glow {
position: relative;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1),
filter 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.artist-card.has-dynamic-glow:hover {
filter: drop-shadow(0 0 8px var(--glow-color-1, rgb(var(--accent-rgb)))) drop-shadow(0 0 16px var(--glow-color-2, rgb(var(--accent-light-rgb))));
border-color: var(--glow-color-1, rgba(var(--accent-rgb), 0.3));
}
.artist-card-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
opacity: 0.6;
transition: all 0.3s ease;
}
.artist-card:hover .artist-card-background {
opacity: 0.8;
transform: scale(1.05);
}
.artist-card-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.9) 0%,
rgba(0, 0, 0, 0.3) 40%,
rgba(0, 0, 0, 0.1) 70%,
transparent 100%);
}
.artist-card-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 30px 24px;
z-index: 2;
}
.artist-card-name {
font-size: 24px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
line-height: 1.2;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-card-genres {
font-size: 14px;
color: rgba(255, 255, 255, 0.8);
font-weight: 500;
margin-bottom: 12px;
line-height: 1.3;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-card-popularity {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
color: rgba(var(--accent-rgb), 0.9);
font-weight: 600;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.popularity-icon {
font-size: 12px;
}
/* Artist Card Actions (Watchlist) */
.artist-card-actions {
margin-top: 16px;
padding-top: 16px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.watchlist-toggle-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
border: none;
border-radius: 10px;
background: rgba(255, 255, 255, 0.08);
color: #e0e0e0;
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
width: 100%;
justify-content: center;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
border: 1px solid rgba(255, 255, 255, 0.12);
}
.watchlist-toggle-btn:hover:not(:disabled) {
background: rgba(var(--accent-rgb), 0.15);
color: #ffffff;
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateY(-1px);
}
.watchlist-toggle-btn.watching {
background: rgba(255, 193, 7, 0.15);
color: #ffc107;
border-color: rgba(255, 193, 7, 0.3);
}
.watchlist-toggle-btn.watching:hover:not(:disabled) {
background: rgba(255, 193, 7, 0.25);
color: #ffffff;
border-color: rgba(255, 193, 7, 0.5);
}
.watchlist-toggle-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
.watchlist-icon {
font-size: 14px;
}
.watchlist-text {
flex: 1;
text-align: center;
}
/* Artist Card Animation States */
.artist-card.loading {
animation: artistCardPulse 2s ease-in-out infinite;
pointer-events: none;
}
.artist-card.loading .artist-card-background {
background: linear-gradient(90deg,
rgba(26, 26, 26, 0.8) 0%,
rgba(40, 40, 40, 0.8) 50%,
rgba(26, 26, 26, 0.8) 100%) !important;
background-size: 200% 100%;
animation: artistCardShimmer 1.5s ease-in-out infinite;
}
@keyframes artistCardPulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
@keyframes artistCardShimmer {
0% {
background-position: -200% 0;
}
100% {
background-position: 200% 0;
}
}
/* Search loading indicator */
.artists-search-status.searching::after {
content: '';
display: inline-block;
width: 12px;
height: 12px;
margin-left: 8px;
border: 2px solid rgba(var(--accent-rgb), 0.3);
border-radius: 50%;
border-top-color: rgba(var(--accent-rgb), 0.8);
animation: searchSpinner 0.8s ease-in-out infinite;
}
@keyframes searchSpinner {
to {
transform: rotate(360deg);
}
}
/* Responsive adjustments */
@media (max-width: 768px) {
.artists-cards-container {
gap: 16px;
padding: 15px 0 25px 0;
}
.artist-card {
width: 250px;
height: 300px;
}
.artist-card-name {
font-size: 20px;
}
}
/* Artist Detail State */
.artist-detail-state {
opacity: 0;
transform: translateY(20px);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
padding: 20px;
}
.artist-detail-state.show {
opacity: 1;
transform: translateY(0);
}
/* ========================================= */
/* ARTISTS PAGE - HERO SECTION */
/* ========================================= */
.artists-hero-section {
position: relative;
border-radius: 20px;
overflow: hidden;
margin-bottom: 28px;
min-height: 300px;
border: 1px solid rgba(255, 255, 255, 0.06);
}
.artists-hero-bg {
position: absolute;
inset: -20px;
background-size: cover;
background-position: center top;
filter: blur(50px) brightness(0.35) saturate(1.4);
transform: scale(1.3);
z-index: 0;
}
.artists-hero-overlay {
position: absolute;
inset: 0;
background: linear-gradient(180deg,
rgba(8, 8, 8, 0.5) 0%,
rgba(12, 12, 12, 0.75) 50%,
rgba(12, 12, 12, 0.92) 100%);
z-index: 1;
}
.artists-hero-content {
position: relative;
z-index: 2;
padding: 32px 36px 36px;
}
.artists-hero-back {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 6px 14px;
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
margin-bottom: 24px;
display: inline-flex;
align-items: center;
gap: 6px;
letter-spacing: 0.02em;
}
.artists-hero-back:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.artists-hero-main {
display: flex;
gap: 36px;
align-items: center;
}
.artists-hero-image {
width: 400px;
height: 480px;
border-radius: 14px;
background-size: cover;
background-position: center top;
background-color: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
box-shadow:
0 16px 48px rgba(0, 0, 0, 0.6),
0 0 0 1px rgba(255, 255, 255, 0.04);
display: flex;
align-items: center;
justify-content: center;
transition: border-color 0.3s ease, box-shadow 0.3s ease, transform 0.3s ease;
}
.artists-hero-section:hover .artists-hero-image {
border-color: rgba(var(--accent-rgb), 0.2);
box-shadow:
0 16px 48px rgba(0, 0, 0, 0.6),
0 0 30px rgba(var(--accent-rgb), 0.1);
transform: scale(1.02);
}
.artists-hero-image-fallback {
font-size: 64px;
opacity: 0.2;
}
.artists-hero-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 12px;
}
.artists-hero-name {
font-size: 2.6em;
font-weight: 800;
color: #fff;
margin: 0;
line-height: 1.1;
letter-spacing: -1px;
text-shadow: 0 2px 12px rgba(0, 0, 0, 0.4);
}
.artists-hero-badges {
display: flex;
gap: 6px;
flex-wrap: wrap;
align-items: center;
}
.artists-hero-badge {
display: inline-flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
text-decoration: none;
cursor: pointer;
transition: all 0.2s ease;
overflow: hidden;
backdrop-filter: blur(8px);
}
.artists-hero-badge img {
width: 18px;
height: 18px;
object-fit: contain;
}
.artists-hero-badge:hover {
background: rgba(255, 255, 255, 0.14);
transform: translateY(-2px) scale(1.08);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.artists-hero-genres {
display: flex;
gap: 6px;
flex-wrap: wrap;
margin-top: 2px;
}
.artists-hero-genre-pill {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 20px;
padding: 5px 14px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.65);
letter-spacing: 0.01em;
backdrop-filter: blur(4px);
transition: all 0.15s ease;
}
.artists-hero-genre-pill:hover {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.9);
}
.artists-hero-bio {
max-width: 600px;
max-height: 3.9em;
overflow: hidden;
position: relative;
transition: max-height 0.3s ease;
}
.artists-hero-bio.expanded {
max-height: 500px;
}
.artists-hero-bio-text {
font-size: 13px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.55);
margin: 0;
display: inline;
}
.artists-hero-bio-toggle {
background: none;
border: none;
color: rgba(var(--accent-rgb), 0.9);
font-size: 12px;
font-weight: 600;
cursor: pointer;
padding: 0;
margin-left: 4px;
display: inline;
}
.artists-hero-bio-toggle:hover {
color: rgb(var(--accent-rgb));
}
.artists-hero-stats {
display: flex;
gap: 24px;
margin-top: 4px;
}
.artists-hero-stat {
font-size: 13px;
color: rgba(255, 255, 255, 0.4);
display: flex;
align-items: baseline;
gap: 5px;
}
.artists-hero-stat strong {
font-size: 18px;
color: #fff;
font-weight: 800;
letter-spacing: -0.5px;
}
.artists-hero-actions {
position: absolute;
top: 32px;
right: 36px;
display: flex;
gap: 8px;
align-items: center;
}
/* Mobile responsive */
@media (max-width: 768px) {
.artists-hero-section {
border-radius: 14px;
min-height: 0;
}
.artists-hero-main {
flex-direction: column;
align-items: center;
text-align: center;
gap: 20px;
}
.artists-hero-image {
width: 160px;
height: 200px;
}
.artists-hero-name {
font-size: 1.6em;
}
.artists-hero-genres {
justify-content: center;
}
.artists-hero-badges {
justify-content: center;
}
.artists-hero-stats {
justify-content: center;
}
.artists-hero-content {
padding: 20px 16px 24px;
}
.artists-hero-actions {
position: static;
justify-content: center;
margin-top: 8px;
}
.artists-hero-stat strong {
font-size: 16px;
}
}
.artist-detail-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 30px;
margin-bottom: 40px;
padding-bottom: 30px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.artist-detail-header-left {
display: flex;
align-items: center;
gap: 30px;
flex: 1;
}
.artist-detail-back-button {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 20px;
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
cursor: pointer;
transition: all 0.2s ease;
outline: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-detail-back-button:hover {
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
transform: translateY(-1px);
}
.artist-detail-watchlist-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 18px;
font-size: 14px;
font-weight: 600;
color: #e0e0e0;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 16px;
cursor: pointer;
transition: all 0.2s ease;
outline: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-detail-watchlist-btn:hover:not(:disabled) {
background: rgba(var(--accent-rgb), 0.15);
color: #ffffff;
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateY(-1px);
}
.artist-detail-watchlist-btn.watching {
background: rgba(255, 193, 7, 0.15);
color: #ffc107;
border-color: rgba(255, 193, 7, 0.3);
}
.artist-detail-watchlist-btn.watching:hover:not(:disabled) {
background: rgba(255, 193, 7, 0.25);
color: #ffffff;
border-color: rgba(255, 193, 7, 0.5);
}
.artist-detail-watchlist-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
}
/* Artist Detail Watchlist Button Group (with settings gear) */
.artist-detail-watchlist-group {
display: flex;
align-items: center;
gap: 6px;
}
.artist-detail-watchlist-settings-btn {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
padding: 0;
font-size: 18px;
color: #aaa;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 12px;
cursor: pointer;
transition: all 0.2s ease;
outline: none;
}
.artist-detail-watchlist-settings-btn:hover {
background: rgba(255, 193, 7, 0.15);
color: #ffc107;
border-color: rgba(255, 193, 7, 0.3);
transform: translateY(-1px);
}
/* Artist Card Watchlist Button Group (artists/discover page) */
.watchlist-btn-group {
display: flex;
align-items: center;
gap: 6px;
}
.watchlist-btn-group .watchlist-toggle-btn {
flex: 1;
}
.watchlist-settings-btn {
display: flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
padding: 0;
font-size: 16px;
color: #aaa;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 10px;
cursor: pointer;
transition: all 0.2s ease;
outline: none;
flex-shrink: 0;
}
.watchlist-settings-btn:hover {
background: rgba(255, 193, 7, 0.15);
color: #ffc107;
border-color: rgba(255, 193, 7, 0.3);
transform: translateY(-1px);
}
/* Library Artist Watchlist Button */
.library-artist-watchlist-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 20px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.02em;
color: rgba(255, 255, 255, 0.85);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
outline: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
position: relative;
overflow: hidden;
backdrop-filter: blur(8px);
}
.library-artist-watchlist-btn::before {
content: '';
position: absolute;
inset: 0;
border-radius: 12px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.05) 100%);
opacity: 0;
transition: opacity 0.3s ease;
}
.library-artist-watchlist-btn:hover:not(:disabled)::before {
opacity: 1;
}
.library-artist-watchlist-btn:hover:not(:disabled) {
color: #ffffff;
border-color: rgba(var(--accent-rgb), 0.35);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.2), 0 0 0 1px rgba(var(--accent-rgb), 0.1);
}
.library-artist-watchlist-btn:active:not(:disabled) {
transform: translateY(0);
box-shadow: none;
}
.library-artist-watchlist-btn .watchlist-icon {
font-size: 14px;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
z-index: 1;
}
.library-artist-watchlist-btn:hover:not(:disabled) .watchlist-icon {
transform: scale(1.15);
}
.library-artist-watchlist-btn .watchlist-text {
position: relative;
z-index: 1;
}
.library-artist-watchlist-btn.watching {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.15) 0%, rgba(255, 193, 7, 0.05) 100%);
color: #ffc107;
border-color: rgba(255, 193, 7, 0.25);
box-shadow: 0 0 12px rgba(255, 193, 7, 0.08);
}
.library-artist-watchlist-btn.watching::before {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.25) 0%, rgba(255, 193, 7, 0.08) 100%);
}
.library-artist-watchlist-btn.watching:hover:not(:disabled) {
color: #ffffff;
border-color: rgba(255, 193, 7, 0.5);
box-shadow: 0 4px 20px rgba(255, 193, 7, 0.25), 0 0 0 1px rgba(255, 193, 7, 0.15);
}
.library-artist-watchlist-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* ─── Enhance Quality Button ─── */
.library-artist-enhance-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 20px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.02em;
color: rgba(79, 195, 247, 0.9);
background: linear-gradient(135deg, rgba(79, 195, 247, 0.08) 0%, rgba(79, 195, 247, 0.02) 100%);
border: 1px solid rgba(79, 195, 247, 0.15);
border-radius: 12px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
outline: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
position: relative;
overflow: hidden;
backdrop-filter: blur(8px);
}
.library-artist-enhance-btn::before {
content: '';
position: absolute;
inset: 0;
border-radius: 12px;
background: linear-gradient(135deg, rgba(79, 195, 247, 0.22) 0%, rgba(100, 220, 255, 0.08) 100%);
opacity: 0;
transition: opacity 0.3s ease;
}
.library-artist-enhance-btn:hover::before {
opacity: 1;
}
.library-artist-enhance-btn:hover {
color: #ffffff;
border-color: rgba(79, 195, 247, 0.4);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(79, 195, 247, 0.2), 0 0 0 1px rgba(79, 195, 247, 0.1);
}
.library-artist-enhance-btn:active {
transform: translateY(0);
box-shadow: none;
}
.library-artist-enhance-btn .enhance-icon {
font-size: 14px;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
z-index: 1;
}
.library-artist-enhance-btn:hover .enhance-icon {
transform: scale(1.2) rotate(8deg);
}
.library-artist-enhance-btn .enhance-text {
position: relative;
z-index: 1;
}
.library-artist-enhance-btn.hidden {
display: none;
}
/* ─── Artist Radio Button ─── */
.library-artist-radio-btn {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 20px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.02em;
color: rgba(255, 255, 255, 0.85);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
outline: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
position: relative;
overflow: hidden;
backdrop-filter: blur(8px);
}
.library-artist-radio-btn::before {
content: '';
position: absolute;
inset: 0;
border-radius: 12px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.05) 100%);
opacity: 0;
transition: opacity 0.3s ease;
}
.library-artist-radio-btn:hover::before {
opacity: 1;
}
.library-artist-radio-btn:hover {
color: #ffffff;
border-color: rgba(var(--accent-rgb), 0.35);
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.2), 0 0 0 1px rgba(var(--accent-rgb), 0.1);
}
.library-artist-radio-btn:active {
transform: translateY(0);
box-shadow: none;
}
.library-artist-radio-btn .radio-icon {
font-size: 14px;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
z-index: 1;
}
.library-artist-radio-btn:hover .radio-icon {
transform: scale(1.15);
}
.library-artist-radio-btn .radio-text {
position: relative;
z-index: 1;
}
/* ─── Enhance Quality Modal ─── */
.enhance-modal-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.75);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
opacity: 1;
transition: opacity 0.3s ease;
}
.enhance-modal-overlay.hidden {
opacity: 0;
pointer-events: none;
}
.enhance-modal {
background: linear-gradient(135deg, #1a1a1a 0%, #121212 100%);
border: 1px solid rgba(79, 195, 247, 0.2);
border-radius: 16px;
width: 90%;
max-width: 820px;
max-height: 85vh;
display: flex;
flex-direction: column;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
animation: enhanceModalIn 0.3s ease-out;
}
@keyframes enhanceModalIn {
from { opacity: 0; transform: scale(0.92) translateY(10px); }
to { opacity: 1; transform: scale(1) translateY(0); }
}
.enhance-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.enhance-modal-header h3 {
margin: 0;
font-size: 18px;
font-weight: 700;
color: #ffffff;
display: flex;
align-items: center;
gap: 10px;
}
.enhance-modal-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.5);
font-size: 24px;
cursor: pointer;
padding: 4px 8px;
border-radius: 8px;
transition: all 0.2s;
}
.enhance-modal-close:hover {
color: #ffffff;
background: rgba(255, 255, 255, 0.1);
}
.enhance-summary-bar {
display: flex;
gap: 10px;
padding: 16px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
flex-wrap: wrap;
}
.enhance-summary-chip {
display: flex;
flex-direction: column;
align-items: center;
padding: 10px 16px;
border-radius: 10px;
min-width: 70px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
}
.enhance-summary-chip .chip-count {
font-size: 20px;
font-weight: 700;
color: #ffffff;
}
.enhance-summary-chip .chip-label {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 2px;
}
.enhance-summary-chip.lossless .chip-label { color: #ffb84d; }
.enhance-summary-chip.high-lossy .chip-label { color: #81c784; }
.enhance-summary-chip.standard-lossy .chip-label { color: rgb(var(--accent-light-rgb)); }
.enhance-summary-chip.low-lossy .chip-label { color: #ef9a9a; }
.enhance-controls {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
gap: 12px;
}
.enhance-tier-selector {
display: flex;
align-items: center;
gap: 8px;
}
.enhance-tier-selector label {
font-size: 13px;
color: rgba(255, 255, 255, 0.7);
white-space: nowrap;
}
.enhance-tier-selector select {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
color: #ffffff;
padding: 6px 12px;
font-size: 13px;
outline: none;
cursor: pointer;
}
.enhance-tier-selector select:focus {
border-color: rgba(79, 195, 247, 0.4);
}
.enhance-select-controls {
display: flex;
gap: 8px;
align-items: center;
}
.enhance-select-btn {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.7);
padding: 5px 12px;
border-radius: 6px;
font-size: 12px;
cursor: pointer;
transition: all 0.2s;
}
.enhance-select-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
}
.enhance-selected-count {
font-size: 12px;
color: rgba(79, 195, 247, 0.9);
font-weight: 600;
}
.enhance-modal-body {
flex: 1;
overflow-y: auto;
padding: 0;
}
.enhance-track-table {
width: 100%;
border-collapse: collapse;
}
.enhance-track-table thead th {
position: sticky;
top: 0;
background: #1a1a1a;
padding: 10px 12px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.4);
text-align: left;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
z-index: 1;
}
.enhance-track-table thead th:first-child {
padding-left: 24px;
}
.enhance-track-table tbody tr {
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
transition: background 0.15s;
}
.enhance-track-table tbody tr:hover {
background: rgba(255, 255, 255, 0.03);
}
.enhance-track-table tbody td {
padding: 10px 12px;
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
}
.enhance-track-table tbody td:first-child {
padding-left: 24px;
}
.enhance-track-row.above-threshold {
opacity: 0.35;
}
.enhance-track-row.above-threshold td {
color: rgba(255, 255, 255, 0.4);
}
.enhance-track-row input[type="checkbox"] {
accent-color: rgb(var(--accent-rgb));
width: 16px;
height: 16px;
cursor: pointer;
}
.enhance-format-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.enhance-format-badge.lossless {
color: #ffb84d;
background: rgba(255, 184, 77, 0.12);
}
.enhance-format-badge.high-lossy {
color: #81c784;
background: rgba(129, 199, 132, 0.12);
}
.enhance-format-badge.standard-lossy {
color: rgb(var(--accent-light-rgb));
background: rgba(var(--accent-rgb), 0.12);
}
.enhance-format-badge.low-lossy {
color: #ef9a9a;
background: rgba(239, 154, 154, 0.12);
}
.enhance-format-badge.unknown {
color: rgba(255, 255, 255, 0.4);
background: rgba(255, 255, 255, 0.05);
}
.enhance-bitrate {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.enhance-modal-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 24px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.enhance-footer-info {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
}
.enhance-footer-actions {
display: flex;
gap: 10px;
}
.enhance-btn {
padding: 10px 20px;
border-radius: 10px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
border: none;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.enhance-btn.secondary {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.7);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.enhance-btn.secondary:hover {
background: rgba(255, 255, 255, 0.14);
color: #ffffff;
}
.enhance-btn.primary {
background: linear-gradient(135deg, rgba(79, 195, 247, 0.9), rgba(41, 182, 246, 0.9));
color: #ffffff;
}
.enhance-btn.primary:hover {
background: linear-gradient(135deg, rgba(79, 195, 247, 1), rgba(41, 182, 246, 1));
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(79, 195, 247, 0.3);
}
.enhance-btn.primary:disabled {
opacity: 0.4;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
.enhance-btn .enhance-spinner {
display: inline-block;
width: 14px;
height: 14px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top-color: #ffffff;
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin-right: 8px;
vertical-align: middle;
}
/* Wishlist enhance badge */
.wishlist-enhance-badge {
display: inline-block;
padding: 1px 6px;
border-radius: 4px;
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: #4fc3f7;
background: rgba(79, 195, 247, 0.12);
margin-left: 6px;
}
.artist-detail-info {
display: flex;
align-items: center;
gap: 24px;
flex: 1;
}
.artist-detail-image {
width: 80px;
height: 80px;
border-radius: 40px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border: 3px solid rgba(var(--accent-rgb), 0.3);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
/* Fallback gradient if no image */
background-image: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.3) 0%,
rgba(24, 156, 71, 0.2) 100%);
}
.artist-detail-name {
font-size: 32px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
line-height: 1.2;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-detail-genres {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
font-weight: 500;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-detail-content {
margin-bottom: 40px;
}
.artist-detail-tabs {
display: flex;
gap: 8px;
margin-bottom: 30px;
padding: 6px;
background: rgba(255, 255, 255, 0.06);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.artist-tab {
display: flex;
align-items: center;
gap: 10px;
padding: 14px 24px;
font-size: 14px;
font-weight: 600;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
background: transparent;
color: rgba(255, 255, 255, 0.6);
border: none;
border-radius: 16px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
outline: none;
}
.artist-tab.active {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(24, 156, 71, 0.15) 100%);
color: rgba(var(--accent-rgb), 1.0);
box-shadow:
0 4px 12px rgba(var(--accent-rgb), 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.artist-tab:not(.active):hover {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.8);
transform: translateY(-1px);
}
.tab-icon {
font-size: 16px;
}
.artist-detail-discography {
min-height: 400px;
}
.tab-content {
display: none;
opacity: 0;
transform: translateY(10px);
transition: all 0.3s ease;
}
.tab-content.active {
display: block;
opacity: 1;
transform: translateY(0);
}
.album-cards-container,
.singles-cards-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 20px;
}
/* Album Card — full-bleed image with info overlay, matching similar artist cards */
.album-card {
position: relative;
background: rgba(18, 18, 18, 1);
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.06);
overflow: hidden;
cursor: pointer;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1),
border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
aspect-ratio: 1;
}
.album-card:hover {
transform: translateY(-5px) scale(1.02);
border-color: rgba(var(--accent-rgb), 0.25);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5),
0 0 24px rgba(var(--accent-rgb), 0.12);
}
.album-card.has-dynamic-glow {
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.album-card.has-dynamic-glow:hover {
filter: none;
border-color: color-mix(in srgb, var(--glow-color-1) 30%, transparent);
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 0 20px color-mix(in srgb, var(--glow-color-1) 15%, transparent);
}
/* Gradient overlay for text readability */
.album-card::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.95) 0%,
rgba(0, 0, 0, 0.7) 25%,
rgba(0, 0, 0, 0.2) 50%,
transparent 70%);
pointer-events: none;
z-index: 1;
}
.album-card:hover::after {
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.95) 0%,
rgba(0, 0, 0, 0.6) 30%,
rgba(0, 0, 0, 0.15) 55%,
transparent 75%);
}
.album-card-image {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
background-color: rgba(255, 255, 255, 0.03);
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 0;
}
.album-card:hover .album-card-image {
transform: scale(1.06);
}
.album-card-image::after {
display: none;
}
/* Info pinned at bottom over gradient */
.album-card-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 14px;
z-index: 2;
}
.album-card-name {
font-size: 14px;
font-weight: 700;
color: #fff;
margin-bottom: 3px;
line-height: 1.25;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
letter-spacing: -0.2px;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}
.album-card-year {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
font-weight: 500;
margin-bottom: 0;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.album-card-type {
display: none; /* Type is in the completion overlay or implied by the tab */
}
@media (max-width: 900px) {
.album-cards-container,
.singles-cards-container {
grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
gap: 14px;
}
}
@media (max-width: 600px) {
.album-cards-container,
.singles-cards-container {
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 10px;
}
.album-card {
border-radius: 10px;
}
.album-card-content {
padding: 10px;
}
.album-card-name {
font-size: 12px;
}
}
/* Completion Status Overlay */
.completion-overlay {
position: absolute;
top: 12px;
right: 12px;
padding: 6px 12px;
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
border-radius: 12px;
backdrop-filter: blur(8px);
border: 1px solid;
z-index: 10;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
/* Smooth entrance animation */
animation: completionOverlayFadeIn 0.6s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
/* Completion status variants */
.completion-overlay.completed {
background: linear-gradient(135deg,
rgba(46, 204, 64, 0.9) 0%,
rgba(34, 139, 47, 0.95) 100%);
color: #ffffff;
border-color: rgba(46, 204, 64, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(46, 204, 64, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.completion-overlay.nearly_complete {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.9) 0%,
rgba(255, 152, 0, 0.95) 100%);
color: #ffffff;
border-color: rgba(255, 193, 7, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(255, 193, 7, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.completion-overlay.partial {
background: linear-gradient(135deg,
rgba(255, 111, 97, 0.9) 0%,
rgba(255, 87, 51, 0.95) 100%);
color: #ffffff;
border-color: rgba(255, 111, 97, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(255, 111, 97, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.completion-overlay.missing {
background: linear-gradient(135deg,
rgba(108, 117, 125, 0.9) 0%,
rgba(73, 80, 87, 0.95) 100%);
color: rgba(255, 255, 255, 0.9);
border-color: rgba(108, 117, 125, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(108, 117, 125, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.completion-overlay.downloading {
background: linear-gradient(135deg,
rgba(255, 165, 0, 0.9) 0%,
rgba(255, 140, 0, 0.95) 100%);
color: #ffffff;
border-color: rgba(255, 165, 0, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(255, 165, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
animation: downloadingPulse 2s ease-in-out infinite;
}
@keyframes downloadingPulse {
0%,
100% {
transform: scale(1);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(255, 165, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
50% {
transform: scale(1.02);
box-shadow:
0 6px 16px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(255, 165, 0, 0.4),
inset 0 1px 0 rgba(255, 255, 255, 0.3),
0 0 12px rgba(255, 165, 0, 0.3);
}
}
.completion-overlay.downloaded {
background: linear-gradient(135deg,
rgba(40, 167, 69, 0.9) 0%,
rgba(34, 139, 58, 0.95) 100%);
color: #ffffff;
border-color: rgba(40, 167, 69, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(40, 167, 69, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.completion-overlay.error {
background: linear-gradient(135deg,
rgba(220, 53, 69, 0.9) 0%,
rgba(176, 42, 55, 0.95) 100%);
color: #ffffff;
border-color: rgba(220, 53, 69, 0.6);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 0 0 1px rgba(220, 53, 69, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
/* Hover effects for completion overlays */
.album-card:hover .completion-overlay,
.artist-card:hover .completion-overlay {
transform: scale(1.05);
box-shadow:
0 6px 16px rgba(0, 0, 0, 0.4),
0 0 0 1px currentColor,
inset 0 1px 0 rgba(255, 255, 255, 0.25);
}
/* Loading state for completion overlay */
.completion-overlay.checking {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.9) 0%,
rgba(24, 156, 71, 0.95) 100%);
color: #ffffff;
border-color: rgba(var(--accent-rgb), 0.6);
animation: completionOverlayPulse 2s ease-in-out infinite;
}
/* Progress indicator inside overlay for detailed completion info */
.completion-overlay .completion-progress {
display: block;
font-size: 9px;
margin-top: 2px;
opacity: 0.8;
font-weight: 500;
}
/* Completion overlay animations */
@keyframes completionOverlayFadeIn {
from {
opacity: 0;
transform: translateY(-4px) scale(0.8);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@keyframes completionOverlayPulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.05);
}
}
/* Loading states for album cards */
.album-card.loading .album-card-image {
background: linear-gradient(90deg,
rgba(26, 26, 26, 0.8) 0%,
rgba(40, 40, 40, 0.8) 50%,
rgba(26, 26, 26, 0.8) 100%);
background-size: 200% 100%;
animation: albumCardShimmer 1.5s ease-in-out infinite;
}
@keyframes albumCardShimmer {
0% {
background-position: -200% 0;
}
100% {
background-position: 200% 0;
}
}
/* Responsive adjustments for detail view */
@media (max-width: 768px) {
.artist-detail-header {
flex-direction: column;
align-items: flex-start;
gap: 20px;
}
.artist-detail-info {
width: 100%;
}
.artist-detail-name {
font-size: 24px;
}
.album-cards-container,
.singles-cards-container {
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 16px;
}
.artist-detail-tabs {
overflow-x: auto;
padding-bottom: 5px;
}
}
/* ===============================
ARTIST DOWNLOADS MANAGEMENT STYLES
=============================== */
/* Artist Downloads Section */
.artist-downloads-section {
padding: 0 20px;
animation: fadeInUp 0.5s ease-out;
width: 100%;
}
.artist-downloads-header {
margin-bottom: 20px;
text-align: center;
}
.artist-downloads-title {
font-size: 20px;
font-weight: 700;
color: rgba(255, 255, 255, 0.9);
margin: 0 0 8px;
font-family: "SF Pro Display", -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-downloads-subtitle {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
margin: 0;
}
.artist-bubble-container {
display: flex;
flex-wrap: wrap;
gap: 24px;
justify-content: center;
align-items: center;
padding: 12px;
}
/* Artist Bubble Card */
.artist-bubble-card {
position: relative;
width: 150px;
height: 150px;
border-radius: 50%;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border: 2px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.artist-bubble-card:hover {
transform: translateY(-3px) scale(1.05);
border-color: rgba(var(--accent-rgb), 0.3);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.2),
0 0 15px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.artist-bubble-card.all-completed {
border-color: rgba(var(--accent-rgb), 0.4);
}
.artist-bubble-card.all-completed:hover {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.3),
0 0 15px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.artist-bubble-image {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 50%;
overflow: hidden;
}
.artist-bubble-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.3) 0%,
rgba(0, 0, 0, 0.6) 100%);
border-radius: 50%;
}
.artist-bubble-content {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 8px;
text-align: center;
z-index: 2;
}
.artist-bubble-name {
font-size: 10px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
line-height: 1.2;
margin-bottom: 2px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.artist-bubble-status {
font-size: 8px;
color: rgba(255, 255, 255, 0.7);
line-height: 1.1;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.bulk-complete-indicator {
position: absolute;
top: -4px;
right: -4px;
width: 24px;
height: 24px;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.95) 0%,
rgba(21, 128, 61, 0.95) 100%);
border-radius: 50%;
border: 2px solid rgba(255, 255, 255, 0.9);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 3;
transition: all 0.2s ease;
box-shadow:
0 2px 8px rgba(var(--accent-rgb), 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.2);
}
.bulk-complete-indicator:hover {
transform: scale(1.1);
box-shadow:
0 4px 12px rgba(var(--accent-rgb), 0.6),
0 0 0 1px rgba(var(--accent-rgb), 0.3);
}
.bulk-complete-icon {
font-size: 12px;
color: white;
}
/* Artist Download Management Modal */
.artist-download-management-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
animation: modalOverlayFadeIn 0.4s ease-out;
}
.artist-download-modal-overlay {
position: absolute;
inset: 0;
background: rgba(18, 18, 18, 0.85);
backdrop-filter: blur(12px);
z-index: 1;
}
.artist-download-modal-content {
position: relative;
/* Premium glassmorphic foundation matching download modal */
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
width: 700px;
max-width: 95vw;
max-height: 80vh;
z-index: 2;
overflow: hidden;
display: flex;
flex-direction: column;
/* Premium shadow effect */
box-shadow:
0 25px 80px rgba(0, 0, 0, 0.7),
0 10px 40px rgba(0, 0, 0, 0.5),
0 0 50px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
/* Smooth animation */
transform: scale(1);
transition: transform 0.4s ease-in-out;
animation: modalFadeIn 0.4s ease-out;
}
.artist-download-modal-header {
padding: 0;
display: flex;
flex-direction: column;
overflow: hidden;
/* Enhanced gradient with subtle transparency and glow */
background: linear-gradient(135deg,
rgba(45, 45, 45, 0.8) 0%,
rgba(26, 26, 26, 0.9) 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
/* Subtle inner glow */
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Artist Modal Hero Section */
.artist-download-modal-hero {
display: flex;
align-items: center;
padding: 20px 28px;
gap: 20px;
position: relative;
min-height: 100px;
}
.artist-download-modal-hero-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-size: cover;
background-position: center;
opacity: 0.15;
filter: blur(8px);
z-index: 1;
}
.artist-download-modal-hero-bg::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.7) 0%,
rgba(0, 0, 0, 0.3) 100%);
}
.artist-download-modal-hero-content {
display: flex;
align-items: center;
gap: 20px;
position: relative;
z-index: 2;
flex: 1;
}
.artist-download-modal-hero-image {
width: 70px;
height: 70px;
border-radius: 50%;
object-fit: cover;
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
flex-shrink: 0;
}
.artist-download-modal-hero-image:hover {
transform: scale(1.05);
box-shadow:
0 12px 32px rgba(0, 0, 0, 0.5),
0 6px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.artist-download-modal-hero-avatar {
position: relative;
z-index: 2;
flex-shrink: 0;
}
.artist-download-modal-hero-fallback {
width: 70px;
height: 70px;
border-radius: 50%;
background: linear-gradient(135deg,
rgba(60, 60, 60, 0.9) 0%,
rgba(30, 30, 30, 0.9) 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: #999;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.artist-download-modal-hero-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
min-width: 0;
}
.artist-download-modal-hero-overlay {
display: flex;
align-items: center;
position: relative;
z-index: 2;
width: 100%;
}
.artist-download-modal-hero-title {
color: #ffffff;
font-size: 20px;
font-weight: 700;
margin: 0;
line-height: 1.2;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.artist-download-modal-hero-subtitle {
color: #e0e0e0;
font-size: 14px;
font-weight: 500;
margin: 0;
opacity: 0.9;
}
.artist-download-modal-header-actions {
position: relative;
z-index: 3;
padding: 16px 24px 0 0;
display: flex;
justify-content: flex-end;
}
.artist-download-modal-title {
font-size: 20px;
font-weight: 700;
color: rgba(255, 255, 255, 0.95);
margin: 0;
flex: 1;
font-family: "SF Pro Display", -apple-system, BlinkMacSystemFont, sans-serif;
}
.artist-download-modal-close {
font-size: 24px;
color: rgba(255, 255, 255, 0.6);
cursor: pointer;
padding: 4px;
border-radius: 6px;
transition: all 0.2s ease;
line-height: 1;
}
.artist-download-modal-close:hover {
color: rgba(255, 255, 255, 0.9);
background: rgba(255, 255, 255, 0.1);
}
.artist-download-modal-body {
flex: 1;
padding: 16px 28px 25px 28px;
overflow-y: auto;
display: flex;
flex-direction: column;
}
.artist-download-items {
display: flex;
flex-direction: column;
gap: 16px;
}
.artist-download-item {
display: flex;
align-items: center;
padding: 20px;
gap: 16px;
/* Premium glassmorphic card matching download modal */
background: linear-gradient(135deg,
rgba(35, 35, 35, 0.7) 0%,
rgba(25, 25, 25, 0.8) 100%);
backdrop-filter: blur(10px) saturate(1.1);
border: 1px solid rgba(255, 255, 255, 0.1);
border-top: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 16px;
transition: all 0.3s ease;
/* Premium shadow with subtle glow */
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.4),
0 4px 16px rgba(0, 0, 0, 0.2),
0 0 20px rgba(var(--accent-rgb), 0.08),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.artist-download-item:hover {
transform: translateY(-2px);
background: linear-gradient(135deg,
rgba(40, 40, 40, 0.8) 0%,
rgba(30, 30, 30, 0.9) 100%);
border-color: rgba(255, 255, 255, 0.15);
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(0, 0, 0, 0.3),
0 0 25px rgba(var(--accent-rgb), 0.12),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
/* Album artwork in download items */
.download-item-artwork {
position: relative;
flex-shrink: 0;
}
.download-item-image {
width: 50px;
height: 50px;
border-radius: 12px;
object-fit: cover;
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.3),
0 2px 6px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
}
.artist-download-item:hover .download-item-image {
transform: scale(1.05);
box-shadow:
0 6px 16px rgba(0, 0, 0, 0.4),
0 3px 8px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
/* Fallback icon when no album image */
.download-item-fallback {
width: 50px;
height: 50px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(var(--accent-light-rgb), 0.1) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.3);
font-size: 18px;
color: rgba(var(--accent-rgb), 0.8);
transition: all 0.3s ease;
}
.artist-download-item:hover .download-item-fallback {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.3) 0%,
rgba(var(--accent-light-rgb), 0.2) 100%);
border-color: rgba(var(--accent-rgb), 0.4);
color: rgba(var(--accent-rgb), 1);
transform: scale(1.05);
box-shadow:
0 4px 12px rgba(var(--accent-rgb), 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.download-item-info {
flex: 1;
}
.download-item-name {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 4px;
line-height: 1.3;
}
.download-item-type {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
text-transform: capitalize;
}
.download-item-actions {
margin-left: 16px;
}
.download-item-btn {
padding: 8px 16px;
border-radius: 8px;
border: none;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
min-width: 100px;
}
.download-item-btn.active {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.9) 0%,
rgba(24, 156, 71, 0.9) 100%);
color: white;
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.3);
}
.download-item-btn.active:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 1.0) 0%,
rgba(24, 156, 71, 1.0) 100%);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.4);
transform: translateY(-1px);
}
.download-item-btn.completed {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.9) 0%,
rgba(21, 128, 61, 0.9) 100%);
color: white;
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.3);
}
.download-item-btn.completed:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 1.0) 0%,
rgba(21, 128, 61, 1.0) 100%);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.4);
transform: translateY(-1px);
}
/* Dynamic glow effects for artist bubble cards */
.artist-bubble-card.has-dynamic-glow {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1),
filter 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.artist-bubble-card.has-dynamic-glow:hover {
filter: drop-shadow(0 0 6px var(--glow-color-1, rgb(var(--accent-rgb)))) drop-shadow(0 0 12px var(--glow-color-2, rgb(var(--accent-light-rgb))));
border-color: var(--glow-color-1, rgba(var(--accent-rgb), 0.4));
}
/* Responsive design for artist download modal */
@media (max-width: 768px) {
.artist-download-modal-content {
width: 95vw;
max-height: 90vh;
margin: 16px;
border-radius: 16px;
}
.artist-download-modal-hero {
padding: 16px 20px;
min-height: 80px;
}
.artist-download-modal-hero-content {
gap: 16px;
}
.artist-download-modal-hero-image,
.artist-download-modal-hero-fallback {
width: 60px;
height: 60px;
}
.artist-download-modal-hero-fallback {
font-size: 20px;
}
.artist-download-modal-hero-title {
font-size: 18px;
}
.artist-download-modal-hero-subtitle {
font-size: 13px;
}
.artist-download-modal-body {
padding: 12px 20px 20px 20px;
}
.artist-download-items {
gap: 12px;
}
.artist-download-item {
padding: 16px;
gap: 12px;
border-radius: 12px;
}
.download-item-image,
.download-item-fallback {
width: 40px;
height: 40px;
border-radius: 8px;
}
.download-item-fallback {
font-size: 14px;
}
.download-item-name {
font-size: 13px;
}
.download-item-type {
font-size: 11px;
}
.download-item-btn {
padding: 6px 12px;
font-size: 11px;
min-width: 80px;
}
.download-item-actions {
margin-left: 8px;
}
}
@media (max-width: 480px) {
.artist-download-modal-content {
width: 98vw;
margin: 8px;
border-radius: 12px;
}
.artist-download-modal-hero {
padding: 12px 16px;
min-height: 70px;
}
.artist-download-modal-hero-image,
.artist-download-modal-hero-fallback {
width: 50px;
height: 50px;
}
.artist-download-modal-hero-title {
font-size: 16px;
}
.artist-download-modal-body {
padding: 8px 16px 16px 16px;
}
.artist-download-item {
padding: 12px;
gap: 10px;
flex-direction: column;
text-align: center;
}
.download-item-artwork {
order: 1;
align-self: center;
}
.download-item-info {
order: 2;
text-align: center;
}
.download-item-actions {
order: 3;
margin-left: 0;
margin-top: 8px;
align-self: center;
}
.download-item-btn {
padding: 8px 16px;
min-width: 90px;
}
}
#metadata-updater-card {
justify-content: space-between;
}
/* ===============================
LIBRARY PAGE STYLING
=============================== */
.library-container {
height: 100%;
display: flex;
flex-direction: column;
padding: 20px;
gap: 20px;
}
/* Library Header */
.library-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.library-header-content {
flex: 1;
}
.library-title {
font-size: 28px;
font-weight: 700;
margin: 0 0 8px 0;
letter-spacing: -0.3px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
display: flex;
align-items: center;
gap: 14px;
}
.library-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
.library-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
font-weight: 500;
}
.library-stats {
display: flex;
gap: 24px;
}
.library-stat {
text-align: center;
}
.stat-number {
display: block;
font-size: 24px;
font-weight: 700;
color: rgb(var(--accent-light-rgb));
line-height: 1;
}
.stat-label {
display: block;
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 4px;
}
/* Library Controls */
.library-controls {
display: flex;
flex-direction: column;
gap: 16px;
}
/* Search Container */
.library-search-container {
position: relative;
max-width: 500px;
}
.library-search-input {
width: 100%;
padding: 14px 20px 14px 50px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
background: rgba(255, 255, 255, 0.05);
color: #ffffff;
font-size: 15px;
font-weight: 500;
transition: all 0.3s ease;
outline: none;
}
.library-search-input:focus {
border-color: rgba(var(--accent-rgb), 0.6);
background: rgba(255, 255, 255, 0.08);
box-shadow: 0 0 16px rgba(var(--accent-rgb), 0.2);
}
.library-search-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.library-search-icon {
position: absolute;
left: 16px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: rgba(255, 255, 255, 0.6);
pointer-events: none;
}
/* Alphabet Selector - Apple Style Design */
/* Watchlist Filter */
.watchlist-filter {
display: flex;
gap: 8px;
justify-content: center;
padding: 8px 0;
}
.watchlist-filter-btn {
padding: 6px 16px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
font-weight: 600;
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', system-ui, sans-serif;
cursor: pointer;
border-radius: 20px;
transition: all 0.2s ease-out;
}
.watchlist-filter-btn:hover {
color: rgba(255, 255, 255, 0.8);
border-color: rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.08);
}
.watchlist-filter-btn.active {
color: #fff;
border-color: rgba(var(--accent-rgb), 0.5);
background: rgba(var(--accent-rgb), 0.15);
}
.library-watchlist-all-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 16px;
border: 1px solid rgba(var(--accent-rgb), 0.4);
background: rgba(var(--accent-rgb), 0.12);
color: rgba(var(--accent-rgb), 1);
font-size: 13px;
font-weight: 600;
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', system-ui, sans-serif;
cursor: pointer;
border-radius: 20px;
transition: all 0.2s ease-out;
margin-left: 4px;
}
.library-watchlist-all-btn:hover {
background: rgba(var(--accent-rgb), 0.25);
border-color: rgba(var(--accent-rgb), 0.6);
transform: scale(1.02);
}
.library-watchlist-all-btn.adding {
opacity: 0.7;
pointer-events: none;
cursor: wait;
}
.library-watchlist-all-btn.all-added {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgba(var(--accent-rgb), 0.5);
color: #fff;
pointer-events: none;
}
.library-watchlist-all-btn .watchlist-all-icon {
font-size: 14px;
}
.library-watchlist-all-btn.hidden {
display: none;
}
/* ── Watch All Unwatched Modal ──────────────────────────── */
.watch-all-modal {
width: 880px; max-width: 95vw; max-height: 85vh;
background: linear-gradient(135deg, rgba(20,20,20,0.97) 0%, rgba(12,12,12,0.99) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255,255,255,0.1);
border-top: 1px solid rgba(255,255,255,0.15);
box-shadow: 0 20px 60px rgba(0,0,0,0.6), 0 8px 32px rgba(0,0,0,0.4),
0 0 40px rgba(var(--accent-rgb), 0.08), inset 0 1px 0 rgba(255,255,255,0.1);
display: flex; flex-direction: column; overflow: hidden;
}
.watch-all-header {
display: flex; align-items: center; justify-content: space-between;
padding: 20px 24px;
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.06) 0%, transparent 60%);
border-bottom: 1px solid rgba(var(--accent-rgb), 0.12);
}
.watch-all-header-content { display: flex; align-items: center; gap: 14px; }
.watch-all-header-icon { font-size: 28px; opacity: 0.9; }
.watch-all-title {
font-size: 20px; font-weight: 700; color: #fff; letter-spacing: -0.3px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.watch-all-subtitle { font-size: 13px; color: rgba(255,255,255,0.45); margin-top: 2px; }
.watch-all-close {
background: rgba(255,255,255,0.08); border: none; color: rgba(255,255,255,0.5);
width: 36px; height: 36px; border-radius: 50%; font-size: 20px; cursor: pointer;
display: flex; align-items: center; justify-content: center; transition: all 0.2s;
}
.watch-all-close:hover { background: rgba(255,255,255,0.15); color: #fff; transform: scale(1.1); }
.watch-all-body {
flex: 1; overflow-y: auto; padding: 0;
scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.15) transparent;
}
.watch-all-body::-webkit-scrollbar { width: 6px; }
.watch-all-body::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 3px; }
.watch-all-footer {
display: flex; justify-content: flex-end; gap: 10px;
padding: 16px 24px;
border-top: 1px solid rgba(255,255,255,0.06);
background: rgba(0,0,0,0.2);
}
.watch-all-btn {
padding: 10px 24px; border-radius: 10px; font-size: 14px; font-weight: 600;
border: none; cursor: pointer; transition: all 0.2s;
}
.watch-all-btn-cancel {
background: rgba(255,255,255,0.08); color: rgba(255,255,255,0.7);
}
.watch-all-btn-cancel:hover { background: rgba(255,255,255,0.12); color: #fff; }
.watch-all-btn-primary {
background: rgb(var(--accent-rgb)); color: #fff;
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}
.watch-all-btn-primary:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 6px 20px rgba(var(--accent-rgb), 0.4);
}
.watch-all-btn-primary:disabled { opacity: 0.4; cursor: default; }
/* Loading state */
.watch-all-loading-state {
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 64px 24px; gap: 16px;
}
.watch-all-loading-spinner {
width: 36px; height: 36px; border-radius: 50%;
border: 3px solid rgba(255,255,255,0.1); border-top-color: rgb(var(--accent-rgb));
animation: watch-all-spin 0.8s linear infinite;
}
@keyframes watch-all-spin { to { transform: rotate(360deg); } }
.watch-all-loading-text { color: rgba(255,255,255,0.6); font-size: 14px; }
.watch-all-loading-count { color: rgba(255,255,255,0.3); font-size: 13px; }
/* Stats cards */
.watch-all-stats {
display: flex; gap: 12px; padding: 16px 20px;
position: sticky; top: 0; z-index: 2;
background: linear-gradient(135deg, rgba(20,20,20,0.98) 0%, rgba(16,16,16,0.98) 100%);
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.watch-all-stat-card {
flex: 1; padding: 12px 16px; border-radius: 12px;
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
text-align: center; transition: all 0.2s;
}
.watch-all-stat-card:hover { border-color: rgba(255,255,255,0.1); background: rgba(255,255,255,0.05); }
.watch-all-stat-card.eligible { border-color: rgba(var(--accent-rgb), 0.2); }
.watch-all-stat-card.eligible .watch-all-stat-value { color: rgb(var(--accent-rgb)); }
.watch-all-stat-card.ineligible .watch-all-stat-value { color: rgba(255,180,80,0.8); }
.watch-all-stat-value { font-size: 22px; font-weight: 700; color: #fff; }
.watch-all-stat-label { font-size: 11px; color: rgba(255,255,255,0.4); margin-top: 2px; text-transform: uppercase; letter-spacing: 0.5px; }
/* Search */
.watch-all-search-wrap { padding: 8px 20px 4px; position: sticky; top: 78px; z-index: 2; background: rgba(16,16,16,0.95); }
.watch-all-search {
width: 100%; padding: 10px 16px; border-radius: 10px;
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08);
color: #fff; font-size: 14px; outline: none; transition: border-color 0.2s;
box-sizing: border-box;
}
.watch-all-search:focus { border-color: rgba(var(--accent-rgb), 0.4); }
.watch-all-search::placeholder { color: rgba(255,255,255,0.3); }
/* Section labels */
.watch-all-section-label {
padding: 12px 20px 6px; font-size: 11px; font-weight: 600;
color: rgba(255,255,255,0.35); text-transform: uppercase; letter-spacing: 1px;
}
/* Artist grid — two columns */
.watch-all-grid {
display: grid; grid-template-columns: 1fr 1fr; gap: 2px;
padding: 4px 12px 12px;
}
.watch-all-cell {
display: flex; align-items: center; gap: 10px;
padding: 8px 12px; border-radius: 10px;
transition: background 0.15s;
}
.watch-all-cell:hover { background: rgba(255,255,255,0.04); }
.watch-all-cell.dimmed { opacity: 0.4; }
.watch-all-cell-img {
width: 38px; height: 38px; flex-shrink: 0; border-radius: 50%; overflow: hidden;
background: rgba(255,255,255,0.06);
}
.watch-all-cell-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
.watch-all-cell-placeholder {
width: 38px; height: 38px; border-radius: 50%;
background: rgba(255,255,255,0.06);
display: flex; align-items: center; justify-content: center; font-size: 16px;
}
.watch-all-cell-name {
font-size: 13px; font-weight: 500; color: #fff;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
flex: 1; min-width: 0;
}
.watch-all-cell-meta { font-size: 11px; color: rgba(255,255,255,0.3); white-space: nowrap; }
/* Ineligible collapsible section */
.watch-all-ineligible {
border-top: 1px solid rgba(255,255,255,0.06); margin-top: 8px;
}
.watch-all-ineligible-header {
display: flex; justify-content: space-between; align-items: center;
padding: 12px 20px; cursor: pointer; transition: background 0.15s;
}
.watch-all-ineligible-header:hover { background: rgba(255,255,255,0.03); }
.watch-all-ineligible-label { display: flex; align-items: center; gap: 8px; font-size: 13px; color: rgba(255,180,80,0.7); }
.watch-all-ineligible-icon { font-size: 14px; }
.watch-all-chevron { font-size: 10px; color: rgba(255,255,255,0.3); transition: transform 0.25s; }
.watch-all-ineligible.expanded .watch-all-chevron { transform: rotate(180deg); }
.watch-all-ineligible-body {
max-height: 0; overflow: hidden; transition: max-height 0.35s ease;
}
.watch-all-ineligible.expanded .watch-all-ineligible-body { max-height: 400px; overflow-y: auto; }
.watch-all-ineligible-hint {
padding: 8px 20px 4px; font-size: 12px; color: rgba(255,255,255,0.3);
border-left: 3px solid rgba(255,180,80,0.3); margin: 0 20px 8px; padding-left: 12px;
}
/* Results state */
.watch-all-results {
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 64px 24px; gap: 8px;
}
.watch-all-results-icon {
width: 64px; height: 64px; border-radius: 50%;
background: rgba(var(--accent-rgb), 0.12); color: rgb(var(--accent-rgb));
display: flex; align-items: center; justify-content: center;
font-size: 32px; margin-bottom: 8px;
box-shadow: 0 0 24px rgba(var(--accent-rgb), 0.15);
}
.watch-all-results-title { font-size: 20px; font-weight: 600; color: #fff; }
.watch-all-results-detail { font-size: 13px; color: rgba(255,255,255,0.4); }
/* Empty / error state */
.watch-all-empty-state {
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 64px 24px; gap: 8px; color: rgba(255,255,255,0.5); font-size: 14px;
}
.watch-all-empty-icon { font-size: 36px; margin-bottom: 4px; opacity: 0.5; }
.watch-all-empty-hint { font-size: 12px; color: rgba(255,255,255,0.3); margin-top: 4px; }
.watch-all-retry-link { color: rgb(var(--accent-rgb)); text-decoration: none; margin-top: 8px; }
.watch-all-retry-link:hover { text-decoration: underline; }
.alphabet-selector {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
-ms-overflow-style: none;
}
.alphabet-selector::-webkit-scrollbar {
display: none;
}
.alphabet-selector-inner {
display: flex;
gap: 12px;
padding: 16px;
min-width: max-content;
justify-content: center;
align-items: center;
}
.alphabet-btn {
padding: 0;
border: none;
background: transparent;
color: rgba(255, 255, 255, 0.4);
font-size: 16px;
font-weight: 600;
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', system-ui, sans-serif;
cursor: pointer;
transition: all 0.2s ease-out;
min-width: 20px;
height: 32px;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
transform: scale(1);
text-shadow: none;
padding-top: 30px;
padding-bottom: 30px;
}
.alphabet-btn:hover {
color: #ffffff;
transform: scale(2.5);
margin-left: 15px;
margin-right: 15px;
text-shadow: 0 0 8px rgba(255, 255, 255, 0.8);
}
/* Neighbor scaling effect */
.alphabet-btn:hover+.alphabet-btn,
.alphabet-btn:has(+ .alphabet-btn:hover) {
transform: scale(1.8);
color: rgba(255, 255, 255, 0.7);
text-shadow: 0 0 4px rgba(255, 255, 255, 0.4);
}
.alphabet-btn:hover+.alphabet-btn+.alphabet-btn,
.alphabet-btn:has(+ .alphabet-btn + .alphabet-btn:hover) {
transform: scale(1.4);
color: rgba(255, 255, 255, 0.6);
}
.alphabet-btn.active {
color: #ffffff;
transform: scale(1.2);
text-shadow: 0 0 6px rgba(255, 255, 255, 0.6);
}
/* Library Content */
.library-content {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
/* Artists Grid */
.library-artists-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
padding: 20px 0;
flex: 1;
contain: layout style;
}
/* Library Artist Card — full-bleed photo style */
@keyframes cardFadeIn {
from {
opacity: 0;
transform: translateY(16px) scale(0.97);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.library-artist-card {
background: rgba(18, 18, 18, 1);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 0;
cursor: pointer;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1),
border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
flex-direction: column;
position: relative;
overflow: hidden;
aspect-ratio: 0.8;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
will-change: transform;
contain: layout style paint;
}
.library-artist-card:hover {
transform: translateY(-5px) scale(1.02);
border-color: rgba(var(--accent-rgb), 0.25);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5),
0 0 24px rgba(var(--accent-rgb), 0.12);
}
.library-artist-card:active {
transform: translateY(-2px) scale(1.01);
}
/* Artist Image — fills entire card */
.library-artist-image {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
border-radius: 0;
overflow: hidden;
border: none;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.08) 0%,
rgba(255, 255, 255, 0.03) 100%);
transition: none;
}
.library-artist-card:hover .library-artist-image {
border-color: transparent;
box-shadow: none;
}
.library-artist-image img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
.library-artist-card:hover .library-artist-image img {
transform: scale(1.06);
}
/* Artist Image Fallback */
.library-artist-image-fallback {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 56px;
color: rgba(255, 255, 255, 0.3);
background: linear-gradient(135deg,
rgba(30, 30, 30, 1) 0%,
rgba(20, 20, 20, 1) 100%);
}
/* Gradient overlay for text readability */
.library-artist-card::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.85) 0%,
rgba(0, 0, 0, 0.4) 35%,
transparent 60%);
pointer-events: none;
z-index: 1;
}
.library-artist-card:hover::after {
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.9) 0%,
rgba(0, 0, 0, 0.3) 40%,
transparent 65%);
}
/* Artist Info — pinned to bottom over the gradient */
.library-artist-info {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 16px;
z-index: 2;
display: flex;
flex-direction: column;
gap: 3px;
min-height: 0;
}
.library-artist-name {
font-size: 16px;
font-weight: 700;
color: #ffffff;
margin: 0;
line-height: 1.25;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.8),
0 1px 3px rgba(0, 0, 0, 0.9);
}
.library-artist-stats {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
font-weight: 500;
display: flex;
gap: 8px;
flex-wrap: wrap;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
}
.library-artist-stat {
white-space: nowrap;
}
/* Empty State */
.library-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
gap: 16px;
padding: 60px 20px;
}
.empty-icon {
font-size: 64px;
opacity: 0.3;
}
.empty-title {
font-size: 24px;
font-weight: 700;
color: rgba(255, 255, 255, 0.8);
}
.empty-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.5);
text-align: center;
max-width: 400px;
}
/* Pagination */
.library-pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 20px;
padding: 20px 0;
margin-top: auto;
}
.pagination-btn {
padding: 10px 16px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.8);
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.pagination-btn:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.1);
border-color: rgba(255, 255, 255, 0.2);
color: #ffffff;
}
.pagination-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.pagination-info {
color: rgba(255, 255, 255, 0.7);
font-size: 14px;
font-weight: 500;
}
/* Responsive Design */
@media (max-width: 1200px) {
.library-artists-grid {
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 16px;
}
}
@media (max-width: 768px) {
.library-container {
padding: 16px;
gap: 16px;
}
.library-header {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.library-stats {
align-self: stretch;
justify-content: center;
}
.library-artists-grid {
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 10px;
}
.library-artist-card {
border-radius: 12px;
aspect-ratio: 0.65;
}
.library-artist-info {
padding: 12px;
}
.library-artist-name {
font-size: 14px;
}
.card-badge-container {
top: 4px;
right: 4px;
gap: 2px;
}
.source-card-icon {
width: 18px;
height: 18px;
font-size: 7px;
border-radius: 3px;
}
.source-card-icon img {
width: 12px !important;
}
.watch-card-icon {
width: 18px !important;
height: 18px !important;
font-size: 8px !important;
}
}
/* ========================================
Artist Detail Page Styles
======================================== */
.artist-detail-header {
display: flex;
align-items: center;
gap: 20px;
width: 100%;
}
.back-btn {
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
backdrop-filter: blur(12px) saturate(1.1);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
padding: 12px 20px;
color: #ffffff;
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s cubic-bezier(0.4, 0.0, 0.2, 1);
text-decoration: none;
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
.back-btn:hover {
background: linear-gradient(135deg, rgba(40, 40, 40, 0.95) 0%, rgba(30, 30, 30, 0.98) 100%);
border-color: rgba(255, 255, 255, 0.15);
transform: translateY(-1px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
}
.artist-detail-title {
flex-grow: 1;
min-width: 0;
}
.artist-detail-title h2 {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin: 0 0 8px 0;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.artist-detail-stats {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.artist-stat {
color: #b3b3b3;
font-size: 14px;
font-weight: 500;
}
/* Artist Detail Content */
.artist-detail-content {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.artist-detail-loading,
.artist-detail-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
text-align: center;
padding: 40px 20px;
}
.artist-detail-loading .loading-spinner {
width: 40px;
height: 40px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top: 3px solid rgb(var(--accent-rgb));
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 20px;
}
.artist-detail-error .error-icon {
font-size: 48px;
margin-bottom: 16px;
}
.artist-detail-error h3 {
color: #ffffff;
font-size: 20px;
margin: 0 0 8px 0;
}
.artist-detail-error p {
color: #b3b3b3;
margin: 0 0 20px 0;
}
.retry-btn {
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
border: none;
border-radius: 12px;
padding: 12px 24px;
color: #ffffff;
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s cubic-bezier(0.4, 0.0, 0.2, 1);
}
.retry-btn:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)) 0%, rgb(var(--accent-rgb)) 100%);
transform: translateY(-1px);
box-shadow: 0 8px 25px rgba(var(--accent-rgb), 0.3);
}
/* Artist Info Section */
.artist-info-section {
display: flex;
gap: 30px;
padding: 30px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
margin-bottom: 30px;
background: linear-gradient(135deg, rgba(26, 26, 26, 0.3) 0%, rgba(18, 18, 18, 0.5) 100%);
border-radius: 20px;
padding: 32px;
backdrop-filter: blur(8px);
border: 1px solid rgba(255, 255, 255, 0.05);
}
.artist-image-container {
position: relative;
flex-shrink: 0;
}
#artist-hero-section #artist-detail-image {
width: 100%;
height: auto;
max-width: 40vw;
}
.artist-detail-image {
width: 200px;
height: 200px;
border-radius: 16px;
object-fit: cover;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.artist-image-fallback {
width: 200px;
height: 200px;
border-radius: 16px;
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 64px;
}
.artist-info {
flex: 1;
min-width: 0;
}
.artist-info h1 {
font-size: 48px;
font-weight: 800;
color: #ffffff;
margin: 0 0 12px 0;
line-height: 1.1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.artist-genres {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 24px;
}
.genre-tag {
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 20px;
padding: 6px 14px;
color: #ffffff;
font-size: 12px;
font-weight: 500;
text-transform: capitalize;
}
.artist-summary-stats {
display: flex;
gap: 40px;
flex-wrap: wrap;
}
.summary-stat {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.stat-number {
font-size: 32px;
font-weight: 800;
color: rgb(var(--accent-rgb));
line-height: 1;
margin-bottom: 6px;
}
.stat-label {
font-size: 14px;
color: #b3b3b3;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* Discography Filters */
.discography-filters {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 0 20px;
flex-wrap: wrap;
}
.filter-group {
display: flex;
align-items: center;
gap: 6px;
}
.filter-label {
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.35);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-right: 4px;
}
.filter-divider {
width: 1px;
height: 24px;
background: rgba(255, 255, 255, 0.1);
margin: 0 4px;
}
.discography-filter-btn {
padding: 5px 14px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
font-weight: 600;
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', system-ui, sans-serif;
cursor: pointer;
border-radius: 16px;
transition: all 0.2s ease-out;
}
.discography-filter-btn:hover {
color: rgba(255, 255, 255, 0.8);
border-color: rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.08);
}
.discography-filter-btn.active {
color: #fff;
border-color: rgba(var(--accent-rgb), 0.5);
background: rgba(var(--accent-rgb), 0.15);
}
/* Discography Sections */
.discography-sections {
display: flex;
flex-direction: column;
gap: 40px;
}
.discography-section {
opacity: 1;
/* Show immediately instead of animation for now */
}
/* Animation keyframes for future use */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
padding-bottom: 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.section-header h3 {
font-size: 24px;
font-weight: 700;
color: #ffffff;
margin: 0;
}
.section-stats {
display: flex;
gap: 16px;
color: #b3b3b3;
font-size: 14px;
font-weight: 500;
}
.releases-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 16px;
padding: 8px 0;
}
/* Release Cards */
.release-card {
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
backdrop-filter: blur(12px) saturate(1.1);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 14px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
position: relative;
overflow: hidden;
display: flex;
flex-direction: column;
height: 300px;
/* Fixed height for consistent layout */
}
.discography-sections .release-card {
height: fit-content;
}
.release-card:hover {
background: linear-gradient(135deg, rgba(40, 40, 40, 0.95) 0%, rgba(30, 30, 30, 0.98) 100%);
border-color: rgba(255, 255, 255, 0.15);
transform: translateY(-4px);
box-shadow: 0 12px 35px rgba(0, 0, 0, 0.4);
}
.release-card.missing {
opacity: 0.6;
background: linear-gradient(135deg, rgba(60, 60, 60, 0.3) 0%, rgba(40, 40, 40, 0.5) 100%);
border-color: rgba(255, 255, 255, 0.05);
}
.release-card.missing:hover {
opacity: 0.8;
background: linear-gradient(135deg, rgba(70, 70, 70, 0.4) 0%, rgba(50, 50, 50, 0.6) 100%);
}
.release-image {
width: 100%;
aspect-ratio: 1;
border-radius: 12px;
object-fit: cover;
margin-bottom: 12px;
border: 1px solid rgba(255, 255, 255, 0.1);
flex-shrink: 0;
}
.release-image-fallback {
width: 100%;
aspect-ratio: 1;
border-radius: 12px;
background: linear-gradient(135deg, rgba(60, 60, 60, 0.6) 0%, rgba(40, 40, 40, 0.8) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
margin-bottom: 12px;
flex-shrink: 0;
color: rgba(255, 255, 255, 0.6);
}
.release-title {
font-size: 16px;
font-weight: 600;
color: #ffffff;
margin: 0 0 6px 0;
line-height: 1.3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.release-year {
font-size: 14px;
color: #b3b3b3;
margin: 0 0 8px 0;
}
.release-completion {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 11px;
margin-top: auto;
padding-top: 8px;
border-top: 1px solid rgba(255, 255, 255, 0.05);
}
.completion-text {
color: #b3b3b3;
}
.completion-text.complete {
color: rgb(var(--accent-rgb));
font-weight: 600;
}
.completion-text.partial {
color: #ffa500;
font-weight: 600;
}
.completion-text.missing {
color: #ff6b6b;
font-weight: 600;
}
.completion-bar {
width: 60px;
height: 4px;
background: rgba(255, 255, 255, 0.1);
border-radius: 2px;
overflow: hidden;
}
.completion-fill {
height: 100%;
border-radius: 2px;
transition: width 0.3s cubic-bezier(0.4, 0.0, 0.2, 1);
}
.completion-fill.complete {
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
}
.completion-fill.partial {
background: linear-gradient(90deg, #ffa500, #ffb347);
}
.completion-fill.missing {
background: linear-gradient(90deg, #ff6b6b, #ff8e8e);
width: 0%;
}
/* Checking state - lazy-load ownership streaming */
.release-card.checking {
opacity: 0.75;
animation: cardCheckingPulse 1.8s ease-in-out infinite;
}
@keyframes cardCheckingPulse {
0%,
100% {
opacity: 0.75;
}
50% {
opacity: 0.55;
}
}
.completion-text.checking {
color: #888;
font-weight: 400;
}
.completion-fill.checking {
background: linear-gradient(90deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.08));
background-size: 200% 100%;
animation: checkingBarShimmer 1.5s ease-in-out infinite;
}
@keyframes checkingBarShimmer {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
/* Responsive Design */
@media (max-width: 768px) {
.artist-detail-header {
flex-direction: column;
align-items: flex-start;
gap: 16px;
}
.artist-detail-title h2 {
font-size: 24px;
white-space: normal;
}
.artist-info-section {
flex-direction: column;
align-items: center;
text-align: center;
gap: 20px;
}
.artist-detail-image,
.artist-image-fallback {
width: 150px;
height: 150px;
}
.artist-info h1 {
font-size: 36px;
white-space: normal;
text-align: center;
}
.artist-summary-stats {
justify-content: center;
gap: 30px;
}
.section-header {
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.releases-grid {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 16px;
}
.release-card {
padding: 12px;
}
}
/* ===============================
ARTIST HERO SECTION (Modal-inspired design)
=============================== */
.artist-hero-section {
background: linear-gradient(135deg, rgba(26, 26, 26, 0.95) 0%, rgba(18, 18, 18, 0.98) 100%);
backdrop-filter: blur(12px) saturate(1.1);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
margin: 20px;
padding: 28px 32px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
.artist-hero-content {
display: flex;
align-items: flex-start;
gap: 28px;
}
/* Identity block — name + badges stacked */
.artist-hero-identity {
margin-bottom: 12px;
}
/* Numbers row — listeners + plays */
.artist-hero-numbers {
display: flex;
gap: 10px;
margin-top: 14px;
}
/* Right column — top tracks */
.artist-hero-right {
flex-shrink: 0;
width: 280px;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.04);
border-radius: 12px;
padding: 16px 18px;
align-self: stretch;
display: flex;
flex-direction: column;
}
.artist-image-container {
position: relative;
flex-shrink: 0;
}
.artist-image {
width: 160px;
height: 160px;
border-radius: 14px;
object-fit: cover;
border: 2px solid rgba(var(--accent-rgb), 0.25);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.4);
display: block;
}
.artist-image-fallback {
width: 160px;
height: 160px;
border-radius: 14px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-light-rgb), 0.1) 100%);
border: 2px solid rgba(var(--accent-rgb), 0.3);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: center;
font-size: 40px;
color: rgba(255, 255, 255, 0.6);
position: absolute;
top: 0;
left: 0;
}
.artist-image:not([src=""]):not([src])+.artist-image-fallback,
.artist-image[src]:not([src=""])+.artist-image-fallback {
display: none;
}
.artist-info {
flex: 1;
min-width: 0;
}
.artist-hero-section .artist-name {
font-size: 2.2em;
font-weight: 700;
color: #ffffff;
margin: 0 0 10px 0;
line-height: 1.1;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
letter-spacing: -0.02em;
}
/* Hero badges — horizontal icon row */
.artist-hero-badges {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
margin-bottom: 10px;
}
.artist-hero-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
margin-bottom: 12px;
}
.artist-hero-badge {
width: 36px;
height: 36px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
justify-content: center;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.artist-hero-badge img {
width: 20px;
height: 20px;
object-fit: contain;
opacity: 0.8;
}
/* Invert dark SVG logos for Tidal and Qobuz */
.artist-hero-badge[title="Tidal"] img,
.artist-hero-badge[title="Qobuz"] img {
filter: invert(1);
}
.artist-hero-badge[data-url] {
cursor: pointer;
}
.artist-hero-badge[data-url]:hover {
background: rgba(255, 255, 255, 0.12);
border-color: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.artist-hero-badge[data-url]:hover img {
opacity: 1;
}
.artist-hero-badge:not([data-url]) {
cursor: default;
}
.artist-genres-container {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 12px;
}
/* Collection progress bars — below listener/play stats */
.collection-overview {
display: flex;
flex-direction: column;
gap: 8px;
margin-top: 14px;
}
/* Per-artist enrichment coverage */
.artist-enrichment-coverage {
margin-top: 16px;
}
.artist-enrichment-coverage .artist-enrich-title {
color: rgba(255, 255, 255, 0.35);
font-size: 0.65em;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
margin-bottom: 10px;
}
.artist-enrich-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 12px 10px;
}
.artist-enrich-circle {
display: flex;
flex-direction: column;
align-items: center;
gap: 5px;
cursor: default;
transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.artist-enrich-circle:hover {
transform: scale(1.12);
}
.artist-enrich-circle:hover .ring-pct {
color: rgba(255, 255, 255, 0.9);
}
.artist-enrich-circle:hover .artist-enrich-label {
color: rgba(255, 255, 255, 0.7);
}
.artist-enrich-ring {
position: relative;
width: 48px;
height: 48px;
filter: drop-shadow(0 0 0px transparent);
transition: filter 0.3s ease;
}
.artist-enrich-circle:hover .artist-enrich-ring {
filter: drop-shadow(0 0 6px var(--ring-color, rgba(255, 255, 255, 0.2)));
}
.artist-enrich-ring svg {
transform: rotate(-90deg);
width: 48px;
height: 48px;
}
.artist-enrich-ring .ring-bg {
fill: none;
stroke: rgba(255, 255, 255, 0.06);
stroke-width: 3;
}
.artist-enrich-ring .ring-fill {
fill: none;
stroke-width: 3;
stroke-linecap: round;
}
.artist-enrich-ring .ring-pct {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
font-weight: 700;
color: rgba(255, 255, 255, 0.5);
transition: color 0.25s ease;
}
.artist-enrich-label {
font-size: 0.7em;
color: rgba(255, 255, 255, 0.4);
font-weight: 500;
text-align: center;
line-height: 1.1;
transition: color 0.25s ease;
}
@keyframes ringFillIn {
from { stroke-dashoffset: var(--ring-circ); }
to { stroke-dashoffset: var(--ring-offset); }
}
@keyframes ringPctFade {
0% { opacity: 0; transform: scale(0.7); }
60% { opacity: 0; transform: scale(0.7); }
100% { opacity: 1; transform: scale(1); }
}
.collection-category {
flex: 1;
display: flex;
align-items: center;
gap: 10px;
padding: 0;
background: none;
border: none;
}
.category-label {
color: rgba(255, 255, 255, 0.5);
font-weight: 600;
font-size: 0.75em;
min-width: 52px;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.category-stats {
color: rgba(255, 255, 255, 0.45);
font-size: 0.75em;
font-weight: 500;
min-width: 32px;
text-align: right;
font-variant-numeric: tabular-nums;
}
.completion-bar {
flex: 1;
height: 4px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
overflow: hidden;
position: relative;
}
.completion-fill {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
border-radius: 2px;
position: relative;
}
.completion-fill::after {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%);
animation: shimmer 2s infinite;
}
@keyframes shimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
/* Bio section */
.artist-hero-bio {
font-size: 0.82em;
color: rgba(255, 255, 255, 0.45);
line-height: 1.6;
margin-bottom: 14px;
padding: 10px 14px;
background: rgba(255, 255, 255, 0.02);
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.04);
padding: 16px 20px 32px;
max-height: 8em;
overflow: hidden;
position: relative;
transition: max-height 0.4s ease;
}
.artist-hero-bio.expanded {
max-height: 500px;
}
.artist-hero-bio-toggle {
color: rgb(var(--accent-rgb));
cursor: pointer;
font-size: 0.82em;
font-weight: 600;
display: block;
margin-top: 8px;
padding: 4px 0;
}
.artist-hero-bio-toggle:hover {
text-decoration: underline;
}
/* Stats — listener/play count boxes */
.artist-hero-stat {
display: flex;
flex-direction: column;
align-items: center;
padding: 10px 18px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
min-width: 80px;
transition: border-color 0.2s;
}
.artist-hero-stat:hover {
border-color: rgba(255, 255, 255, 0.1);
}
.hero-stat-value {
font-size: 1.25em;
font-weight: 700;
color: #fff;
letter-spacing: -0.02em;
line-height: 1.2;
}
.hero-stat-label {
font-size: 0.65em;
color: rgba(255, 255, 255, 0.35);
text-transform: uppercase;
letter-spacing: 0.06em;
margin-top: 3px;
}
/* Right column is now the sidebar itself — styled by .artist-hero-right */
.hero-sidebar-title {
font-size: 0.75em;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 10px;
}
.hero-top-tracks {
display: flex;
flex-direction: column;
gap: 4px;
max-height: 500px;
overflow-y: auto;
overflow-x: hidden;
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
}
@media (max-width: 768px) {
.hero-top-tracks {
max-height: 300px;
}
}
.hero-top-track {
display: flex;
align-items: center;
gap: 8px;
padding: 5px 8px;
border-radius: 6px;
transition: background 0.15s;
}
.hero-top-track:hover {
background: rgba(255, 255, 255, 0.04);
}
.hero-top-track-play {
width: 20px;
height: 20px;
border-radius: 50%;
border: none;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
font-size: 8px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
opacity: 0;
transition: all 0.2s;
}
.hero-top-track:hover .hero-top-track-play {
opacity: 1;
}
.hero-top-track-play:hover {
background: rgb(var(--accent-rgb));
color: #fff;
transform: scale(1.1);
}
.hero-top-track-num {
font-size: 0.72em;
color: rgba(255, 255, 255, 0.25);
font-weight: 600;
width: 14px;
text-align: right;
flex-shrink: 0;
}
.hero-top-track-name {
font-size: 0.82em;
color: rgba(255, 255, 255, 0.8);
flex: 1;
min-width: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hero-top-track-plays {
font-size: 0.7em;
color: rgba(255, 255, 255, 0.3);
flex-shrink: 0;
font-variant-numeric: tabular-nums;
}
/* Mobile responsiveness */
@media (max-width: 768px) {
.artist-hero-section {
margin: 15px;
padding: 20px;
}
.artist-hero-content {
flex-direction: column;
align-items: center;
text-align: center;
gap: 20px;
}
.artist-image,
.artist-image-fallback {
width: 120px;
height: 120px;
}
.artist-hero-section .artist-name {
font-size: 1.6em;
text-align: center;
}
.artist-hero-right {
width: 100%;
border-left: none;
border-top: 1px solid rgba(255, 255, 255, 0.06);
padding-left: 0;
padding-top: 16px;
}
.artist-hero-numbers {
justify-content: center;
}
.artist-hero-identity {
justify-content: center;
}
}
/* ================================================
ADD TO WISHLIST MODAL STYLES
================================================ */
/* Modal Overlay and Container */
.add-to-wishlist-modal {
display: flex;
flex-direction: column;
width: 900px;
max-width: 90vw;
max-height: 85vh;
border-radius: 18px;
overflow: hidden;
position: relative;
background: rgba(16, 16, 20, 0.96);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
transform: scale(0.9);
opacity: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}
#add-to-wishlist-modal-overlay:not(.hidden) .add-to-wishlist-modal {
transform: scale(1);
opacity: 1;
}
/* Modal Header */
.add-to-wishlist-modal-header {
background: rgba(20, 20, 24, 0.9);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
border-top-left-radius: 18px;
border-top-right-radius: 18px;
position: relative;
overflow: hidden;
}
/* Hero Section */
.add-to-wishlist-modal-hero {
display: flex;
align-items: center;
padding: 20px 28px;
gap: 20px;
position: relative;
z-index: 2;
min-height: 120px;
}
.add-to-wishlist-modal-hero-bg {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-size: cover;
background-position: center;
opacity: 0.3;
filter: blur(20px);
z-index: 1;
}
.add-to-wishlist-modal-hero-bg::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.7) 0%,
rgba(18, 18, 18, 0.8) 100%);
}
.add-to-wishlist-modal-hero-content {
display: flex;
align-items: center;
gap: 20px;
position: relative;
z-index: 2;
width: 100%;
}
.add-to-wishlist-modal-hero-images {
display: flex;
align-items: center;
gap: 16px;
flex-shrink: 0;
}
.add-to-wishlist-modal-hero-image {
border-radius: 12px;
object-fit: cover;
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 4px 12px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.add-to-wishlist-modal-hero-image:hover {
transform: scale(1.05);
box-shadow:
0 12px 32px rgba(0, 0, 0, 0.5),
0 6px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
.add-to-wishlist-modal-hero-image.artist {
border-radius: 50%;
width: 70px;
height: 70px;
}
.add-to-wishlist-modal-hero-image.album {
border-radius: 12px;
width: 80px;
height: 80px;
}
.add-to-wishlist-modal-hero-icon {
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
border-radius: 12px;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.1) 0%,
rgba(255, 255, 255, 0.05) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
.add-to-wishlist-modal-hero-metadata {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
min-width: 0;
}
.add-to-wishlist-modal-hero-title {
color: #ffffff;
font-size: 22px;
font-weight: 700;
margin: 0;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.add-to-wishlist-modal-hero-subtitle {
color: #e0e0e0;
font-size: 16px;
font-weight: 500;
margin: 0;
opacity: 0.9;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.add-to-wishlist-modal-hero-details {
display: flex;
gap: 16px;
font-size: 14px;
margin-top: 4px;
}
.add-to-wishlist-modal-hero-detail {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
padding: 4px 8px;
background: rgba(var(--accent-rgb), 0.1);
border-radius: 6px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
box-shadow: 0 2px 6px rgba(var(--accent-rgb), 0.1);
transition: all 0.3s ease;
}
/* Header Actions */
.add-to-wishlist-modal-header-actions {
position: absolute;
top: 16px;
right: 24px;
z-index: 3;
}
.add-to-wishlist-modal-close {
color: #b3b3b3;
font-size: 28px;
font-weight: 300;
cursor: pointer;
transition: all 0.3s ease;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
}
.add-to-wishlist-modal-close:hover {
color: #ffffff;
background: rgba(255, 255, 255, 0.15);
transform: scale(1.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
/* Modal Content */
.add-to-wishlist-modal-content {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.add-to-wishlist-modal-body {
flex: 1;
padding: 24px 28px;
overflow-y: auto;
background: #121212;
}
.add-to-wishlist-modal-body::-webkit-scrollbar {
width: 8px;
}
.add-to-wishlist-modal-body::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.add-to-wishlist-modal-body::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.3);
border-radius: 4px;
}
.add-to-wishlist-modal-body::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb), 0.5);
}
/* Track List Container */
.wishlist-track-list-container {
display: flex;
flex-direction: column;
gap: 20px;
}
.wishlist-track-list-header {
text-align: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding-bottom: 20px;
}
.wishlist-track-list-header h3 {
color: #ffffff;
font-size: 20px;
font-weight: 700;
margin: 0 0 8px 0;
}
.wishlist-track-list-subtitle {
color: rgba(255, 255, 255, 0.7);
font-size: 14px;
margin: 0;
}
/* Track List */
.wishlist-track-list {
display: flex;
flex-direction: column;
gap: 12px;
max-height: 400px;
overflow-y: auto;
padding-right: 8px;
}
.wishlist-track-list::-webkit-scrollbar {
width: 6px;
}
.wishlist-track-list::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 3px;
}
.wishlist-track-list::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb), 0.3);
border-radius: 3px;
}
.wishlist-track-item {
display: flex;
align-items: center;
padding: 12px 16px;
background: linear-gradient(135deg,
rgba(255, 255, 255, 0.05) 0%,
rgba(255, 255, 255, 0.02) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
gap: 12px;
}
.wishlist-track-item:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.08) 0%,
rgba(var(--accent-rgb), 0.03) 100%);
border-color: rgba(var(--accent-rgb), 0.2);
transform: translateX(4px);
}
.wishlist-track-number {
width: 30px;
text-align: center;
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
font-weight: 500;
}
.wishlist-track-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 4px;
min-width: 0;
}
.wishlist-track-name {
color: #ffffff;
font-size: 15px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wishlist-track-artists {
color: rgba(255, 255, 255, 0.7);
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wishlist-track-duration {
color: rgba(255, 255, 255, 0.6);
font-size: 13px;
font-weight: 500;
min-width: 40px;
text-align: right;
}
/* Track ownership indicators */
.wishlist-track-item.owned {
opacity: 0.65;
border-left: 3px solid rgba(var(--accent-rgb), 0.6);
}
.wishlist-track-item.owned:hover {
opacity: 0.85;
}
.wishlist-track-item.missing {
border-left: 3px solid rgba(255, 152, 0, 0.6);
}
.wishlist-track-badge {
display: flex;
align-items: center;
justify-content: center;
min-width: 24px;
height: 24px;
border-radius: 50%;
font-size: 12px;
flex-shrink: 0;
}
.wishlist-track-badge.owned {
color: rgba(var(--accent-rgb), 0.9);
}
/* Track metadata (format + bitrate) */
.wishlist-track-meta {
display: flex;
align-items: center;
gap: 6px;
margin-top: 2px;
}
.wishlist-track-format {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.5px;
padding: 1px 5px;
border-radius: 4px;
background: rgba(var(--accent-rgb), 0.15);
color: rgba(var(--accent-rgb), 0.9);
}
.wishlist-track-bitrate {
font-size: 11px;
color: rgba(255, 255, 255, 0.45);
}
/* ── Format tags on release cards ── */
.release-formats {
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 0 8px 6px;
}
.release-format-tag {
font-size: 9px;
font-weight: 700;
letter-spacing: 0.5px;
padding: 1px 5px;
border-radius: 4px;
background: rgba(var(--accent-rgb), 0.15);
color: rgba(var(--accent-rgb), 0.9);
line-height: 1.4;
}
/* ── Format tag in wishlist modal hero ── */
.modal-format-tag {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.5px;
padding: 2px 8px;
border-radius: 6px;
background: rgba(var(--accent-rgb), 0.15);
color: rgba(var(--accent-rgb), 0.9);
}
/* ── Format tags in artist hero section ── */
.artist-formats {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 6px;
}
.artist-format-tag {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.5px;
padding: 2px 8px;
border-radius: 6px;
background: rgba(var(--accent-rgb), 0.15);
color: rgba(var(--accent-rgb), 0.9);
}
/* Modal Footer */
.add-to-wishlist-modal-footer {
background: linear-gradient(135deg,
rgba(42, 42, 42, 0.9) 0%,
rgba(30, 30, 30, 0.95) 100%);
border-top: 1px solid rgba(255, 255, 255, 0.08);
padding: 24px 28px;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
}
.wishlist-modal-actions {
display: flex;
justify-content: flex-end;
gap: 12px;
}
.wishlist-modal-btn {
padding: 12px 24px;
border: none;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
min-width: 120px;
}
.wishlist-modal-btn-secondary {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
border: 1px solid rgba(255, 255, 255, 0.2);
}
.wishlist-modal-btn-secondary:hover {
background: rgba(255, 255, 255, 0.2);
color: #ffffff;
border-color: rgba(255, 255, 255, 0.3);
}
.wishlist-modal-btn-download {
background: linear-gradient(135deg, #1db954, #1ed760);
color: #ffffff;
border: 1px solid rgba(29, 185, 84, 0.3);
}
.wishlist-modal-btn-download:hover {
background: linear-gradient(135deg, #1ed760, #1db954);
transform: translateY(-1px);
box-shadow: 0 8px 24px rgba(29, 185, 84, 0.4);
}
.wishlist-modal-btn-download:active {
transform: translateY(0);
box-shadow: 0 4px 12px rgba(29, 185, 84, 0.3);
}
.wishlist-modal-btn-primary {
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
color: #ffffff;
border: 1px solid rgba(var(--accent-rgb), 0.3);
}
.wishlist-modal-btn-primary:hover {
background: linear-gradient(135deg, rgb(var(--accent-light-rgb)) 0%, #22e167 100%);
transform: translateY(-1px);
box-shadow: 0 8px 24px rgba(var(--accent-rgb), 0.4);
}
.wishlist-modal-btn-primary:active {
transform: translateY(0);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}
/* Loading State */
.wishlist-modal-btn-primary.loading {
background: rgba(255, 193, 7, 0.9);
color: #000000;
animation: pulse-loading 1.5s infinite;
cursor: not-allowed;
}
.wishlist-modal-btn-primary:disabled {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.4);
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* Animation for modal appearance */
@keyframes wishlistModalFadeIn {
from {
opacity: 0;
transform: scale(0.9) translateY(20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
#add-to-wishlist-modal-overlay:not(.hidden) .add-to-wishlist-modal {
animation: wishlistModalFadeIn 0.4s ease-out;
}
/* Mobile Responsiveness */
@media (max-width: 768px) {
.add-to-wishlist-modal {
width: 95vw;
max-height: 90vh;
border-radius: 16px;
}
.add-to-wishlist-modal-hero {
flex-direction: column;
text-align: center;
min-height: auto;
padding: 20px;
gap: 16px;
}
.add-to-wishlist-modal-hero-content {
flex-direction: column;
gap: 16px;
}
.add-to-wishlist-modal-hero-images {
justify-content: center;
}
.add-to-wishlist-modal-hero-image.album,
.add-to-wishlist-modal-hero-image.artist {
width: 60px;
height: 60px;
}
.add-to-wishlist-modal-hero-icon {
width: 60px;
height: 60px;
font-size: 28px;
margin: 0 auto;
}
.add-to-wishlist-modal-hero-title {
font-size: 18px;
white-space: normal;
text-align: center;
}
.add-to-wishlist-modal-hero-subtitle {
font-size: 14px;
white-space: normal;
text-align: center;
}
.add-to-wishlist-modal-hero-details {
justify-content: center;
flex-wrap: wrap;
}
.add-to-wishlist-modal-body {
padding: 20px;
}
.add-to-wishlist-modal-footer {
padding: 20px;
}
.wishlist-modal-actions {
flex-direction: column;
gap: 12px;
}
.wishlist-modal-btn {
width: 100%;
}
}
/* =======================================
BEATPORT TOP 10 LISTS SECTION
======================================= */
.beatport-top10-section {
margin-top: 40px;
padding: 0 30px;
margin-bottom: 40px;
}
.beatport-top10-header {
text-align: center;
margin-bottom: 40px;
}
.beatport-top10-title {
font-size: 36px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
.beatport-top10-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* Two-column container for both lists */
.beatport-top10-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
max-width: 1400px;
border-radius: 20px;
margin: 0 auto;
overflow: hidden;
/* Prevent overflow */
}
/* Individual list styling */
.beatport-top10-list,
.beatport-hype10-list {
background: linear-gradient(135deg,
rgba(18, 18, 18, 0.95),
rgba(30, 30, 30, 0.9));
border-radius: 20px;
padding: 30px;
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
width: 100%;
min-width: 0;
/* Allow shrinking */
overflow: hidden;
/* Prevent content overflow */
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1),
filter 0.5s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
}
/* Color-coded themes */
.beatport-top10-list {
border-left: 4px solid #00ff88;
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.5),
0 0 20px rgba(0, 255, 136, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-hype10-list {
border-left: 4px solid #ff3366;
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 51, 102, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Hover Effects for Top 10 Lists */
.beatport-top10-list:hover {
filter: drop-shadow(0 0 4px rgba(0, 255, 136, 0.3)) drop-shadow(0 0 8px rgba(0, 255, 136, 0.2)) drop-shadow(0 0 16px rgba(0, 255, 136, 0.1));
border-left-color: rgba(0, 255, 136, 0.6);
background: linear-gradient(135deg,
rgba(0, 255, 136, 0.04),
rgba(18, 18, 18, 0.95),
rgba(30, 30, 30, 0.9));
}
.beatport-hype10-list:hover {
filter: drop-shadow(0 0 4px rgba(255, 51, 102, 0.3)) drop-shadow(0 0 8px rgba(255, 51, 102, 0.2)) drop-shadow(0 0 16px rgba(255, 51, 102, 0.1));
border-left-color: rgba(255, 51, 102, 0.6);
background: linear-gradient(135deg,
rgba(255, 51, 102, 0.04),
rgba(18, 18, 18, 0.95),
rgba(30, 30, 30, 0.9));
}
/* List headers */
.beatport-top10-list-header,
.beatport-hype10-list-header {
text-align: center;
margin-bottom: 25px;
padding-bottom: 15px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.beatport-top10-list-title,
.beatport-hype10-list-title {
font-size: 24px;
font-weight: 600;
color: #ffffff;
margin-bottom: 5px;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.beatport-top10-list-subtitle,
.beatport-hype10-list-subtitle {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
margin: 0;
}
/* Track containers */
.beatport-top10-tracks,
.beatport-hype10-tracks {
display: flex;
flex-direction: column;
gap: 12px;
}
/* Individual track cards - CORRECTED CLASS NAMES */
.beatport-top10-card,
.beatport-hype10-card {
display: flex;
align-items: center;
background: linear-gradient(135deg,
rgba(25, 25, 25, 0.9),
rgba(35, 35, 35, 0.8));
border-radius: 16px;
padding: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
backdrop-filter: blur(10px);
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
cursor: pointer;
position: relative;
overflow: hidden;
width: 100%;
min-width: 0;
/* Allow shrinking */
box-sizing: border-box;
min-height: 80px;
/* Consistent height */
max-height: 80px;
/* Prevent expansion */
}
/* Hover animations for cards */
.beatport-top10-card:hover {
background: linear-gradient(135deg,
rgba(0, 255, 136, 0.12),
rgba(35, 35, 35, 0.95));
border-color: rgba(0, 255, 136, 0.3);
transform: translateY(-3px);
box-shadow:
0 12px 32px rgba(0, 0, 0, 0.5),
0 0 20px rgba(0, 255, 136, 0.2);
}
.beatport-hype10-card:hover {
background: linear-gradient(135deg,
rgba(255, 51, 102, 0.12),
rgba(35, 35, 35, 0.95));
border-color: rgba(255, 51, 102, 0.3);
transform: translateY(-3px);
box-shadow:
0 12px 32px rgba(0, 0, 0, 0.5),
0 0 20px rgba(255, 51, 102, 0.2);
}
/* Track rank number */
.beatport-top10-card-rank {
font-size: 20px;
font-weight: 800;
color: #00ff88;
min-width: 35px;
text-align: center;
margin-right: 16px;
text-shadow: 0 2px 6px rgba(0, 255, 136, 0.3);
background: linear-gradient(135deg, rgba(0, 255, 136, 0.1), rgba(0, 255, 136, 0.05));
border-radius: 12px;
padding: 8px 0;
border: 1px solid rgba(0, 255, 136, 0.2);
}
.beatport-hype10-card-rank {
font-size: 20px;
font-weight: 800;
color: #ff3366;
min-width: 35px;
text-align: center;
margin-right: 16px;
text-shadow: 0 2px 6px rgba(255, 51, 102, 0.3);
background: linear-gradient(135deg, rgba(255, 51, 102, 0.1), rgba(255, 51, 102, 0.05));
border-radius: 12px;
padding: 8px 0;
border: 1px solid rgba(255, 51, 102, 0.2);
}
/* Track artwork */
.beatport-top10-card-artwork,
.beatport-hype10-card-artwork {
width: 56px;
height: 56px;
border-radius: 12px;
margin-right: 16px;
overflow: hidden;
position: relative;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
border: 2px solid rgba(255, 255, 255, 0.1);
}
.beatport-top10-card-artwork img,
.beatport-hype10-card-artwork img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.4s ease;
}
.beatport-top10-card:hover .beatport-top10-card-artwork img,
.beatport-hype10-card:hover .beatport-hype10-card-artwork img {
transform: scale(1.15);
}
/* Artwork placeholder */
.beatport-top10-card-placeholder,
.beatport-hype10-card-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
background: linear-gradient(135deg, rgba(40, 40, 40, 0.8), rgba(60, 60, 60, 0.6));
color: rgba(255, 255, 255, 0.4);
}
/* Track info */
.beatport-top10-card-info,
.beatport-hype10-card-info {
flex: 1;
min-width: 0;
/* Critical for text truncation */
display: flex;
flex-direction: column;
gap: 4px;
overflow: hidden;
/* Prevent text overflow */
width: 100%;
}
.beatport-top10-card-title,
.beatport-hype10-card-title {
font-size: 15px;
font-weight: 700;
color: #ffffff;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
max-width: 100%;
width: 100%;
}
.beatport-top10-card-artist,
.beatport-hype10-card-artist {
font-size: 13px;
color: rgba(255, 255, 255, 0.8);
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
width: 100%;
}
.beatport-top10-card-label {
font-size: 11px;
color: rgba(0, 255, 136, 0.9);
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.5px;
max-width: 100%;
width: 100%;
}
.beatport-hype10-card-label {
font-size: 11px;
color: rgba(255, 51, 102, 0.9);
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.5px;
max-width: 100%;
width: 100%;
}
/* Error states */
.beatport-top10-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 200px;
background: linear-gradient(135deg,
rgba(255, 51, 51, 0.1),
rgba(40, 40, 40, 0.8));
border-radius: 16px;
border: 1px solid rgba(255, 51, 51, 0.2);
text-align: center;
padding: 30px;
}
.beatport-top10-error h3 {
color: #ff3366;
font-size: 18px;
margin-bottom: 8px;
}
.beatport-top10-error p {
color: rgba(255, 255, 255, 0.7);
font-size: 14px;
margin: 0;
}
/* Loading states */
.beatport-top10-loading,
.beatport-hype10-loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 300px;
background: linear-gradient(135deg,
rgba(16, 16, 16, 0.6),
rgba(24, 24, 24, 0.4));
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.05);
}
.beatport-top10-loading-content,
.beatport-hype10-loading-content {
text-align: center;
}
.beatport-top10-loading-content h4,
.beatport-hype10-loading-content h4 {
font-size: 18px;
color: #ffffff;
margin-bottom: 8px;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}
.beatport-top10-loading-content p,
.beatport-hype10-loading-content p {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
margin: 0;
}
/* Top 10 Lists Responsive Design */
@media (max-width: 1300px) {
.beatport-top10-card-title,
.beatport-hype10-card-title {
font-size: 14px;
}
.beatport-top10-card-artist,
.beatport-hype10-card-artist {
font-size: 12px;
}
.beatport-top10-card-label,
.beatport-hype10-card-label {
font-size: 10px;
}
.beatport-top10-card-rank,
.beatport-hype10-card-rank {
font-size: 18px;
}
}
@media (max-width: 1200px) {
.beatport-top10-container {
gap: 30px;
max-width: 1200px;
}
.beatport-top10-list,
.beatport-hype10-list {
padding: 25px;
max-width: 100%;
}
.beatport-top10-card,
.beatport-hype10-card {
min-height: 75px;
max-height: 75px;
}
.beatport-top10-card-artwork,
.beatport-hype10-card-artwork {
width: 48px;
height: 48px;
}
}
@media (max-width: 900px) {
.beatport-top10-container {
grid-template-columns: 1fr;
gap: 25px;
}
.beatport-top10-section {
padding: 0 20px;
}
.beatport-top10-title {
font-size: 28px;
}
.beatport-top10-list-title,
.beatport-hype10-list-title {
font-size: 20px;
}
.beatport-top10-card,
.beatport-hype10-card {
padding: 12px;
min-height: 70px;
max-height: 70px;
}
.beatport-top10-card-artwork,
.beatport-hype10-card-artwork {
width: 42px;
height: 42px;
margin-right: 12px;
}
.beatport-top10-card-rank,
.beatport-hype10-card-rank {
font-size: 16px;
min-width: 30px;
margin-right: 12px;
padding: 6px 0;
}
}
@media (max-width: 600px) {
.beatport-top10-section {
padding: 0 15px;
margin-top: 30px;
margin-bottom: 30px;
}
.beatport-top10-header {
margin-bottom: 30px;
}
.beatport-top10-title {
font-size: 24px;
}
.beatport-top10-list,
.beatport-hype10-list {
padding: 20px;
}
.beatport-top10-list-title,
.beatport-hype10-list-title {
font-size: 18px;
}
.beatport-top10-card,
.beatport-hype10-card {
padding: 10px;
min-height: 65px;
max-height: 65px;
}
.beatport-top10-card-artwork,
.beatport-hype10-card-artwork {
width: 38px;
height: 38px;
margin-right: 10px;
}
.beatport-top10-card-rank,
.beatport-hype10-card-rank {
font-size: 14px;
min-width: 26px;
padding: 4px 0;
margin-right: 10px;
}
.beatport-top10-card-title,
.beatport-hype10-card-title {
font-size: 13px;
}
.beatport-top10-card-artist,
.beatport-hype10-card-artist {
font-size: 11px;
}
.beatport-top10-card-label,
.beatport-hype10-card-label {
font-size: 9px;
}
}
/* =======================================
BEATPORT TOP 10 RELEASES SECTION
======================================= */
.beatport-releases-top10-section {
margin-top: 40px;
padding: 0 30px;
margin-bottom: 40px;
}
.beatport-releases-top10-header {
text-align: center;
margin-bottom: 40px;
}
.beatport-releases-top10-title {
font-size: 36px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
.beatport-releases-top10-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* Single column container for releases */
.beatport-releases-top10-container {
max-width: 1500px;
margin: 0 auto;
}
/* List styling with unique design */
.beatport-releases-top10-list {
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95),
rgba(35, 35, 35, 0.9));
border-radius: 24px;
padding: 40px;
backdrop-filter: blur(25px);
border: 1px solid rgba(255, 255, 255, 0.12);
box-shadow:
0 25px 50px rgba(0, 0, 0, 0.6),
0 0 25px rgba(138, 43, 226, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
border-left: 4px solid #8a2be2;
overflow: hidden;
}
/* Track containers with grid layout for releases */
.beatport-releases-top10-tracks {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(40%, 1fr));
gap: 20px;
}
/* Individual release cards - unique design with images */
.beatport-releases-top10-card {
display: flex;
align-items: center;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.9),
rgba(45, 45, 45, 0.85));
border-radius: 20px;
padding: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
backdrop-filter: blur(15px);
transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1);
cursor: pointer;
position: relative;
overflow: hidden;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
min-height: 120px;
max-height: 120px;
width: 100%;
min-width: 0;
box-sizing: border-box;
}
/* Hover animations for release cards */
.beatport-releases-top10-card:hover {
background: linear-gradient(135deg,
rgba(138, 43, 226, 0.15),
rgba(45, 45, 45, 0.95));
border-color: rgba(138, 43, 226, 0.4);
transform: translateY(-5px) scale(1.02);
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.6),
0 0 30px rgba(138, 43, 226, 0.25);
}
/* Release rank number */
.beatport-releases-top10-card-rank {
font-size: 24px;
font-weight: 900;
color: #8a2be2;
min-width: 40px;
text-align: center;
margin-right: 20px;
text-shadow: 0 3px 8px rgba(138, 43, 226, 0.4);
background: linear-gradient(135deg, rgba(138, 43, 226, 0.15), rgba(138, 43, 226, 0.08));
border-radius: 16px;
padding: 12px 0;
border: 2px solid rgba(138, 43, 226, 0.3);
backdrop-filter: blur(10px);
}
/* Release artwork - larger since these have images */
.beatport-releases-top10-card-artwork {
width: 80px;
height: 80px;
border-radius: 16px;
margin-right: 20px;
overflow: hidden;
position: relative;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);
border: 3px solid rgba(255, 255, 255, 0.15);
backdrop-filter: blur(5px);
}
.beatport-releases-top10-card-artwork img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.5s ease;
}
.beatport-releases-top10-card:hover .beatport-releases-top10-card-artwork img {
transform: scale(1.2) rotate(2deg);
}
/* Artwork placeholder for releases */
.beatport-releases-top10-card-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
background: linear-gradient(135deg, rgba(138, 43, 226, 0.2), rgba(80, 80, 80, 0.8));
color: rgba(255, 255, 255, 0.6);
}
/* Release info */
.beatport-releases-top10-card-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 6px;
overflow: hidden;
width: 100%;
}
.beatport-releases-top10-card-title {
font-size: 18px;
font-weight: 800;
color: #ffffff;
line-height: 1.3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.9);
max-width: 100%;
width: 100%;
}
.beatport-releases-top10-card-artist {
font-size: 15px;
color: rgba(255, 255, 255, 0.9);
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
width: 100%;
}
.beatport-releases-top10-card-label {
font-size: 13px;
color: white;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.8px;
max-width: 100%;
width: 100%;
transition: .5s;
}
.beatport-releases-top10-card:hover .beatport-releases-top10-card-label {
color: rgba(138, 43, 226, 0.95);
transition: .5s;
}
/* Loading states for releases */
.beatport-releases-top10-loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 200px;
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.7),
rgba(30, 30, 30, 0.5));
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.08);
}
.beatport-releases-top10-loading-content {
text-align: center;
}
.beatport-releases-top10-loading-content h4 {
font-size: 20px;
color: #ffffff;
margin-bottom: 10px;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}
.beatport-releases-top10-loading-content p {
font-size: 15px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* Error states for releases */
.beatport-releases-top10-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 200px;
background: linear-gradient(135deg,
rgba(255, 51, 51, 0.12),
rgba(45, 45, 45, 0.9));
border-radius: 20px;
border: 1px solid rgba(255, 51, 51, 0.25);
text-align: center;
padding: 40px;
}
.beatport-releases-top10-error h3 {
color: #ff3366;
font-size: 20px;
margin-bottom: 10px;
}
.beatport-releases-top10-error p {
color: rgba(255, 255, 255, 0.8);
font-size: 15px;
margin: 0;
}
/* Responsive Design for Top 10 Releases */
@media (max-width: 1300px) {
.beatport-releases-top10-card-title {
font-size: 16px;
}
.beatport-releases-top10-card-artist {
font-size: 14px;
}
.beatport-releases-top10-card-label {
font-size: 12px;
}
.beatport-releases-top10-card-rank {
font-size: 20px;
}
}
@media (max-width: 1200px) {
.beatport-releases-top10-tracks {
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
}
.beatport-releases-top10-list {
padding: 30px;
}
.beatport-releases-top10-card {
min-height: 110px;
max-height: 110px;
padding: 16px;
}
.beatport-releases-top10-card-artwork {
width: 70px;
height: 70px;
}
}
@media (max-width: 900px) {
.beatport-releases-top10-tracks {
grid-template-columns: 1fr;
gap: 14px;
}
.beatport-releases-top10-section {
padding: 0 20px;
}
.beatport-releases-top10-title {
font-size: 28px;
}
.beatport-releases-top10-card {
min-height: 100px;
max-height: 100px;
padding: 14px;
}
.beatport-releases-top10-card-artwork {
width: 60px;
height: 60px;
margin-right: 16px;
}
.beatport-releases-top10-card-rank {
font-size: 18px;
min-width: 35px;
margin-right: 16px;
padding: 8px 0;
}
}
@media (max-width: 600px) {
.beatport-releases-top10-section {
padding: 0 15px;
margin-top: 30px;
margin-bottom: 30px;
}
.beatport-releases-top10-header {
margin-bottom: 30px;
}
.beatport-releases-top10-list {
padding: 20px;
}
.beatport-releases-top10-title {
font-size: 24px;
}
.beatport-releases-top10-card {
min-height: 90px;
max-height: 90px;
padding: 12px;
}
.beatport-releases-top10-card-artwork {
width: 50px;
height: 50px;
margin-right: 12px;
}
.beatport-releases-top10-card-rank {
font-size: 16px;
min-width: 30px;
margin-right: 12px;
padding: 6px 0;
}
.beatport-releases-top10-card-title {
font-size: 14px;
}
.beatport-releases-top10-card-artist {
font-size: 12px;
}
.beatport-releases-top10-card-label {
font-size: 10px;
}
}
/* ================================
BEATPORT NEW RELEASES SECTION
================================ */
.beatport-releases-section {
margin-top: 40px;
padding: 0 20px;
}
.beatport-releases-header {
text-align: center;
margin-bottom: 30px;
}
.beatport-releases-title {
font-size: 32px;
font-weight: bold;
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)), #00d4aa);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.beatport-releases-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
.beatport-releases-slider-container {
position: relative;
background: linear-gradient(135deg,
rgba(18, 18, 18, 0.95),
rgba(30, 30, 30, 0.9));
border-radius: 20px;
padding: 30px;
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-releases-slider {
position: relative;
border-radius: 16px;
}
.beatport-releases-slider-track {
position: relative;
height: 425px;
}
.beatport-releases-loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 400px;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.1),
rgba(var(--accent-light-rgb), 0.05));
border-radius: 16px;
border: 2px dashed rgba(var(--accent-rgb), 0.3);
}
.beatport-releases-loading-content {
text-align: center;
}
.beatport-releases-loading-content h3 {
font-size: 24px;
color: rgb(var(--accent-rgb));
margin-bottom: 8px;
font-weight: 600;
}
.beatport-releases-loading-content p {
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
margin: 0;
}
/* Individual Slide (contains 10 cards in 5x2 grid) */
.beatport-releases-slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
transform: translateX(100px);
}
.beatport-releases-slide.active {
opacity: 1;
z-index: 10;
transform: translateX(0);
}
.beatport-releases-slide.prev {
transform: translateX(-100px);
}
.beatport-releases-slide.next {
transform: translateX(100px);
}
.beatport-releases-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 20px;
padding: 20px;
background: linear-gradient(135deg,
rgba(16, 16, 16, 0.6),
rgba(24, 24, 24, 0.4));
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
justify-items: center;
align-items: center;
margin: 0 auto;
}
/* Release Card Styling */
.beatport-release-card {
background: linear-gradient(145deg,
rgba(40, 40, 40, 0.9),
rgba(28, 28, 28, 0.95));
border-radius: 12px;
padding: 16px;
border: 1px solid rgba(255, 255, 255, 0.1);
cursor: pointer;
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
position: relative;
overflow: hidden;
backdrop-filter: blur(10px);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
width: 100%;
height: 160px;
min-height: 160px;
max-height: 160px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.beatport-release-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--card-bg-image, none);
background-size: cover;
background-position: center;
opacity: 0.15;
border-radius: 12px;
z-index: 0;
}
.beatport-release-card:hover {
transform: translateY(-2px) scale(1.05);
background: linear-gradient(145deg,
rgba(var(--accent-rgb), 0.15),
rgba(40, 40, 40, 0.95));
border-color: rgba(var(--accent-rgb), 0.4);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 16px rgba(var(--accent-rgb), 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
z-index: 10;
}
.beatport-release-card-content {
position: relative;
z-index: 1;
text-align: center;
}
.beatport-release-artwork {
width: 80px;
height: 80px;
border-radius: 8px;
margin: 0 auto 12px auto;
background: linear-gradient(135deg, #333, #555);
border: 2px solid rgba(255, 255, 255, 0.1);
overflow: hidden;
position: relative;
}
.beatport-release-artwork img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.beatport-release-card:hover .beatport-release-artwork img {
transform: scale(1.1);
}
.beatport-release-info {
text-align: center;
}
.beatport-release-title {
font-size: 11px;
font-weight: 600;
color: #ffffff;
margin-bottom: 4px;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.beatport-release-artist {
font-size: 11px;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.beatport-release-label {
font-size: 10px;
color: rgba(var(--accent-rgb), 0.8);
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Placeholder Card Styling */
.beatport-release-placeholder {
opacity: 0.3;
cursor: default;
pointer-events: none;
}
.beatport-release-placeholder .placeholder-icon {
font-size: 32px;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: rgba(255, 255, 255, 0.5);
}
.beatport-release-placeholder:hover {
transform: none;
background: linear-gradient(145deg,
rgba(40, 40, 40, 0.9),
rgba(28, 28, 28, 0.95));
}
/* Navigation Buttons */
.beatport-releases-slider-nav {
position: absolute;
top: 50%;
width: 100%;
display: flex;
justify-content: space-between;
transform: translateY(-50%);
pointer-events: none;
z-index: 10;
}
.beatport-releases-nav-btn {
pointer-events: all;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.9),
rgba(var(--accent-light-rgb), 0.8));
border: none;
border-radius: 50%;
width: 50px;
height: 50px;
color: white;
font-size: 24px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(10px);
box-shadow: 0 6px 20px rgba(var(--accent-rgb), 0.4);
transition: all 0.3s ease;
border: 2px solid rgba(255, 255, 255, 0.2);
}
.beatport-releases-nav-btn:hover {
transform: scale(1.1);
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 1),
rgba(var(--accent-light-rgb), 0.9));
box-shadow: 0 8px 25px rgba(var(--accent-rgb), 0.6);
}
.beatport-releases-prev-btn {
margin-left: -25px;
}
.beatport-releases-next-btn {
margin-right: -25px;
}
/* Slider Indicators */
.beatport-releases-slider-indicators {
display: flex;
justify-content: center;
gap: 12px;
margin-top: 25px;
}
.beatport-releases-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
border: 2px solid rgba(255, 255, 255, 0.1);
cursor: pointer;
transition: all 0.3s ease;
}
.beatport-releases-indicator.active {
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow: 0 0 15px rgba(var(--accent-rgb), 0.5);
transform: scale(1.2);
}
.beatport-releases-indicator:hover {
background: rgba(255, 255, 255, 0.5);
transform: scale(1.1);
}
/* Responsive Design */
@media (max-width: 1100px) {
.beatport-releases-grid {
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
}
}
@media (max-width: 1200px) {
.beatport-releases-grid {
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 16px;
}
.beatport-release-artwork {
width: 70px;
height: 70px;
}
}
@media (max-width: 900px) {
.beatport-releases-grid {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 14px;
}
.beatport-releases-slider-container {
padding: 20px;
}
}
@media (max-width: 600px) {
.beatport-releases-grid {
grid-template-columns: 1fr;
grid-template-rows: repeat(5, 1fr);
gap: 12px;
}
.beatport-releases-section {
padding: 0 15px;
}
.beatport-releases-title {
font-size: 24px;
}
}
/* ==================== HYPE PICKS SLIDER STYLES ==================== */
.beatport-hype-picks-section {
margin-top: 40px;
padding: 0 20px;
}
.beatport-hype-picks-header {
text-align: center;
margin-bottom: 30px;
}
.beatport-hype-picks-title {
font-size: 32px;
font-weight: bold;
background: linear-gradient(135deg, #ff6b6b, #ff8787, #ffa8a8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.beatport-hype-picks-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
.beatport-hype-picks-slider-container {
position: relative;
background: linear-gradient(135deg,
rgba(18, 18, 18, 0.95),
rgba(30, 30, 30, 0.9));
border-radius: 20px;
padding: 30px;
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 20px 40px rgba(0, 0, 0, 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-hype-picks-slider {
position: relative;
border-radius: 16px;
}
.beatport-hype-picks-slider-track {
position: relative;
height: 425px;
}
.beatport-hype-picks-loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 400px;
background: linear-gradient(135deg,
rgba(255, 107, 107, 0.1),
rgba(255, 135, 135, 0.05));
border-radius: 16px;
border: 2px dashed rgba(255, 107, 107, 0.3);
}
.beatport-hype-picks-loading-content {
text-align: center;
}
.beatport-hype-picks-loading-content h3 {
font-size: 24px;
color: #ff6b6b;
margin-bottom: 8px;
font-weight: 600;
}
.beatport-hype-picks-loading-content p {
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
margin: 0;
}
/* Individual Slide (contains 10 cards in 5x2 grid) */
.beatport-hype-picks-slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
transform: translateX(100px);
}
.beatport-hype-picks-slide.active {
opacity: 1;
z-index: 10;
transform: translateX(0);
}
.beatport-hype-picks-slide.prev {
transform: translateX(-100px);
}
.beatport-hype-picks-slide.next {
transform: translateX(100px);
}
.beatport-hype-picks-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 20px;
padding: 20px;
background: linear-gradient(135deg,
rgba(16, 16, 16, 0.6),
rgba(24, 24, 24, 0.4));
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
justify-items: center;
align-items: center;
margin: 0 auto;
}
/* Hype Pick Card Styling */
.beatport-hype-pick-card {
background: linear-gradient(145deg,
rgba(40, 40, 40, 0.9),
rgba(28, 28, 28, 0.95));
border-radius: 12px;
padding: 16px;
border: 1px solid rgba(255, 255, 255, 0.1);
cursor: pointer;
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
position: relative;
overflow: hidden;
backdrop-filter: blur(10px);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
width: 100%;
height: 160px;
min-height: 160px;
max-height: 160px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.beatport-hype-pick-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--card-bg-image, none);
background-size: cover;
background-position: center;
opacity: 0.15;
border-radius: 12px;
z-index: 0;
}
.beatport-hype-pick-card:hover {
transform: translateY(-2px) scale(1.05);
background: linear-gradient(145deg,
rgba(255, 107, 107, 0.15),
rgba(40, 40, 40, 0.95));
border-color: rgba(255, 107, 107, 0.4);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 16px rgba(255, 107, 107, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
z-index: 10;
}
.beatport-hype-pick-card-content {
position: relative;
z-index: 1;
text-align: center;
}
.beatport-hype-pick-artwork {
width: 80px;
height: 80px;
border-radius: 8px;
margin: 0 auto 12px auto;
background: linear-gradient(135deg, #333, #555);
border: 2px solid rgba(255, 255, 255, 0.1);
overflow: hidden;
position: relative;
}
.beatport-hype-pick-artwork img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.beatport-hype-pick-card:hover .beatport-hype-pick-artwork img {
transform: scale(1.1);
}
.beatport-hype-pick-info {
text-align: center;
}
.beatport-hype-pick-title {
font-size: 11px;
font-weight: 600;
color: #ffffff;
margin-bottom: 4px;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.beatport-hype-pick-artist {
font-size: 11px;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.beatport-hype-pick-label {
font-size: 10px;
color: rgba(255, 107, 107, 0.8);
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Placeholder Card Styling */
.beatport-hype-pick-placeholder {
opacity: 0.3;
cursor: default;
pointer-events: none;
}
.beatport-hype-pick-placeholder .placeholder-icon {
font-size: 32px;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: rgba(255, 255, 255, 0.5);
}
.beatport-hype-pick-placeholder:hover {
transform: none;
background: linear-gradient(145deg,
rgba(40, 40, 40, 0.9),
rgba(28, 28, 28, 0.95));
}
/* Navigation Buttons */
.beatport-hype-picks-slider-nav {
position: absolute;
top: 50%;
width: 100%;
display: flex;
justify-content: space-between;
transform: translateY(-50%);
pointer-events: none;
z-index: 10;
}
.beatport-hype-picks-nav-btn {
pointer-events: all;
background: linear-gradient(135deg,
rgba(255, 107, 107, 0.9),
rgba(255, 135, 135, 0.8));
border: none;
border-radius: 50%;
width: 50px;
height: 50px;
color: white;
font-size: 24px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(10px);
box-shadow: 0 6px 20px rgba(255, 107, 107, 0.4);
transition: all 0.3s ease;
border: 2px solid rgba(255, 255, 255, 0.2);
}
.beatport-hype-picks-nav-btn:hover {
transform: scale(1.1);
background: linear-gradient(135deg,
rgba(255, 107, 107, 1),
rgba(255, 135, 135, 0.9));
box-shadow: 0 8px 25px rgba(255, 107, 107, 0.6);
}
.beatport-hype-picks-prev-btn {
margin-left: -25px;
}
.beatport-hype-picks-next-btn {
margin-right: -25px;
}
/* Slider Indicators */
.beatport-hype-picks-slider-indicators {
display: flex;
justify-content: center;
gap: 12px;
margin-top: 25px;
}
.beatport-hype-picks-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.3);
border: 2px solid rgba(255, 255, 255, 0.1);
cursor: pointer;
transition: all 0.3s ease;
}
.beatport-hype-picks-indicator.active {
background: linear-gradient(135deg, #ff6b6b, #ff8787);
border-color: rgba(255, 107, 107, 0.6);
box-shadow: 0 0 15px rgba(255, 107, 107, 0.5);
transform: scale(1.2);
}
.beatport-hype-picks-indicator:hover {
background: rgba(255, 255, 255, 0.5);
transform: scale(1.1);
}
/* Responsive Design */
@media (max-width: 1100px) {
.beatport-hype-picks-grid {
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
}
}
@media (max-width: 1200px) {
.beatport-hype-picks-grid {
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 16px;
}
.beatport-hype-pick-artwork {
width: 70px;
height: 70px;
}
}
@media (max-width: 900px) {
.beatport-hype-picks-grid {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 14px;
}
.beatport-hype-picks-slider-container {
padding: 20px;
}
}
@media (max-width: 600px) {
.beatport-hype-picks-grid {
grid-template-columns: 1fr;
grid-template-rows: repeat(5, 1fr);
gap: 12px;
}
.beatport-hype-picks-section {
padding: 0 15px;
}
.beatport-hype-picks-title {
font-size: 24px;
}
}
/* ==================== FEATURED CHARTS SLIDER STYLES ==================== */
/* Charts Section */
.beatport-charts-section {
margin-top: 40px;
padding: 0 30px;
}
.beatport-charts-header {
text-align: center;
margin-bottom: 30px;
}
.beatport-charts-title {
font-size: 32px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
.beatport-charts-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.8);
margin: 0;
}
/* Charts Slider Container */
.beatport-charts-slider-container {
position: relative;
background: linear-gradient(135deg,
rgba(16, 16, 16, 0.4),
rgba(24, 24, 24, 0.2));
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.06);
backdrop-filter: blur(15px);
min-height: 600px;
padding: 30px;
}
.beatport-charts-slider {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
border-radius: 16px;
}
.beatport-charts-slider-track {
position: relative;
height: 550px;
}
.beatport-charts-slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
transform: translateX(100px);
}
.beatport-charts-slide.active {
opacity: 1;
transform: translateX(0);
z-index: 10;
}
.beatport-charts-slide.prev {
opacity: 0;
transform: translateX(-100px);
}
.beatport-charts-slide.next {
opacity: 0;
transform: translateX(100px);
}
/* Charts Grid */
.beatport-charts-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 20px;
padding: 20px;
background: linear-gradient(135deg,
rgba(16, 16, 16, 0.6),
rgba(24, 24, 24, 0.4));
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.08);
justify-items: center;
align-items: center;
margin: 0 auto;
}
/* Chart Card Styling - Large Background Photo Design */
.beatport-chart-card {
position: relative;
width: 100%;
height: 200px;
min-height: 200px;
max-height: 200px;
border-radius: 16px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
overflow: hidden;
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.4),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-chart-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--chart-bg-image, linear-gradient(135deg, rgb(var(--accent-rgb)), #191414));
background-size: cover;
background-position: center;
border-radius: 16px;
z-index: 1;
}
.beatport-chart-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.2) 0%,
rgba(0, 0, 0, 0.4) 50%,
rgba(0, 0, 0, 0.7) 100%);
border-radius: 16px;
z-index: 2;
}
.beatport-chart-card:hover {
transform: translateY(-12px) scale(1.08);
box-shadow:
0 25px 50px rgba(0, 0, 0, 0.7),
0 0 40px rgba(var(--accent-rgb), 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
z-index: 20;
}
.beatport-chart-card:hover::after {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.2) 0%,
rgba(0, 0, 0, 0.2) 50%,
rgba(0, 0, 0, 0.5) 100%);
}
.beatport-chart-card:hover .beatport-chart-name {
color: rgba(var(--accent-rgb), 0.95);
text-shadow: 0 2px 12px rgba(0, 0, 0, 0.9);
transform: translateY(-2px);
}
.beatport-chart-card:hover .beatport-chart-creator {
color: #ffffff;
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.9);
transform: translateY(-1px);
}
.beatport-chart-card-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 20px;
z-index: 3;
text-align: left;
}
.beatport-chart-name {
font-size: 15px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
line-height: 1.2;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.8);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.beatport-chart-creator {
font-size: 12px;
color: rgba(255, 255, 255, 0.9);
font-weight: 500;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
/* Charts Loading State */
.beatport-charts-loading {
display: flex;
align-items: center;
justify-content: center;
height: 500px;
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.1),
rgba(16, 16, 16, 0.8));
border-radius: 16px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
}
.beatport-charts-loading-content {
text-align: center;
color: #ffffff;
}
.beatport-charts-loading-content h3 {
font-size: 24px;
margin-bottom: 8px;
color: rgba(var(--accent-rgb), 0.9);
}
.beatport-charts-loading-content p {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* Charts Navigation */
.beatport-charts-slider-nav {
position: absolute;
top: 50%;
left: 0;
right: 0;
transform: translateY(-50%);
display: flex;
justify-content: space-between;
padding: 0 20px;
pointer-events: none;
z-index: 100;
}
.beatport-charts-nav-btn {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 0.9),
rgba(var(--accent-rgb), 0.7));
border: none;
color: #ffffff;
font-size: 24px;
font-weight: 600;
width: 50px;
height: 50px;
border-radius: 50%;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
backdrop-filter: blur(10px);
border: 2px solid rgba(255, 255, 255, 0.2);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
pointer-events: auto;
display: flex;
align-items: center;
justify-content: center;
}
.beatport-charts-nav-btn:hover {
background: linear-gradient(135deg,
rgba(var(--accent-rgb), 1),
rgba(24, 160, 72, 0.9));
transform: scale(1.1);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 20px rgba(var(--accent-rgb), 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
}
.beatport-charts-nav-btn:active {
transform: scale(0.95);
}
/* Charts Indicators */
.beatport-charts-slider-indicators {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 12px;
z-index: 10;
}
.beatport-charts-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.4);
border: none;
cursor: pointer;
transition: all 0.3s ease;
}
.beatport-charts-indicator.active {
background: rgba(var(--accent-rgb), 0.9);
transform: scale(1.2);
box-shadow: 0 0 10px rgba(var(--accent-rgb), 0.5);
}
.beatport-charts-indicator:hover {
background: rgba(255, 255, 255, 0.6);
transform: scale(1.1);
}
/* Charts Responsive Design */
@media (max-width: 1100px) {
.beatport-charts-grid {
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(2, 1fr);
}
}
@media (max-width: 1200px) {
.beatport-charts-grid {
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 16px;
}
.beatport-chart-card {
height: 180px;
min-height: 180px;
max-height: 180px;
}
}
@media (max-width: 900px) {
.beatport-charts-grid {
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 14px;
}
.beatport-charts-slider-container {
padding: 20px;
}
}
@media (max-width: 600px) {
.beatport-charts-grid {
grid-template-columns: 1fr;
grid-template-rows: repeat(5, 1fr);
gap: 12px;
}
.beatport-charts-section {
padding: 0 15px;
}
.beatport-charts-title {
font-size: 24px;
}
}
/* ==================== DJ CHARTS SLIDER STYLES ==================== */
/* DJ Section */
.beatport-dj-section {
margin-top: 40px;
padding: 0 30px;
}
.beatport-dj-header {
text-align: center;
margin-bottom: 30px;
}
.beatport-dj-title {
font-size: 32px;
font-weight: 700;
color: #ffffff;
margin-bottom: 8px;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
.beatport-dj-subtitle {
font-size: 16px;
color: rgba(255, 255, 255, 0.8);
margin: 0;
}
/* DJ Slider Container */
.beatport-dj-slider-container {
position: relative;
background: linear-gradient(135deg,
rgba(147, 51, 234, 0.1),
rgba(79, 70, 229, 0.05));
border-radius: 20px;
border: 1px solid rgba(147, 51, 234, 0.2);
backdrop-filter: blur(15px);
min-height: 300px;
padding: 30px;
}
.beatport-dj-slider {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
border-radius: 16px;
}
.beatport-dj-slider-track {
position: relative;
height: 300px;
}
.beatport-dj-slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
transform: translateX(100px);
}
.beatport-dj-slide.active {
opacity: 1;
z-index: 10;
transform: translateX(0);
}
.beatport-dj-slide.prev {
opacity: 0;
transform: translateX(-100px);
}
.beatport-dj-slide.next {
opacity: 0;
transform: translateX(100px);
}
/* DJ Cards Layout - 3 cards per slide */
.beatport-dj-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 25px;
padding: 20px;
background: linear-gradient(135deg,
rgba(16, 16, 16, 0.6),
rgba(24, 24, 24, 0.4));
border-radius: 16px;
border: 1px solid rgba(147, 51, 234, 0.15);
justify-items: center;
align-items: center;
margin: 0 auto;
}
/* DJ Chart Card Styling - Unique vertical design */
.beatport-dj-card {
position: relative;
width: 100%;
height: 220px;
min-height: 220px;
max-height: 220px;
border-radius: 20px;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
overflow: hidden;
background: linear-gradient(135deg,
rgba(147, 51, 234, 0.8),
rgba(79, 70, 229, 0.6));
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.4),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.beatport-dj-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--dj-bg-image, linear-gradient(135deg, #9333ea, #4f46e5));
background-size: cover;
background-position: center;
border-radius: 20px;
z-index: 1;
}
.beatport-dj-card::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(180deg,
rgba(147, 51, 234, 0.3) 0%,
rgba(0, 0, 0, 0.4) 50%,
rgba(0, 0, 0, 0.8) 100%);
border-radius: 20px;
z-index: 2;
}
.beatport-dj-card:hover {
transform: translateY(-15px) scale(1.1);
box-shadow:
0 30px 60px rgba(0, 0, 0, 0.8),
0 0 50px rgba(147, 51, 234, 0.6),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
z-index: 25;
}
.beatport-dj-card:hover::after {
background: linear-gradient(180deg,
rgba(147, 51, 234, 0.4) 0%,
rgba(0, 0, 0, 0.2) 50%,
rgba(0, 0, 0, 0.6) 100%);
}
.beatport-dj-card:hover .beatport-dj-name {
color: rgba(147, 51, 234, 0.95);
text-shadow: 0 2px 15px rgba(0, 0, 0, 0.9);
transform: translateY(-3px);
}
.beatport-dj-card:hover .beatport-dj-creator {
color: #ffffff;
text-shadow: 0 1px 10px rgba(0, 0, 0, 0.9);
transform: translateY(-2px);
}
.beatport-dj-card-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 25px;
z-index: 3;
text-align: center;
}
.beatport-dj-name {
font-size: 20px;
font-weight: 700;
color: #ffffff;
margin-bottom: 10px;
line-height: 1.2;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.8);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.beatport-dj-creator {
display: none;
font-size: 16px;
color: rgba(255, 255, 255, 0.9);
font-weight: 500;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.8);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
/* DJ Loading State */
.beatport-dj-loading {
display: flex;
align-items: center;
justify-content: center;
height: 300px;
background: linear-gradient(135deg,
rgba(147, 51, 234, 0.1),
rgba(16, 16, 16, 0.8));
border-radius: 16px;
border: 1px solid rgba(147, 51, 234, 0.2);
}
.beatport-dj-loading-content {
text-align: center;
color: #ffffff;
}
.beatport-dj-loading-content h3 {
font-size: 24px;
margin-bottom: 8px;
color: rgba(147, 51, 234, 0.9);
}
.beatport-dj-loading-content p {
font-size: 16px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
/* DJ Navigation */
.beatport-dj-slider-nav {
position: absolute;
top: 50%;
left: 0;
right: 0;
transform: translateY(-50%);
display: flex;
justify-content: space-between;
padding: 0 20px;
pointer-events: none;
z-index: 100;
}
.beatport-dj-nav-btn {
background: linear-gradient(135deg,
rgba(147, 51, 234, 0.9),
rgba(79, 70, 229, 0.8));
border: none;
color: #ffffff;
font-size: 24px;
font-weight: 600;
width: 50px;
height: 50px;
border-radius: 50%;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
backdrop-filter: blur(10px);
border: 2px solid rgba(255, 255, 255, 0.2);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.2);
pointer-events: auto;
display: flex;
align-items: center;
justify-content: center;
}
.beatport-dj-nav-btn:hover {
background: linear-gradient(135deg,
rgba(147, 51, 234, 1),
rgba(79, 70, 229, 0.9));
transform: scale(1.1);
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.4),
0 0 20px rgba(147, 51, 234, 0.5),
inset 0 1px 0 rgba(255, 255, 255, 0.3);
}
.beatport-dj-nav-btn:active {
transform: scale(0.95);
}
/* DJ Indicators */
.beatport-dj-slider-indicators {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 8px;
z-index: 10;
}
.beatport-dj-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.4);
border: none;
cursor: pointer;
transition: all 0.3s ease;
}
.beatport-dj-indicator.active {
background: rgba(147, 51, 234, 0.9);
transform: scale(1.2);
box-shadow: 0 0 10px rgba(147, 51, 234, 0.5);
}
.beatport-dj-indicator:hover {
background: rgba(255, 255, 255, 0.6);
transform: scale(1.1);
}
/* DJ Responsive Design */
/* Larger screens: make DJ cards taller */
@media (min-width: 1300px) {
.beatport-dj-card {
height: 330px;
min-height: 330px;
max-height: 330px;
}
.beatport-dj-grid {
align-items: stretch;
/* Allow cards to use full height instead of centering */
min-height: 370px;
/* Accommodate taller cards + padding + gap */
}
.beatport-dj-slider {
min-height: 410px;
/* Ensure slider container is tall enough */
}
.beatport-dj-slider-track {
height: 410px;
/* Increase to accommodate taller grid */
}
}
@media (max-width: 1200px) {
.beatport-dj-grid {
grid-template-columns: repeat(2, 1fr);
gap: 20px;
}
.beatport-dj-card {
height: 200px;
min-height: 200px;
max-height: 200px;
}
}
@media (max-width: 900px) {
.beatport-dj-grid {
grid-template-columns: 1fr;
gap: 16px;
}
.beatport-dj-slider-container {
padding: 20px;
}
.beatport-dj-card {
height: 180px;
min-height: 180px;
max-height: 180px;
}
}
@media (max-width: 600px) {
.beatport-dj-section {
padding: 0 15px;
}
.beatport-dj-title {
font-size: 24px;
}
}
/* ======================================
BEATPORT NAVIGATION BUTTONS SECTION
====================================== */
.beatport-nav-buttons-section {
padding: 30px 20px;
margin-bottom: 20px;
}
.beatport-nav-buttons-container {
display: flex;
gap: 20px;
justify-content: center;
align-items: center;
max-width: 900px;
margin: 0 auto;
}
.beatport-nav-button {
flex: 1;
max-width: 280px;
min-height: 70px;
padding: 16px 24px;
border: none;
border-radius: 12px;
background: linear-gradient(135deg,
rgba(1, 255, 149, 0.1) 0%,
rgba(0, 224, 133, 0.08) 100%);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 20, 147, 0.4);
color: #ffffff;
font-family: inherit;
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
position: relative;
overflow: hidden;
}
.beatport-nav-button::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
transparent,
rgba(1, 255, 149, 0.1),
transparent);
transition: left 0.5s ease;
}
.beatport-nav-button:hover {
background: linear-gradient(135deg,
rgba(1, 255, 149, 0.2) 0%,
rgba(0, 224, 133, 0.15) 100%);
border-color: rgba(255, 20, 147, 0.6);
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(138, 43, 226, 0.3);
color: #01FF95;
}
.beatport-nav-button:hover::before {
left: 100%;
}
.beatport-nav-button:active {
transform: translateY(0);
transition: transform 0.1s ease;
}
.beatport-nav-icon {
width: 20px;
height: 20px;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
flex-shrink: 0;
transition: all 0.3s ease;
}
.beatport-nav-text {
font-weight: 600;
white-space: nowrap;
}
/* Icons for navigation buttons */
.genre-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.top100-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.hype-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-nav-button:hover .genre-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-nav-button:hover .top100-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
.beatport-nav-button:hover .hype-icon {
background-image: url('data:image/svg+xml;charset=utf-8,');
}
/* Responsive design for navigation buttons */
@media (max-width: 768px) {
.beatport-nav-buttons-container {
flex-direction: column;
gap: 15px;
}
.beatport-nav-button {
max-width: none;
width: 100%;
}
}
@media (max-width: 600px) {
.beatport-nav-buttons-section {
padding: 20px 15px;
}
.beatport-nav-button {
min-height: 60px;
padding: 12px 20px;
font-size: 14px;
}
.beatport-nav-icon {
width: 18px;
height: 18px;
}
}
/* ================================= */
/* GENRE BROWSER MODAL STYLES */
/* ================================= */
.genre-browser-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(10px);
display: none;
justify-content: center;
align-items: center;
z-index: 8888;
animation: genreBrowserFadeIn 0.3s ease-out;
}
.genre-browser-modal-overlay.active {
display: flex;
}
.genre-browser-modal-container {
background: linear-gradient(135deg,
rgba(15, 15, 15, 0.95) 0%,
rgba(20, 20, 20, 0.95) 50%,
rgba(25, 25, 25, 0.95) 100%);
border-radius: 20px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.8);
width: 95vw;
height: 90vh;
max-width: 1600px;
display: flex;
flex-direction: column;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.1);
animation: genreBrowserSlideIn 0.4s ease-out;
}
.genre-browser-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 25px 30px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
background: linear-gradient(90deg,
rgba(30, 30, 30, 0.8) 0%,
rgba(40, 40, 40, 0.8) 100%);
}
.genre-browser-modal-title {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin: 0;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
.genre-browser-modal-close {
background: rgba(255, 255, 255, 0.1);
border: none;
border-radius: 50%;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
}
.genre-browser-modal-close:hover {
background: rgba(255, 255, 255, 0.2);
transform: scale(1.1);
}
.genre-browser-close-icon {
font-size: 24px;
color: #ffffff;
font-weight: 300;
}
.genre-browser-modal-content {
flex: 1;
padding: 30px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 25px;
}
.genre-browser-search-section {
width: 100%;
}
.genre-browser-search-container {
position: relative;
max-width: 500px;
margin: 0 auto;
}
.genre-browser-search-input {
width: 100%;
padding: 15px 20px 15px 50px;
border: 2px solid rgba(255, 255, 255, 0.1);
border-radius: 25px;
background: rgba(20, 20, 20, 0.8);
color: #ffffff;
font-size: 16px;
outline: none;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
}
.genre-browser-search-input:focus {
border-color: rgb(var(--accent-rgb));
box-shadow: 0 0 20px rgba(var(--accent-rgb), 0.3);
}
.genre-browser-search-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.genre-browser-search-icon {
position: absolute;
left: 18px;
top: 50%;
transform: translateY(-50%);
font-size: 18px;
color: rgba(255, 255, 255, 0.6);
}
.genre-browser-genres-section {
flex: 1;
}
.genre-browser-genres-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 20px;
padding: 10px 0;
}
.genre-browser-loading-container {
grid-column: 1 / -1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.7);
}
.genre-browser-loading-spinner {
width: 40px;
height: 40px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top: 3px solid rgb(var(--accent-rgb));
border-radius: 50%;
animation: genreBrowserSpin 1s linear infinite;
margin-bottom: 20px;
}
.genre-browser-loading-text {
font-size: 16px;
text-align: center;
margin: 0;
}
.genre-browser-card {
background: linear-gradient(135deg,
rgba(25, 25, 25, 0.9) 0%,
rgba(35, 35, 35, 0.9) 100%);
border-radius: 16px;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
cursor: pointer;
position: relative;
height: 200px;
backdrop-filter: blur(10px);
}
.genre-browser-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.6);
border-color: rgba(var(--accent-rgb), 0.5);
}
.genre-browser-card-image {
width: 100%;
height: 120px;
object-fit: cover;
transition: all 0.3s ease;
}
.genre-browser-card:hover .genre-browser-card-image {
transform: scale(1.05);
}
.genre-browser-card-content {
padding: 20px;
position: relative;
z-index: 2;
}
.genre-browser-card-title {
font-size: 18px;
font-weight: 600;
color: #ffffff;
margin: 0 0 8px 0;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.7);
}
.genre-browser-card-subtitle {
font-size: 14px;
color: rgba(255, 255, 255, 0.7);
margin: 0;
}
.genre-browser-card-fallback {
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.9) 0%,
rgba(45, 45, 45, 0.9) 100%);
}
.genre-browser-card-fallback .genre-browser-card-image {
background: linear-gradient(135deg,
rgba(40, 40, 40, 1) 0%,
rgba(60, 60, 60, 1) 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
color: rgba(255, 255, 255, 0.6);
}
/* Responsive Design */
@media (max-width: 768px) {
.genre-browser-modal-container {
width: 95vw;
height: 90vh;
border-radius: 15px;
}
.genre-browser-modal-header {
padding: 20px;
}
.genre-browser-modal-title {
font-size: 22px;
}
.genre-browser-modal-content {
padding: 20px;
gap: 20px;
}
.genre-browser-genres-grid {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 15px;
}
.genre-browser-card {
height: 180px;
}
}
@media (max-width: 480px) {
.genre-browser-genres-grid {
grid-template-columns: 1fr;
gap: 12px;
}
.genre-browser-card {
height: 160px;
}
}
/* Animations */
@keyframes genreBrowserFadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes genreBrowserSlideIn {
from {
opacity: 0;
transform: scale(0.9) translateY(20px);
}
to {
opacity: 1;
transform: scale(1) translateY(0);
}
}
@keyframes genreBrowserSpin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
/* === GENRE PAGE VIEW STYLES === */
.genre-page-content {
display: none;
width: 100%;
height: 100%;
animation: genreBrowserSlideIn 0.3s ease;
}
.genre-page-header {
display: flex;
align-items: center;
gap: 15px;
margin-bottom: 25px;
padding-bottom: 15px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.genre-back-button {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.8) 0%,
rgba(20, 20, 20, 0.9) 100%);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 10px;
color: rgba(255, 255, 255, 0.9);
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
}
.genre-back-button:hover {
background: linear-gradient(135deg,
rgba(40, 40, 40, 0.9) 0%,
rgba(30, 30, 30, 0.95) 100%);
border-color: rgba(255, 255, 255, 0.25);
transform: translateX(-2px);
}
.back-icon {
font-size: 16px;
transition: transform 0.2s ease;
}
.genre-back-button:hover .back-icon {
transform: translateX(-2px);
}
.genre-page-title {
font-size: 24px;
font-weight: 600;
color: #ffffff;
margin: 0;
}
.genre-hero-slider-container {
width: 100%;
height: fit-content;
overflow-y: auto;
}
.genre-loading-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.7);
}
.genre-loading-spinner {
width: 40px;
height: 40px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top: 3px solid rgb(var(--accent-rgb));
border-radius: 50%;
animation: genreBrowserSpin 1s linear infinite;
margin-bottom: 15px;
}
.genre-loading-text {
font-size: 16px;
margin: 0;
text-align: center;
}
.genre-error-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
}
.genre-error-text {
font-size: 18px;
color: #ff6b6b;
margin: 0 0 10px 0;
}
.genre-error-details {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
margin: 0 0 20px 0;
}
.genre-retry-button {
padding: 10px 20px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.8) 0%,
rgba(20, 20, 20, 0.9) 100%);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 10px;
color: rgba(255, 255, 255, 0.9);
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
}
.genre-retry-button:hover {
background: linear-gradient(135deg,
rgba(40, 40, 40, 0.9) 0%,
rgba(30, 30, 30, 0.95) 100%);
border-color: rgba(255, 255, 255, 0.25);
}
/* === GENRE NAV BUTTONS SECTION === */
.genre-nav-buttons-section {
margin-top: 30px;
padding: 20px 0;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.genre-nav-buttons-container {
display: flex;
justify-content: center;
align-items: center;
gap: 20px;
}
/* The button styles are already defined in the main .beatport-nav-button class */
/* This ensures the genre page button looks identical to the main page buttons */
/* Responsive adjustments for genre page */
@media (max-width: 768px) {
.genre-page-header {
flex-direction: column;
align-items: flex-start;
gap: 10px;
}
.genre-page-title {
font-size: 20px;
}
.genre-nav-buttons-section {
margin-top: 20px;
padding: 15px 0;
}
}
/* ============================================================================
DISCOVERY FIX MODAL STYLING
============================================================================ */
/* Fix modal overlay - nested inside discovery modal */
.discovery-fix-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(8px);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
/* Above parent modal content */
transition: opacity 0.2s ease;
}
.discovery-fix-modal-overlay.hidden {
display: none;
}
.discovery-fix-modal {
background: linear-gradient(135deg, rgba(20, 20, 20, 0.98) 0%, rgba(12, 12, 12, 0.99) 100%);
backdrop-filter: blur(20px);
border-radius: 16px;
padding: 0;
width: 700px;
max-width: 90vw;
max-height: 85vh;
overflow: hidden;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6),
0 0 1px rgba(255, 255, 255, 0.1) inset;
border: 1px solid rgba(255, 255, 255, 0.1);
display: flex;
flex-direction: column;
}
.discovery-fix-modal-header {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.15) 0%, rgba(var(--accent-rgb), 0.05) 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding: 20px 24px;
display: flex;
justify-content: space-between;
align-items: center;
}
.discovery-fix-modal-header h2 {
font-size: 20px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin: 0;
}
.discovery-fix-modal-content {
padding: 24px;
overflow: hidden;
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
.discovery-fix-modal-content .search-results-section {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.source-track-info {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 16px;
margin-bottom: 24px;
flex-shrink: 0;
}
.source-track-info h3 {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.source-track-display {
display: flex;
flex-direction: column;
gap: 8px;
}
.source-field {
display: flex;
align-items: baseline;
gap: 12px;
}
.source-field label {
font-size: 13px;
font-weight: 500;
color: rgba(255, 255, 255, 0.5);
min-width: 60px;
}
.source-field span {
font-size: 14px;
color: rgba(255, 255, 255, 0.9);
font-weight: 500;
}
.search-inputs-section {
margin-bottom: 24px;
flex-shrink: 0;
}
.search-inputs-section h3 {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.search-input-group {
display: flex;
gap: 12px;
align-items: stretch;
}
.fix-modal-input {
flex: 1;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 10px 14px;
color: rgba(255, 255, 255, 0.9);
font-size: 14px;
font-family: inherit;
transition: all 0.2s ease;
}
.fix-modal-input:focus {
outline: none;
background: rgba(255, 255, 255, 0.08);
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1);
}
.fix-modal-input::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.search-btn {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.9) 0%, rgba(var(--accent-rgb), 0.7) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 8px;
padding: 10px 20px;
color: white;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
white-space: nowrap;
}
.search-btn:hover {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 1) 0%, rgba(var(--accent-rgb), 0.8) 100%);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}
.search-btn:active {
transform: translateY(0);
}
.search-results-section h3 {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.fix-modal-results {
display: flex;
flex-direction: column;
gap: 8px;
flex: 1;
min-height: 0;
overflow-y: auto;
}
.fix-result-card {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
padding: 14px 16px;
cursor: pointer;
transition: all 0.2s ease;
}
.fix-result-card:hover {
background: rgba(var(--accent-rgb), 0.1);
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateX(4px);
}
.fix-result-card-content {
display: flex;
flex-direction: column;
gap: 4px;
}
.fix-result-title {
font-size: 15px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
}
.fix-result-artist {
font-size: 13px;
color: rgba(255, 255, 255, 0.7);
}
.fix-result-album {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.fix-result-duration {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
}
.discovery-fix-modal-footer {
background: rgba(255, 255, 255, 0.02);
border-top: 1px solid rgba(255, 255, 255, 0.08);
padding: 16px 24px;
display: flex;
justify-content: flex-end;
gap: 12px;
}
.modal-btn {
padding: 10px 20px;
border-radius: 8px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
border: none;
font-family: inherit;
}
.modal-btn.secondary {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.7);
}
.modal-btn.secondary:hover {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.9);
}
/* Action buttons in discovery table */
.discovery-actions {
text-align: center;
}
.fix-match-btn,
.rematch-btn {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.1) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 6px;
padding: 6px 12px;
color: rgba(var(--accent-rgb), 0.95);
font-size: 13px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
white-space: nowrap;
}
.fix-match-btn:hover,
.rematch-btn:hover {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.3) 0%, rgba(var(--accent-rgb), 0.2) 100%);
border-color: rgba(var(--accent-rgb), 0.5);
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.2);
}
.fix-match-btn:active,
.rematch-btn:active {
transform: translateY(0);
}
.rematch-btn {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.04) 100%);
border-color: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.7);
padding: 4px 10px;
font-size: 16px;
}
.rematch-btn:hover {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.12) 0%, rgba(255, 255, 255, 0.08) 100%);
border-color: rgba(255, 255, 255, 0.25);
color: rgba(255, 255, 255, 0.9);
}
/* Loading and error states */
.fix-modal-results .loading,
.fix-modal-results .error-message,
.fix-modal-results .no-results {
text-align: center;
padding: 40px 20px;
color: rgba(255, 255, 255, 0.5);
font-size: 14px;
}
.fix-modal-results .error-message {
color: rgba(239, 68, 68, 0.9);
}
/* ===============================================
Similar Artists Section - Artists Page
=============================================== */
.similar-artists-section {
margin-top: 60px;
padding: 40px 0;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.similar-artists-header {
margin-bottom: 32px;
}
.similar-artists-title {
font-size: 28px;
font-weight: 700;
color: #ffffff;
margin: 0 0 8px 0;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
letter-spacing: -0.5px;
}
.similar-artists-subtitle {
font-size: 15px;
color: rgba(255, 255, 255, 0.6);
margin: 0;
font-weight: 500;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
/* Loading State */
.similar-artists-loading {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.6);
font-size: 15px;
font-weight: 500;
}
.loading-spinner-small {
width: 20px;
height: 20px;
border: 2px solid rgba(255, 255, 255, 0.1);
border-top-color: rgb(var(--accent-rgb));
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
/* Error State */
.similar-artists-error {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
padding: 60px 20px;
color: rgba(239, 68, 68, 0.8);
font-size: 15px;
font-weight: 500;
}
.similar-artists-error .error-icon {
font-size: 20px;
}
/* Bubbles Container - Horizontal Scroll */
.similar-artists-bubbles-container {
display: grid;
grid-auto-flow: column;
grid-auto-columns: calc((100% - (5 * 24px)) / 6);
/* Each item is 1/6th of container width */
gap: 24px;
overflow-x: auto;
padding: 20px 0 30px 0;
scroll-behavior: smooth;
/* Custom scrollbar */
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.2) rgba(255, 255, 255, 0.05);
}
.similar-artists-bubbles-container::-webkit-scrollbar {
height: 8px;
}
.similar-artists-bubbles-container::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
}
.similar-artists-bubbles-container::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 10px;
transition: background 0.2s ease;
}
.similar-artists-bubbles-container::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
/* Similar Artist Card — full-bleed image, library-card style */
.similar-artist-bubble {
display: block;
position: relative;
overflow: hidden;
border-radius: 14px;
cursor: pointer;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: rgba(18, 18, 18, 1);
border: 1px solid rgba(255, 255, 255, 0.06);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
aspect-ratio: 0.8;
/* Progressive load animation */
opacity: 0;
transform: translateY(16px) scale(0.97);
animation: fadeInUp 0.35s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(16px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.similar-artist-bubble:hover {
transform: translateY(-5px) scale(1.02);
border-color: rgba(var(--accent-rgb), 0.25);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5),
0 0 24px rgba(var(--accent-rgb), 0.12);
}
/* Gradient overlay for text readability */
.similar-artist-bubble::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.85) 0%,
rgba(0, 0, 0, 0.3) 40%,
transparent 65%);
pointer-events: none;
z-index: 1;
}
/* Image fills the card */
.similar-artist-bubble-image {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
border-radius: 0;
overflow: hidden;
border: none;
box-shadow: none;
transition: transform 0.3s ease;
}
.similar-artist-bubble:hover .similar-artist-bubble-image {
transform: scale(1.06);
}
.similar-artist-bubble-image img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.similar-artist-bubble-image-fallback {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
font-size: 40px;
color: rgba(255, 255, 255, 0.2);
}
/* Name pinned at bottom over gradient */
.similar-artist-bubble-name {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 12px;
z-index: 2;
text-align: left;
font-size: 13px;
font-weight: 700;
color: #fff;
line-height: 1.25;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
width: auto;
/* Truncate long names */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.similar-artist-bubble:hover .similar-artist-bubble-name {
color: rgb(var(--accent-rgb));
}
/* Genres (Optional - hidden by default for cleaner look) */
.similar-artist-bubble-genres {
display: none; /* Hidden in card layout — name + image is enough */
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
text-align: center;
width: 100%;
/* Truncate */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
/* Responsive adjustments */
@media (max-width: 1400px) {
.similar-artists-bubbles-container {
grid-auto-columns: calc((100% - (4 * 24px)) / 5);
}
}
@media (max-width: 1200px) {
.similar-artists-bubbles-container {
grid-auto-columns: calc((100% - (3 * 24px)) / 4);
}
}
@media (max-width: 900px) {
.similar-artists-bubbles-container {
grid-auto-columns: calc((100% - (2 * 24px)) / 3);
}
}
@media (max-width: 768px) {
.similar-artists-section {
margin-top: 40px;
padding: 30px 0;
}
.similar-artists-title {
font-size: 24px;
}
.similar-artists-bubbles-container {
grid-auto-columns: calc((100% - 16px) / 2);
gap: 16px;
}
.similar-artist-bubble-name {
font-size: 12px;
padding: 10px;
}
}
/* ====================================
Tool Help Button & Modal
==================================== */
.tool-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 2px;
}
.tool-card-header .tool-card-title {
margin: 0;
}
.tool-help-button {
width: 22px;
height: 22px;
border-radius: 50%;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.03);
color: rgba(255, 255, 255, 0.3);
font-size: 11px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
padding: 0;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
flex-shrink: 0;
}
.tool-help-button:hover {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.3), rgba(var(--accent-light-rgb), 0.2));
border-color: rgba(var(--accent-rgb), 0.4);
color: rgb(var(--accent-light-rgb));
transform: scale(1.1);
box-shadow: 0 0 10px rgba(var(--accent-rgb), 0.3);
}
.discover-page-help-button {
position: absolute;
top: 20px;
right: 20px;
z-index: 10;
width: 32px;
height: 32px;
font-size: 16px;
background-color: rgba(0, 0, 0, 0.6);
border: 2px solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(10px);
}
.discover-page-help-button:hover {
background-color: rgb(var(--accent-rgb));
border-color: rgb(var(--accent-rgb));
transform: scale(1.15);
}
.tool-help-modal {
display: none;
position: fixed;
z-index: 10000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
animation: fadeIn 0.2s ease;
}
.tool-help-modal.active {
display: flex;
align-items: center;
justify-content: center;
}
.tool-help-modal-content {
background-color: #1a1a1a;
border-radius: 12px;
max-width: 600px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
animation: slideUp 0.3s ease;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideUp {
from {
transform: translateY(30px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.tool-help-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
border-bottom: 1px solid #333;
}
.tool-help-modal-header h3 {
margin: 0;
font-size: 20px;
color: #fff;
}
.tool-help-modal-close {
background: none;
border: none;
color: #999;
font-size: 32px;
cursor: pointer;
padding: 0;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
transition: color 0.2s ease;
line-height: 1;
}
.tool-help-modal-close:hover {
color: #fff;
}
.tool-help-modal-body {
padding: 24px;
color: #ccc;
line-height: 1.6;
}
.tool-help-modal-body h4 {
color: rgb(var(--accent-rgb));
margin-top: 20px;
margin-bottom: 10px;
font-size: 16px;
}
.tool-help-modal-body h4:first-child {
margin-top: 0;
}
.tool-help-modal-body ul {
margin: 10px 0;
padding-left: 20px;
}
.tool-help-modal-body li {
margin: 8px 0;
}
.tool-help-modal-body p {
margin: 10px 0;
}
.tool-help-modal-body code {
background-color: #2a2a2a;
padding: 2px 6px;
border-radius: 4px;
font-family: 'Courier New', monospace;
font-size: 13px;
color: rgb(var(--accent-rgb));
}
.tool-help-modal-body strong {
color: #fff;
}
/* ====================================
Retag Tool Modal Styles
==================================== */
.retag-modal-overlay,
.retag-search-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(18, 18, 18, 0.85);
backdrop-filter: blur(12px);
z-index: 10001;
align-items: center;
justify-content: center;
}
.retag-search-overlay {
z-index: 10002;
}
/* Main modal — fullscreen glassmorphic */
.retag-modal-container {
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.12);
border-top: 1px solid rgba(255, 255, 255, 0.18);
max-width: 95vw;
width: 95vw;
max-height: 95vh;
display: flex;
flex-direction: column;
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.6),
0 8px 32px rgba(0, 0, 0, 0.4),
0 0 40px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
overflow: hidden;
}
.retag-modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 24px 32px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
}
.retag-modal-header-left {
display: flex;
align-items: center;
gap: 16px;
}
.retag-modal-title {
font-size: 22px;
font-weight: 700;
color: #fff;
margin: 0;
}
.retag-header-actions {
display: flex;
align-items: center;
gap: 10px;
}
.retag-clear-all-btn {
background: none;
border: 1px solid rgba(255, 59, 48, 0.3);
color: #ff6b6b;
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease, border-color 0.15s ease;
}
.retag-clear-all-btn:hover {
background: rgba(255, 59, 48, 0.15);
border-color: rgba(255, 59, 48, 0.5);
}
.retag-modal-close {
background: none;
border: none;
color: #b3b3b3;
font-size: 28px;
cursor: pointer;
padding: 0;
line-height: 1;
transition: color 0.2s;
}
.retag-modal-close:hover {
color: #fff;
}
.retag-modal-body {
padding: 24px 32px;
overflow-y: auto;
flex: 1;
}
.retag-loading,
.retag-empty,
.retag-error {
text-align: center;
color: #b3b3b3;
padding: 60px 0;
font-size: 15px;
}
/* Batch action bar */
.retag-batch-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 20px;
margin: 0 32px 16px;
background: rgba(255, 59, 48, 0.1);
border: 1px solid rgba(255, 59, 48, 0.25);
border-radius: 10px;
animation: batchBarSlideIn 0.2s ease-out;
}
.retag-batch-count {
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.8);
}
.retag-batch-remove-btn {
background: none;
border: 1px solid rgba(255, 59, 48, 0.4);
color: #ff6b6b;
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease;
}
.retag-batch-remove-btn:hover {
background: rgba(255, 59, 48, 0.2);
border-color: rgba(255, 59, 48, 0.6);
}
/* Artist sections */
.retag-artist-section {
margin-bottom: 28px;
}
.retag-artist-name {
font-size: 13px;
font-weight: 600;
color: rgb(var(--accent-light-rgb));
text-transform: uppercase;
letter-spacing: 0.8px;
margin: 0 0 12px 0;
padding-bottom: 8px;
border-bottom: 1px solid rgba(var(--accent-rgb), 0.15);
}
/* Group cards */
.retag-group-card {
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
margin-bottom: 10px;
border: 1px solid rgba(255, 255, 255, 0.06);
transition: border-color 0.2s ease, background 0.2s ease;
}
.retag-group-card:hover {
border-color: rgba(var(--accent-rgb), 0.2);
background: rgba(255, 255, 255, 0.05);
}
.retag-group-header {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
cursor: pointer;
}
/* Group checkbox */
.retag-group-checkbox {
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
margin: 0;
}
.retag-group-checkbox input[type="checkbox"] {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.retag-group-checkbox .retag-checkbox-custom {
width: 20px;
height: 20px;
border: 2px solid rgba(255, 255, 255, 0.2);
border-radius: 4px;
background: rgba(255, 255, 255, 0.03);
transition: all 0.15s ease;
display: flex;
align-items: center;
justify-content: center;
}
.retag-group-checkbox:hover .retag-checkbox-custom {
border-color: rgba(255, 255, 255, 0.4);
background: rgba(255, 255, 255, 0.06);
}
.retag-group-checkbox input:checked+.retag-checkbox-custom {
background: rgba(var(--accent-rgb), 0.3);
border-color: rgb(var(--accent-rgb));
}
.retag-group-checkbox input:checked+.retag-checkbox-custom::after {
content: '\2713';
color: rgb(var(--accent-rgb));
font-size: 13px;
font-weight: 700;
}
.retag-group-image {
width: 56px;
height: 56px;
border-radius: 8px;
object-fit: cover;
flex-shrink: 0;
}
.retag-group-image-placeholder {
width: 56px;
height: 56px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.06);
flex-shrink: 0;
}
.retag-group-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 3px;
min-width: 0;
}
.retag-group-album {
font-weight: 600;
font-size: 15px;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.retag-group-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
}
.retag-group-btn {
background: rgb(var(--accent-rgb));
color: #fff;
border: none;
padding: 7px 18px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
flex-shrink: 0;
transition: background 0.15s ease;
}
.retag-group-btn:hover {
background: rgb(var(--accent-light-rgb));
}
/* Delete button — shows × or inline confirm */
.retag-group-delete-area {
flex-shrink: 0;
display: flex;
align-items: center;
}
.retag-group-delete-btn {
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 20px;
cursor: pointer;
padding: 4px 8px;
line-height: 1;
transition: color 0.15s ease;
}
.retag-group-delete-btn:hover {
color: #ff4444;
}
/* Inline confirmation */
.retag-confirm-inline {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
animation: batchBarSlideIn 0.15s ease-out;
}
.retag-confirm-inline span {
white-space: nowrap;
}
.retag-confirm-yes {
background: rgba(255, 59, 48, 0.2);
border: 1px solid rgba(255, 59, 48, 0.4);
color: #ff6b6b;
padding: 3px 10px;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease;
}
.retag-confirm-yes:hover {
background: rgba(255, 59, 48, 0.4);
}
.retag-confirm-no {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.6);
padding: 3px 10px;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease;
}
.retag-confirm-no:hover {
background: rgba(255, 255, 255, 0.1);
}
/* Track list */
.retag-group-tracks {
padding: 4px 16px 14px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.retag-track-item {
display: flex;
align-items: center;
gap: 10px;
padding: 7px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
}
.retag-track-item:last-child {
border-bottom: none;
}
.retag-track-number {
color: rgba(255, 255, 255, 0.3);
font-size: 12px;
width: 32px;
text-align: right;
flex-shrink: 0;
font-variant-numeric: tabular-nums;
}
.retag-track-title {
flex: 1;
color: #ddd;
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.retag-track-format {
color: rgb(var(--accent-rgb));
font-size: 11px;
font-weight: 600;
flex-shrink: 0;
}
.retag-tracks-loading,
.retag-tracks-empty {
color: rgba(255, 255, 255, 0.35);
font-size: 12px;
padding: 10px 0;
text-align: center;
margin: 0;
}
/* Search sub-modal — glassmorphic */
.retag-search-container {
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.95) 0%,
rgba(12, 12, 12, 0.98) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 16px;
border: 1px solid rgba(255, 255, 255, 0.12);
max-width: 650px;
width: 90%;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow:
0 20px 60px rgba(0, 0, 0, 0.6),
0 8px 32px rgba(0, 0, 0, 0.4),
0 0 30px rgba(var(--accent-rgb), 0.08);
overflow: hidden;
}
.retag-search-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
}
.retag-search-title {
font-size: 18px;
font-weight: 700;
color: #fff;
margin: 0;
}
.retag-search-close {
background: none;
border: none;
color: #b3b3b3;
font-size: 24px;
cursor: pointer;
padding: 0;
line-height: 1;
transition: color 0.2s;
}
.retag-search-close:hover {
color: #fff;
}
.retag-search-input-section {
padding: 20px 24px 12px;
flex-shrink: 0;
}
.retag-search-input-section input {
width: 100%;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
color: #fff;
font-size: 14px;
font-family: inherit;
outline: none;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
box-sizing: border-box;
}
.retag-search-input-section input:focus {
border-color: rgba(var(--accent-rgb), 0.4);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1);
}
.retag-search-results {
padding: 8px 24px 24px;
overflow-y: auto;
flex: 1;
}
.retag-search-loading,
.retag-no-results,
.retag-search-error {
text-align: center;
color: #b3b3b3;
padding: 24px 0;
font-size: 14px;
}
.retag-search-result {
display: flex;
align-items: center;
gap: 14px;
padding: 12px;
border-radius: 10px;
cursor: pointer;
transition: background 0.15s ease;
border: 1px solid transparent;
}
.retag-search-result:hover {
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.15);
}
/* Retag search result confirm state */
.retag-search-result.retag-confirming {
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.25);
cursor: default;
flex-wrap: wrap;
}
.retag-result-confirm-bar {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid rgba(var(--accent-rgb), 0.15);
}
.retag-result-confirm-bar span {
font-size: 13px;
color: rgba(255, 255, 255, 0.7);
}
.retag-result-confirm-actions {
display: flex;
gap: 8px;
}
.retag-result-confirm-yes {
background: rgb(var(--accent-rgb));
border: none;
color: #fff;
padding: 6px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease;
}
.retag-result-confirm-yes:hover {
background: rgb(var(--accent-light-rgb));
}
.retag-result-confirm-cancel {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.6);
padding: 6px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s ease;
}
.retag-result-confirm-cancel:hover {
background: rgba(255, 255, 255, 0.1);
}
.retag-result-image {
width: 56px;
height: 56px;
border-radius: 8px;
object-fit: cover;
flex-shrink: 0;
}
.retag-result-image-placeholder {
width: 56px;
height: 56px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.06);
flex-shrink: 0;
}
.retag-result-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 3px;
min-width: 0;
}
.retag-result-name {
font-weight: 600;
font-size: 15px;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.retag-result-artist {
font-size: 13px;
color: #b3b3b3;
}
.retag-result-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
}
/* ====================================
Discover Page Styles
==================================== */
.discover-container {
width: 100%;
max-width: 1600px;
margin: 0 auto;
padding: 0;
}
/* Hero Section */
.discover-hero {
position: relative;
width: 100%;
height: 550px;
border-radius: 16px;
overflow: hidden;
margin-bottom: 40px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
.discover-hero-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
background-size: cover;
background-position: center;
filter: blur(0px);
}
.discover-hero-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(90deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.4) 70%, transparent 100%);
}
.discover-hero-content {
position: relative;
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 60px;
gap: 40px;
}
.discover-hero-info {
flex: 1;
max-width: 600px;
z-index: 1;
}
.discover-hero-label {
font-size: 13px;
font-weight: 700;
letter-spacing: 3px;
color: rgb(var(--accent-rgb));
margin-bottom: 16px;
text-transform: uppercase;
display: inline-block;
padding: 6px 16px;
background: rgba(var(--accent-rgb), 0.15);
border-radius: 20px;
border: 1px solid rgba(var(--accent-rgb), 0.3);
}
.discover-hero-title {
font-size: 64px;
font-weight: 900;
color: #fff;
margin: 0 0 20px 0;
line-height: 1.05;
text-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
letter-spacing: -1px;
}
.discover-hero-subtitle {
font-size: 19px;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 20px;
line-height: 1.7;
font-weight: 400;
}
/* Hero Meta Section (Popularity & Genres) */
.discover-hero-meta {
margin-bottom: 28px;
}
.discover-hero-meta-content {
display: flex;
align-items: center;
gap: 20px;
flex-wrap: wrap;
}
.hero-meta-item {
display: flex;
align-items: center;
gap: 8px;
}
.hero-popularity {
padding: 8px 16px;
background: rgba(255, 255, 255, 0.1);
border-radius: 20px;
font-size: 14px;
font-weight: 600;
}
.hero-popularity.high {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.hero-popularity.medium {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.hero-popularity.low {
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
}
.hero-popularity .meta-icon {
font-size: 16px;
}
.hero-popularity .meta-value {
font-weight: 700;
}
.hero-popularity .meta-label {
opacity: 0.8;
font-size: 12px;
}
.hero-genres {
gap: 10px;
}
.genre-tag {
padding: 6px 14px;
background: rgba(255, 255, 255, 0.15);
border-radius: 16px;
font-size: 13px;
font-weight: 500;
color: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
transition: all 0.2s ease;
}
.genre-tag:hover {
background: rgba(255, 255, 255, 0.25);
transform: translateY(-2px);
}
.discover-hero-actions {
display: flex;
gap: 16px;
align-items: center;
flex-wrap: wrap;
}
.discover-hero-button {
display: flex;
align-items: center;
gap: 10px;
padding: 16px 36px;
border: none;
border-radius: 50px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
position: relative;
overflow: hidden;
z-index: 1;
}
.discover-hero-button::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: rgba(255, 255, 255, 0.2);
transform: translate(-50%, -50%);
transition: width 0.6s, height 0.6s;
}
.discover-hero-button:hover::before {
width: 300px;
height: 300px;
}
/* Discography button - prominent and large */
.discover-hero-button.secondary {
background-color: rgba(255, 255, 255, 0.12);
color: #fff;
border: 2px solid rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px);
padding: 18px 48px !important;
font-size: 17px !important;
font-weight: 700 !important;
gap: 12px !important;
}
.discover-hero-button.secondary .button-icon {
font-size: 20px !important;
}
.discover-hero-button.secondary .button-text {
font-size: 17px !important;
font-weight: 700 !important;
}
/* Watchlist button - smaller and subtle */
.discover-hero-button.primary.watchlist-toggle-btn {
background-color: rgb(var(--accent-rgb));
color: #fff;
padding: 9px 16px !important;
font-size: 13px !important;
font-weight: 600 !important;
gap: 6px !important;
}
.discover-hero-button.primary.watchlist-toggle-btn .watchlist-icon {
font-size: 13px !important;
}
.discover-hero-button.primary.watchlist-toggle-btn .watchlist-text {
flex: none !important;
text-align: left !important;
font-size: 13px !important;
}
.discover-hero-button.primary.watchlist-toggle-btn:hover {
background-color: rgb(var(--accent-light-rgb));
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(var(--accent-rgb), 0.4);
}
.discover-hero-button.primary.watchlist-toggle-btn:active {
transform: translateY(0);
}
.discover-hero-button.secondary:hover {
background-color: rgba(255, 255, 255, 0.2);
border-color: rgba(255, 255, 255, 0.4);
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(255, 255, 255, 0.15);
}
.discover-hero-button.secondary:active {
transform: translateY(0);
}
.discover-hero-button.primary.watchlist-toggle-btn.watching {
background-color: rgba(var(--accent-rgb), 0.2) !important;
border: 2px solid rgba(var(--accent-rgb), 0.5) !important;
color: rgb(var(--accent-rgb)) !important;
}
.discover-hero-button.primary.watchlist-toggle-btn.watching:hover {
background-color: rgba(var(--accent-rgb), 0.3) !important;
border-color: rgba(var(--accent-rgb), 0.7) !important;
}
.discover-hero-image {
flex-shrink: 0;
width: 360px;
height: 360px;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
border: 3px solid rgba(255, 255, 255, 0.1);
transition: transform 0.3s ease;
}
.discover-hero-image:hover {
transform: scale(1.02);
}
.hero-image-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 120px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.discover-hero-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
/* Hero Navigation Arrows - Hidden by default, show on hover */
.discover-hero-nav {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 10;
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #fff;
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.3s ease;
font-size: 28px;
line-height: 1;
padding: 0;
opacity: 0;
pointer-events: none;
}
.discover-hero:hover .discover-hero-nav {
opacity: 1;
pointer-events: auto;
}
.discover-hero-nav:hover {
background: rgba(0, 0, 0, 0.7);
border-color: rgba(255, 255, 255, 0.3);
transform: translateY(-50%) scale(1.1);
}
.discover-hero-nav:active {
transform: translateY(-50%) scale(0.95);
}
.discover-hero-nav-prev {
left: 20px;
}
.discover-hero-nav-next {
right: 20px;
}
/* Hero Slideshow Indicators */
.discover-hero-indicators {
position: absolute;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
z-index: 10;
display: flex;
gap: 10px;
padding: 12px 20px;
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.hero-indicator {
width: 8px;
height: 8px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.4);
border: none;
padding: 0;
cursor: pointer;
transition: all 0.3s ease;
}
.hero-indicator:hover {
background: rgba(255, 255, 255, 0.7);
transform: scale(1.2);
}
.hero-indicator.active {
background: rgb(var(--accent-rgb));
width: 24px;
border-radius: 4px;
}
/* Hero Bottom Action Buttons */
.discover-hero-bottom-actions {
position: absolute;
bottom: 24px;
right: 24px;
z-index: 10;
display: flex;
gap: 8px;
align-items: center;
}
.discover-hero-watch-all,
.discover-hero-view-all {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
background: rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 20px;
color: rgba(255, 255, 255, 0.9);
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s ease, border-color 0.2s ease;
}
.discover-hero-watch-all:hover,
.discover-hero-view-all:hover {
background: rgba(0, 0, 0, 0.5);
border-color: rgba(255, 255, 255, 0.3);
}
.discover-hero-watch-all .watch-all-icon {
font-size: 14px;
}
.discover-hero-watch-all.all-watched {
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.4);
color: rgb(var(--accent-rgb));
cursor: default;
}
.discover-hero-watch-all:disabled:not(.all-watched) {
opacity: 0.6;
cursor: wait;
}
/* Recommended Artists Modal */
.recommended-modal {
max-width: 95vw;
width: 95vw;
max-height: 95vh;
}
.recommended-modal .playlist-modal-body {
overflow-y: auto;
padding: 0;
min-height: 0;
}
.recommended-artists-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
padding: 20px 28px;
}
.recommended-artist-card {
position: relative;
border-radius: 14px;
overflow: hidden;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
cursor: pointer;
transition: transform 0.2s ease, border-color 0.2s ease;
}
.recommended-artist-card:hover {
transform: translateY(-3px);
border-color: rgba(var(--accent-rgb), 0.3);
}
.recommended-card-image {
width: 100%;
aspect-ratio: 1;
overflow: hidden;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.15), rgba(var(--accent-rgb), 0.05));
}
.recommended-card-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
.recommended-card-image-fallback {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
opacity: 0.3;
}
.recommended-card-info {
padding: 12px 14px;
}
.recommended-card-name {
display: block;
font-size: 14px;
font-weight: 700;
color: #fff;
margin-bottom: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.recommended-card-similarity {
display: block;
font-size: 11px;
color: rgba(var(--accent-rgb), 0.8);
margin-bottom: 6px;
}
.recommended-card-genres {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.recommended-card-genre {
padding: 2px 8px;
background: rgba(255, 255, 255, 0.08);
border-radius: 10px;
font-size: 10px;
color: rgba(255, 255, 255, 0.6);
}
.recommended-card-watchlist-btn {
position: absolute;
top: 8px;
right: 8px;
z-index: 3;
padding: 5px 10px;
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.2);
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(8px);
color: rgba(255, 255, 255, 0.9);
font-size: 11px;
font-weight: 600;
cursor: pointer;
opacity: 0;
transition: opacity 0.2s ease, background 0.2s ease;
}
.recommended-artist-card:hover .recommended-card-watchlist-btn {
opacity: 1;
}
.recommended-card-watchlist-btn.watching {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgba(var(--accent-rgb), 0.5);
color: rgb(var(--accent-rgb));
opacity: 1;
}
.recommended-actions-bar {
display: flex;
align-items: center;
gap: 12px;
padding: 16px 28px 0;
margin-bottom: 12px;
}
.recommended-search-container {
flex: 1;
}
.recommended-add-all-btn {
flex-shrink: 0;
padding: 10px 20px;
border-radius: 10px;
border: 1px solid rgba(var(--accent-rgb), 0.3);
background: rgba(var(--accent-rgb), 0.1);
color: rgb(var(--accent-rgb));
font-size: 13px;
font-weight: 600;
cursor: pointer;
white-space: nowrap;
transition: background 0.2s ease, border-color 0.2s ease;
}
.recommended-add-all-btn:hover {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgba(var(--accent-rgb), 0.5);
}
.recommended-add-all-btn:disabled {
opacity: 0.5;
cursor: default;
}
.recommended-add-all-btn.all-added {
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.2);
opacity: 0.7;
cursor: default;
}
.recommended-search-input {
width: 100%;
padding: 10px 16px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
color: #fff;
font-size: 14px;
outline: none;
transition: border-color 0.2s ease;
}
.recommended-search-input:focus {
border-color: rgba(var(--accent-rgb), 0.4);
}
.recommended-search-input::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.recommended-empty-state {
text-align: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.4);
font-size: 15px;
}
.recommended-loading {
text-align: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.5);
font-size: 15px;
}
/* Discover Sections */
.discover-section {
margin-bottom: 50px;
padding: 0 20px;
}
.discover-section-header {
margin-bottom: 24px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
gap: 20px;
}
.discover-section-title {
font-size: 28px;
font-weight: 700;
color: #fff;
margin: 0 0 8px 0;
}
.discover-section-subtitle {
font-size: 14px;
color: #999;
margin: 0;
}
/* Because You Listen To */
.bylt-header {
display: flex;
align-items: center;
gap: 14px;
}
.bylt-artist-img {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
border: 2px solid rgba(var(--accent-rgb), 0.25);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.bylt-section {
border-top: 1px solid rgba(255, 255, 255, 0.04);
padding-top: 16px;
}
.bylt-section .discover-section-subtitle {
font-size: 12px;
color: rgba(var(--accent-rgb), 0.7);
text-transform: uppercase;
letter-spacing: 0.06em;
font-weight: 600;
margin-bottom: 2px;
}
.bylt-section .discover-section-title {
font-size: 22px;
}
.discover-section-actions {
display: flex;
gap: 10px;
flex-shrink: 0;
}
.discover-section-actions .action-button {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
border-radius: 6px;
border: none;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.discover-section-actions .action-button .button-icon {
font-size: 16px;
}
.discover-section-actions .action-button.primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
}
.discover-section-actions .action-button.primary:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
}
.discover-section-actions .action-button.secondary {
background: rgba(255, 255, 255, 0.05);
color: #fff;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.discover-section-actions .action-button.secondary:hover {
background: rgba(255, 255, 255, 0.1);
transform: translateY(-2px);
}
/* Sync Status Display */
.discover-sync-status {
margin: 16px 20px 20px 20px;
padding: 16px 20px;
background: rgba(102, 126, 234, 0.1);
border: 1px solid rgba(102, 126, 234, 0.3);
border-radius: 8px;
animation: slideDown 0.3s ease;
}
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.sync-status-content {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
}
.sync-status-label {
display: flex;
align-items: center;
gap: 8px;
color: #fff;
font-size: 14px;
font-weight: 500;
}
.sync-icon {
display: inline-block;
font-size: 18px;
animation: spin 1s linear infinite;
transform-origin: center center;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.sync-status-stats {
display: flex;
align-items: center;
gap: 8px;
font-size: 14px;
color: #fff;
font-family: 'Courier New', monospace;
}
.sync-stat {
font-weight: 600;
}
.sync-separator {
color: rgba(255, 255, 255, 0.3);
font-weight: 300;
}
/* Carousel Styles */
.discover-carousel {
display: flex;
gap: 20px;
overflow-x: auto;
padding-bottom: 20px;
scroll-behavior: smooth;
}
.discover-carousel::-webkit-scrollbar {
height: 8px;
}
.discover-carousel::-webkit-scrollbar-track {
background: #2a2a2a;
border-radius: 4px;
}
.discover-carousel::-webkit-scrollbar-thumb {
background: #555;
border-radius: 4px;
}
.discover-carousel::-webkit-scrollbar-thumb:hover {
background: #666;
}
/* Playlist Grid */
.discover-playlists-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
}
/* Loading State */
.discover-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
color: #999;
}
.discover-loading .loading-spinner {
width: 40px;
height: 40px;
border: 4px solid #333;
border-top-color: rgb(var(--accent-rgb));
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 16px;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.discover-loading p {
margin: 0;
font-size: 14px;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.discover-hero {
height: auto;
min-height: 400px;
}
.discover-hero-content {
flex-direction: column;
padding: 40px 20px;
text-align: center;
}
.discover-hero-title {
font-size: 36px;
}
.discover-hero-image {
width: 240px;
height: 240px;
}
.discover-hero-actions {
justify-content: center;
}
.discover-section {
padding: 0 16px;
}
}
/* Discover Cards */
.discover-card {
flex-shrink: 0;
width: 200px;
background: #1a1a1a;
border-radius: 8px;
overflow: hidden;
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.discover-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
}
.discover-card-image {
width: 100%;
height: 200px;
overflow: hidden;
position: relative;
}
.discover-card-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
.discover-card-info {
padding: 12px;
}
.discover-card-title {
font-size: 14px;
font-weight: 600;
color: #fff;
margin: 0 0 4px 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.discover-card-subtitle {
font-size: 12px;
color: #999;
margin: 0 0 4px 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.discover-card-meta {
font-size: 11px;
color: #666;
margin: 0;
}
/* Genre Explorer Grid */
.genre-explorer-grid {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 4px 0;
}
.genre-explorer-pill {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 14px;
border-radius: 20px;
font-size: 13px;
font-weight: 500;
cursor: default;
transition: all 0.2s;
}
.genre-explorer-pill.explored {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.6);
}
.genre-explorer-pill.unexplored {
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-light-rgb));
}
.genre-explorer-pill:hover {
transform: translateY(-1px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.genre-pill-count {
font-size: 11px;
opacity: 0.5;
font-variant-numeric: tabular-nums;
}
.genre-pill-badge {
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
background: rgba(var(--accent-rgb), 0.25);
color: rgb(var(--accent-light-rgb));
padding: 2px 6px;
border-radius: 8px;
}
/* Genre Deep Dive Modal */
.genre-dive-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(8px);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
animation: fadeIn 0.2s ease;
}
.genre-dive-modal {
background: linear-gradient(135deg, rgba(24, 24, 28, 0.98) 0%, rgba(16, 16, 20, 0.99) 100%);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 20px;
width: 90vw;
max-width: 800px;
max-height: 85vh;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.genre-dive-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24px 28px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
position: relative;
overflow: hidden;
background: linear-gradient(180deg,
rgba(var(--accent-rgb), 0.08) 0%,
rgba(var(--accent-rgb), 0.02) 60%,
transparent 100%);
}
.genre-dive-header::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 50%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.03), transparent);
animation: stats-header-sweep 10s ease-in-out infinite;
}
.genre-dive-subtitle {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: rgba(var(--accent-rgb), 0.7);
font-weight: 600;
margin-bottom: 4px;
position: relative;
z-index: 1;
}
.genre-dive-title {
font-size: 24px;
font-weight: 700;
color: #fff;
margin: 0;
text-transform: capitalize;
position: relative;
z-index: 1;
}
.genre-dive-close {
background: none;
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.5);
width: 36px;
height: 36px;
border-radius: 50%;
font-size: 20px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
flex-shrink: 0;
position: relative;
z-index: 1;
}
.genre-dive-close:hover {
background: rgba(255, 255, 255, 0.08);
color: #fff;
transform: scale(1.1);
}
.genre-dive-body {
flex: 1;
overflow-y: auto;
padding: 24px 28px;
}
.genre-dive-loading {
text-align: center;
color: rgba(255, 255, 255, 0.4);
padding: 60px 40px;
font-size: 14px;
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
}
.genre-dive-spinner {
width: 32px;
height: 32px;
border: 3px solid rgba(255, 255, 255, 0.08);
border-top-color: rgb(var(--accent-rgb));
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.genre-dive-section {
margin-bottom: 28px;
}
.genre-dive-section:last-child {
margin-bottom: 0;
}
.genre-dive-section-title {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
margin: 0 0 14px 0;
display: flex;
align-items: center;
gap: 8px;
}
.genre-dive-icon {
font-size: 16px;
}
/* Artists */
.genre-dive-artists {
display: flex;
gap: 14px;
overflow-x: auto;
padding-bottom: 8px;
scroll-behavior: smooth;
}
.genre-dive-artists::-webkit-scrollbar { height: 4px; }
.genre-dive-artists::-webkit-scrollbar-track { background: transparent; }
.genre-dive-artists::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 2px; }
.genre-dive-artist {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
min-width: 88px;
max-width: 88px;
cursor: pointer;
padding: 8px 4px;
border-radius: 12px;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.genre-dive-artist:first-child {
min-width: 100px;
max-width: 100px;
}
.genre-dive-artist:nth-child(2),
.genre-dive-artist:nth-child(3) {
min-width: 94px;
max-width: 94px;
}
.genre-dive-artist:hover {
background: rgba(255, 255, 255, 0.04);
transform: translateY(-3px);
}
.genre-dive-artist-img {
width: 64px;
height: 64px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.06);
background-size: cover;
background-position: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
border: 2px solid rgba(255, 255, 255, 0.06);
transition: all 0.25s;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.genre-dive-artist:first-child .genre-dive-artist-img {
width: 80px;
height: 80px;
border-width: 3px;
border-color: rgba(var(--accent-rgb), 0.25);
box-shadow: 0 6px 20px rgba(var(--accent-rgb), 0.1);
}
.genre-dive-artist:nth-child(2) .genre-dive-artist-img,
.genre-dive-artist:nth-child(3) .genre-dive-artist-img {
width: 72px;
height: 72px;
}
.genre-dive-artist:hover .genre-dive-artist-img {
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.15);
transform: scale(1.08);
}
.genre-dive-artist-name {
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.8);
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
transition: color 0.2s;
}
.genre-dive-artist:hover .genre-dive-artist-name {
color: #fff;
}
.genre-dive-artist-meta {
font-size: 9px;
color: rgba(255, 255, 255, 0.3);
}
.genre-dive-artist-badge {
font-size: 8px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
padding: 2px 6px;
border-radius: 6px;
}
/* Source indicator dots */
.genre-dive-src-dot {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.2);
}
.genre-dive-src-spotify { background: #1db954; }
.genre-dive-src-itunes { background: #fc3c44; }
.genre-dive-src-deezer { background: #a238ff; }
.genre-dive-artist .genre-dive-src-dot {
position: absolute;
top: 4px;
right: 4px;
width: 8px;
height: 8px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
}
.genre-dive-artist {
position: relative;
}
/* Tracks */
.genre-dive-tracks {
display: flex;
flex-direction: column;
gap: 2px;
border-radius: 12px;
overflow: hidden;
}
.genre-dive-track {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 14px;
background: rgba(255, 255, 255, 0.02);
cursor: pointer;
transition: all 0.2s;
border-left: 2px solid transparent;
}
.genre-dive-track:nth-child(odd) {
background: rgba(255, 255, 255, 0.025);
}
.genre-dive-track:hover {
background: rgba(var(--accent-rgb), 0.06);
border-left-color: rgba(var(--accent-rgb), 0.5);
}
.genre-dive-track:hover .genre-dive-track-num {
color: rgb(var(--accent-rgb));
}
.genre-dive-track:active {
background: rgba(var(--accent-rgb), 0.1);
}
.genre-dive-track-num {
font-size: 12px;
color: rgba(255, 255, 255, 0.25);
min-width: 20px;
text-align: center;
font-variant-numeric: tabular-nums;
}
.genre-dive-track-img {
width: 40px;
height: 40px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.06);
background-size: cover;
background-position: center;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
}
.genre-dive-track-info {
flex: 1;
min-width: 0;
}
.genre-dive-track-name {
font-size: 13px;
font-weight: 500;
color: rgba(255, 255, 255, 0.85);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.genre-dive-track:hover .genre-dive-track-name {
color: #fff;
}
.genre-dive-track-artist {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.genre-dive-track-duration {
font-size: 12px;
color: rgba(255, 255, 255, 0.25);
font-variant-numeric: tabular-nums;
flex-shrink: 0;
}
/* Empty state */
.genre-dive-empty {
text-align: center;
padding: 50px 20px;
color: rgba(255, 255, 255, 0.4);
}
.genre-dive-empty-icon {
font-size: 36px;
margin-bottom: 12px;
}
.genre-dive-empty p {
margin: 4px 0;
font-size: 14px;
}
.genre-dive-empty-hint {
font-size: 12px !important;
color: rgba(255, 255, 255, 0.25) !important;
}
/* Related genres */
.genre-dive-related {
display: flex;
flex-wrap: wrap;
gap: 6px;
align-items: center;
margin-bottom: 24px;
padding-bottom: 20px;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.genre-dive-related-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
text-transform: uppercase;
letter-spacing: 0.06em;
font-weight: 600;
margin-right: 4px;
width: 100%;
margin-bottom: 2px;
}
.genre-dive-related-pill {
padding: 5px 12px;
border-radius: 14px;
font-size: 12px;
font-weight: 500;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.55);
cursor: pointer;
transition: all 0.2s;
}
.genre-dive-related-pill:hover {
background: rgba(var(--accent-rgb), 0.12);
border-color: rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-light-rgb));
transform: translateY(-1px);
}
/* Album card hover inside genre dive modal */
.genre-dive-modal .discover-card {
transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.25s ease,
border-color 0.25s ease;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
}
.genre-dive-modal .discover-card:hover {
transform: translateY(-4px) scale(1.02);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
border-color: rgba(var(--accent-rgb), 0.25);
}
.genre-dive-modal .discover-card:hover .discover-card-title {
color: #fff;
}
/* In Library badge on discover cards */
.discover-card-lib-badge {
position: absolute;
top: 6px;
left: 6px;
font-size: 8px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
background: rgba(var(--accent-rgb), 0.85);
color: #fff;
padding: 3px 7px;
border-radius: 6px;
backdrop-filter: blur(4px);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* Discover Empty State */
/* ── Spotify Library Section ────────────────────────── */
.spotify-library-header-actions {
display: flex;
gap: 10px;
align-items: center;
margin-left: auto;
flex-shrink: 0;
}
.spotify-library-action-btn {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
border: none;
transition: all 0.2s ease;
}
.spotify-library-refresh-btn {
background: rgba(255, 255, 255, 0.08);
color: #b3b3b3;
}
.spotify-library-refresh-btn:hover {
background: rgba(255, 255, 255, 0.14);
color: #fff;
}
.spotify-library-download-btn {
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
}
.spotify-library-download-btn:hover {
background: rgba(var(--accent-rgb), 0.25);
}
.spotify-library-filters {
display: flex;
gap: 12px;
margin-bottom: 20px;
flex-wrap: wrap;
align-items: center;
}
.spotify-library-search {
flex: 1;
min-width: 200px;
padding: 10px 16px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
color: #fff;
font-size: 14px;
outline: none;
transition: border-color 0.2s ease;
}
.spotify-library-search:focus {
border-color: rgba(var(--accent-rgb), 0.5);
}
.spotify-library-search::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.spotify-library-select {
padding: 10px 14px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
color: #fff;
font-size: 13px;
cursor: pointer;
outline: none;
appearance: none;
-webkit-appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 10px center;
padding-right: 30px;
}
.spotify-library-select option {
background: #1a1a1a;
color: #fff;
}
.spotify-library-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(175px, 1fr));
gap: 16px;
}
.spotify-library-card {
background: rgba(255, 255, 255, 0.04);
border-radius: 10px;
overflow: hidden;
cursor: pointer;
transition: all 0.25s ease;
position: relative;
}
.spotify-library-card:hover {
background: rgba(255, 255, 255, 0.08);
transform: translateY(-3px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
.spotify-library-card-img {
width: 100%;
aspect-ratio: 1;
overflow: hidden;
position: relative;
}
.spotify-library-card-img img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.spotify-library-card-badge {
position: absolute;
top: 8px;
right: 8px;
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
}
.spotify-library-card-badge.owned {
background: rgba(29, 185, 84, 0.85);
color: #fff;
}
.spotify-library-card-badge.missing {
background: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.7);
}
.spotify-library-card-info {
padding: 12px;
}
.spotify-library-card-title {
font-size: 13px;
font-weight: 600;
color: #fff;
margin: 0 0 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.spotify-library-card-artist {
font-size: 12px;
color: #b3b3b3;
margin: 0 0 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.spotify-library-card-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
margin: 0;
}
.spotify-library-pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 12px;
margin-top: 24px;
padding: 12px 0;
}
.spotify-library-page-btn {
padding: 8px 18px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #b3b3b3;
font-size: 13px;
cursor: pointer;
transition: all 0.2s ease;
}
.spotify-library-page-btn:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.spotify-library-page-btn:disabled {
opacity: 0.3;
cursor: default;
}
.spotify-library-page-info {
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
}
.spotify-library-empty {
text-align: center;
padding: 60px 20px;
color: #666;
}
.spotify-library-empty p {
margin: 8px 0;
font-size: 14px;
}
@media (max-width: 768px) {
.spotify-library-grid {
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 12px;
}
.spotify-library-header-actions {
flex-wrap: wrap;
}
.spotify-library-filters {
flex-direction: column;
}
.spotify-library-search {
min-width: unset;
width: 100%;
}
}
.discover-empty {
text-align: center;
padding: 60px 20px;
color: #999;
}
/* Discover Playlist Tracks */
.discover-playlist-tracks {
background: #1a1a1a;
border-radius: 8px;
overflow: hidden;
}
.discover-playlist-track {
display: grid;
grid-template-columns: 40px 50px 1fr 2fr 80px;
gap: 16px;
align-items: center;
padding: 12px 16px;
border-bottom: 1px solid #2a2a2a;
cursor: pointer;
transition: background-color 0.2s ease;
}
.discover-playlist-track:hover {
background-color: #2a2a2a;
}
.playlist-track-number {
font-size: 14px;
color: #999;
text-align: center;
}
.playlist-track-image {
width: 50px;
height: 50px;
border-radius: 4px;
overflow: hidden;
}
.playlist-track-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
.playlist-track-info {
min-width: 0;
}
.playlist-track-name {
font-size: 14px;
font-weight: 500;
color: #fff;
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.playlist-track-artist {
font-size: 12px;
color: #999;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.playlist-track-album {
font-size: 12px;
color: #999;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.playlist-track-duration {
font-size: 12px;
color: #999;
text-align: right;
}
/* Compact Playlist Layout */
.discover-playlist-container.compact {
max-height: 500px;
overflow-y: auto;
background: #1a1a1a;
border-radius: 8px;
}
.discover-playlist-tracks-compact {
background: #1a1a1a;
border-radius: 8px;
overflow: hidden;
}
.discover-playlist-track-compact {
display: grid;
grid-template-columns: 30px 40px 1fr 1.5fr 60px;
gap: 12px;
align-items: center;
padding: 8px 12px;
border-bottom: 1px solid #2a2a2a;
cursor: pointer;
transition: background-color 0.2s ease;
}
.discover-playlist-track-compact:hover {
background-color: #2a2a2a;
}
.track-compact-number {
font-size: 13px;
color: #999;
text-align: center;
}
.track-compact-image {
width: 40px;
height: 40px;
border-radius: 4px;
overflow: hidden;
}
.track-compact-image img {
width: 100%;
height: 100%;
object-fit: cover;
}
.track-compact-info {
min-width: 0;
}
.track-compact-name {
font-size: 13px;
font-weight: 500;
color: #fff;
margin-bottom: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.track-compact-artist {
font-size: 11px;
color: #999;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.track-compact-album {
font-size: 11px;
color: #999;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.track-compact-duration {
font-size: 11px;
color: #999;
text-align: right;
}
.track-compact-block {
display: none;
width: 22px;
height: 22px;
border: none;
border-radius: 50%;
background: rgba(255, 80, 80, 0.12);
color: rgba(255, 80, 80, 0.6);
font-size: 10px;
cursor: pointer;
flex-shrink: 0;
transition: all 0.15s;
}
.track-compact-block:hover {
background: rgba(255, 80, 80, 0.25);
color: #ff5050;
}
.discover-playlist-track-compact:hover .track-compact-block {
display: flex;
align-items: center;
justify-content: center;
}
/* Discovery Blacklist Button (on hero) */
.discover-blacklist-btn {
position: absolute;
top: 20px;
right: 58px;
z-index: 10;
width: 32px;
height: 32px;
border: none;
border-radius: 50%;
background: rgba(0,0,0,0.4);
color: rgba(255,255,255,0.6);
font-size: 14px;
cursor: pointer;
backdrop-filter: blur(8px);
transition: all 0.15s;
}
.discover-blacklist-btn:hover {
background: rgba(255, 80, 80, 0.3);
color: #fff;
}
/* Discovery Blacklist Modal */
.discover-blacklist-modal {
background: #1a1a1a;
border-radius: 16px;
width: 500px;
max-width: 95vw;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 24px 80px rgba(0,0,0,0.6);
}
.discover-blacklist-modal-header {
padding: 20px 24px 12px;
position: relative;
}
.discover-blacklist-modal-header h2 {
margin: 0 0 4px;
font-size: 18px;
color: #fff;
}
.discover-blacklist-modal-header p {
margin: 0;
font-size: 12px;
color: rgba(255,255,255,0.4);
}
.discover-blacklist-modal-search {
padding: 0 24px 12px;
position: relative;
}
.discover-blacklist-modal-search input {
width: 100%;
padding: 10px 14px;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px;
color: #fff;
font-size: 13px;
outline: none;
box-sizing: border-box;
}
.discover-blacklist-modal-search input:focus {
border-color: rgba(255,255,255,0.15);
}
.dbl-search-results {
position: absolute;
left: 24px;
right: 24px;
background: #222;
border-radius: 10px;
border: 1px solid rgba(255,255,255,0.08);
max-height: 240px;
overflow-y: auto;
z-index: 10;
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
}
.dbl-search-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
cursor: pointer;
transition: background 0.1s;
}
.dbl-search-item:hover {
background: rgba(255,255,255,0.06);
}
.dbl-search-img {
width: 32px;
height: 32px;
border-radius: 50%;
object-fit: cover;
}
.dbl-search-img-placeholder {
width: 32px;
height: 32px;
border-radius: 50%;
background: rgba(255,255,255,0.06);
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
}
.dbl-search-name {
flex: 1;
font-size: 13px;
color: rgba(255,255,255,0.85);
}
.dbl-search-action {
font-size: 11px;
color: rgba(255, 80, 80, 0.7);
font-weight: 600;
}
.dbl-search-empty {
padding: 12px;
text-align: center;
color: rgba(255,255,255,0.3);
font-size: 12px;
}
.discover-blacklist-modal-list {
flex: 1;
overflow-y: auto;
padding: 0 24px;
max-height: 300px;
}
.discover-blacklist-modal-footer {
padding: 12px 24px;
display: flex;
justify-content: flex-end;
}
/* Discovery Artist Blacklist Items */
.discover-blacklist-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
border-bottom: 1px solid rgba(255,255,255,0.04);
}
.discover-blacklist-item:last-child { border-bottom: none; }
.discover-blacklist-name {
flex: 1;
font-size: 13px;
color: rgba(255,255,255,0.8);
}
.discover-blacklist-date {
font-size: 11px;
color: rgba(255,255,255,0.25);
}
.discover-blacklist-remove {
width: 22px;
height: 22px;
border: none;
border-radius: 50%;
background: rgba(255,255,255,0.06);
color: rgba(255,255,255,0.3);
font-size: 10px;
cursor: pointer;
transition: all 0.15s;
}
.discover-blacklist-remove:hover {
background: rgba(255, 80, 80, 0.2);
color: #ff5050;
}
.discover-blacklist-empty {
padding: 20px;
text-align: center;
color: rgba(255,255,255,0.25);
font-size: 13px;
}
/* Discover Playlist Cards */
.discover-playlist-card {
background: #1a1a1a;
border-radius: 8px;
overflow: hidden;
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.discover-playlist-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
}
.discover-playlist-cover {
position: relative;
width: 100%;
padding-bottom: 100%;
overflow: hidden;
}
.discover-playlist-cover img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.playlist-play-overlay {
position: absolute;
bottom: 12px;
right: 12px;
width: 48px;
height: 48px;
background-color: rgb(var(--accent-rgb));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
color: #fff;
opacity: 0;
transform: translateY(8px);
transition: all 0.2s ease;
}
.discover-playlist-card:hover .playlist-play-overlay {
opacity: 1;
transform: translateY(0);
}
.discover-playlist-info {
padding: 16px;
}
.discover-playlist-name {
font-size: 16px;
font-weight: 600;
color: #fff;
margin: 0 0 8px 0;
}
.discover-playlist-description {
font-size: 13px;
color: #999;
margin: 0 0 8px 0;
line-height: 1.4;
}
.discover-playlist-count {
font-size: 12px;
color: #666;
margin: 0;
}
/* ===============================
DISCOVER DOWNLOAD BAR
=============================== */
/* Fixed bottom download bar */
/* ===============================
DISCOVER DOWNLOAD SIDEBAR
Right sidebar for active downloads
=============================== */
.discover-download-sidebar {
position: fixed;
top: 0;
right: 0;
width: 140px;
height: 100vh;
background: linear-gradient(270deg,
rgba(18, 18, 18, 0.98) 0%,
rgba(12, 12, 12, 0.99) 100%);
border-left: 1px solid rgba(255, 255, 255, 0.08);
padding: 20px 12px;
z-index: 9999;
transform: translateX(0);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
opacity 0.3s ease;
box-shadow: -4px 0 20px rgba(0, 0, 0, 0.4);
backdrop-filter: blur(20px);
opacity: 1;
display: flex;
flex-direction: column;
gap: 16px;
overflow-y: auto;
overflow-x: hidden;
}
/* Hidden state */
.discover-download-sidebar.hidden {
transform: translateX(100%);
opacity: 0;
pointer-events: none;
}
/* Sidebar header */
.discover-download-sidebar-header {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding-bottom: 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.discover-download-sidebar-icon {
font-size: 20px;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.1);
}
}
.discover-download-sidebar-title {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
text-align: center;
}
.discover-download-sidebar-count {
background: linear-gradient(135deg, rgb(var(--accent-rgb)) 0%, rgb(var(--accent-light-rgb)) 100%);
color: white;
font-size: 11px;
font-weight: 700;
padding: 2px 8px;
border-radius: 12px;
min-width: 20px;
text-align: center;
}
/* Download bubbles container */
.discover-download-bubbles {
display: flex;
flex-direction: column;
gap: 20px;
align-items: center;
}
/* Individual download bubble - 100x100px circular */
.discover-download-bubble {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
width: 100%;
}
.discover-download-bubble-card {
position: relative;
width: 100px;
height: 100px;
border-radius: 50%;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
flex-shrink: 0;
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border: 2px solid rgba(var(--accent-rgb), 0.3);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
overflow: hidden;
}
.discover-download-bubble-card:hover {
transform: scale(1.08);
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.2),
0 0 15px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.discover-download-bubble-card.completed {
border-color: rgba(var(--accent-rgb), 0.4);
}
.discover-download-bubble-card.completed:hover {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.3),
0 0 15px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
/* Bubble card background image */
.discover-download-bubble-image {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 50%;
}
/* Bubble card overlay */
.discover-download-bubble-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.2) 0%,
rgba(0, 0, 0, 0.5) 100%);
border-radius: 50%;
}
/* Bubble card content (icon/status) */
.discover-download-bubble-content {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
z-index: 2;
padding: 8px;
}
.discover-download-bubble-icon {
font-size: 28px;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8));
}
/* Bubble name (below the card) */
.discover-download-bubble-name {
font-size: 10px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
text-align: center;
line-height: 1.2;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
}
/* Bubble status text (optional, below name) */
.discover-download-bubble-status {
font-size: 8px;
color: rgba(255, 255, 255, 0.7);
text-align: center;
margin-top: 2px;
}
/* Scrollbar styling */
.discover-download-sidebar::-webkit-scrollbar {
width: 4px;
}
.discover-download-sidebar::-webkit-scrollbar-track {
background: transparent;
}
.discover-download-sidebar::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 2px;
}
.discover-download-sidebar::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
/* ===============================
BUILD A PLAYLIST STYLES
=============================== */
/* ---- Build a Playlist ---- */
.bp-info-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border-radius: 50%;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
font-size: 12px;
font-weight: 700;
cursor: pointer;
margin-left: 8px;
vertical-align: middle;
transition: background 0.2s;
line-height: 1;
}
.bp-info-toggle:hover {
background: rgba(var(--accent-rgb), 0.3);
}
.bp-info-panel {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease, padding 0.3s ease;
background: rgba(var(--accent-rgb), 0.06);
border-radius: 10px;
margin-bottom: 0;
}
.bp-info-panel.visible {
max-height: 260px;
padding: 16px 20px;
margin-bottom: 16px;
border: 1px solid rgba(var(--accent-rgb), 0.15);
}
.bp-info-content p {
color: #ccc;
font-size: 13px;
margin: 0 0 8px 0;
}
.bp-info-content p strong {
color: #fff;
}
.bp-info-content ol {
margin: 0 0 8px 0;
padding-left: 20px;
color: #bbb;
font-size: 13px;
line-height: 1.7;
}
.bp-info-note {
color: #888 !important;
font-size: 12px !important;
font-style: italic;
margin-bottom: 0 !important;
}
.build-playlist-container {
background: #1a1a1a;
border-radius: 12px;
padding: 24px;
margin-top: 16px;
}
/* -- Search Input -- */
.build-playlist-search-section {
position: relative;
margin-bottom: 20px;
}
.bp-search-input-wrapper {
position: relative;
display: flex;
align-items: center;
}
.bp-search-icon {
position: absolute;
left: 14px;
width: 16px;
height: 16px;
color: #666;
pointer-events: none;
}
.bp-search-spinner {
position: absolute;
right: 14px;
display: flex;
align-items: center;
}
#build-playlist-search {
width: 100%;
padding: 12px 42px 12px 40px;
background: #2a2a2a;
border: 1px solid #3a3a3a;
border-radius: 10px;
color: #fff;
font-size: 14px;
outline: none;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
#build-playlist-search::placeholder {
color: #666;
}
#build-playlist-search:focus {
border-color: rgb(var(--accent-rgb));
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.1);
}
/* -- Search Results Dropdown -- */
.build-playlist-search-results {
position: absolute;
top: calc(100% + 4px);
left: 0;
right: 0;
background: #222;
border: 1px solid #3a3a3a;
border-radius: 10px;
max-height: 320px;
overflow-y: auto;
z-index: 1000;
display: none;
box-shadow: 0 8px 24px rgba(0,0,0,0.4);
}
.build-playlist-search-result {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 14px;
cursor: pointer;
transition: background-color 0.15s ease;
border-bottom: 1px solid #2a2a2a;
}
.build-playlist-search-result:last-child {
border-bottom: none;
}
.build-playlist-search-result:hover {
background-color: rgba(var(--accent-rgb), 0.08);
}
.build-playlist-search-result:hover .bp-result-add {
opacity: 1;
}
.build-playlist-search-result img {
width: 40px;
height: 40px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
background: #333;
}
.bp-result-name {
color: #fff;
font-size: 14px;
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.bp-result-add {
color: rgb(var(--accent-rgb));
font-size: 12px;
font-weight: 600;
opacity: 0;
transition: opacity 0.15s;
flex-shrink: 0;
}
.build-playlist-no-results {
padding: 20px 16px;
text-align: center;
color: #777;
font-size: 13px;
}
/* -- Selected Artists -- */
.build-playlist-selected-section {
margin-bottom: 20px;
}
.bp-selected-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.bp-selected-header h3 {
color: #fff;
font-size: 14px;
font-weight: 600;
margin: 0;
}
.bp-selected-counter {
color: #666;
font-size: 12px;
font-weight: 500;
}
.build-playlist-selected-artists {
display: flex;
flex-wrap: wrap;
gap: 10px;
min-height: 56px;
padding: 12px;
background: #151515;
border: 1px dashed #333;
border-radius: 10px;
transition: border-color 0.2s;
}
.build-playlist-selected-artists:has(.build-playlist-selected-artist) {
border-style: solid;
border-color: #3a3a3a;
}
.build-playlist-selected-artist {
display: flex;
align-items: center;
gap: 8px;
background: #2a2a2a;
border: 1px solid #3a3a3a;
border-radius: 20px;
padding: 6px 10px 6px 6px;
transition: border-color 0.2s;
}
.build-playlist-selected-artist:hover {
border-color: #555;
}
.build-playlist-selected-artist img {
width: 28px;
height: 28px;
border-radius: 50%;
object-fit: cover;
flex-shrink: 0;
background: #333;
}
.build-playlist-selected-artist span {
color: #fff;
font-size: 13px;
font-weight: 500;
}
.build-playlist-remove-artist {
background: none;
border: none;
color: #777;
font-size: 16px;
cursor: pointer;
padding: 0;
margin-left: 2px;
width: 18px;
height: 18px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.15s ease;
line-height: 1;
}
.build-playlist-remove-artist:hover {
color: #ff5555;
background: rgba(255,85,85,0.1);
}
.build-playlist-no-selection {
color: #555;
font-size: 13px;
padding: 8px;
text-align: center;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
/* -- Generate Button & Loading -- */
.build-playlist-actions {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 20px;
}
.build-playlist-generate-btn {
display: inline-flex;
align-items: center;
gap: 8px;
background: rgb(var(--accent-rgb));
color: #fff;
border: none;
border-radius: 10px;
padding: 12px 24px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.build-playlist-generate-btn:not(:disabled):hover {
filter: brightness(1.15);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(var(--accent-rgb), 0.3);
}
.build-playlist-generate-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.build-playlist-loading {
display: flex;
align-items: center;
gap: 12px;
}
.build-playlist-loading span {
color: #999;
font-size: 13px;
}
/* -- Metadata Stats -- */
.build-playlist-metadata {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin-bottom: 16px;
}
.bp-meta-stat {
background: #222;
border-radius: 10px;
padding: 14px 16px;
text-align: center;
border: 1px solid #2a2a2a;
}
.bp-meta-value {
display: block;
color: rgb(var(--accent-rgb));
font-size: 22px;
font-weight: 700;
line-height: 1.2;
}
.bp-meta-label {
display: block;
color: #888;
font-size: 11px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 4px;
}
/* =======================
DECADE BROWSER SECTION - Modern Style matching Recent Releases
======================= */
.decade-card-modern {
/* Inherits from .discover-card */
}
.decade-card-image {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.decade-card-image::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg,
rgba(102, 126, 234, 0.1) 0%,
rgba(118, 75, 162, 0.1) 100%);
opacity: 1;
transition: opacity 0.3s ease;
}
.decade-card-modern:hover .decade-card-image::before {
opacity: 0.3;
}
.decade-icon-large {
font-size: 96px;
line-height: 1;
position: relative;
z-index: 1;
transition: transform 0.3s ease;
}
.decade-card-modern:hover .decade-icon-large {
transform: scale(1.1) rotate(5deg);
}
/* =======================
Genre Browser Cards
======================= */
.genre-card-modern {
/* Inherits from .discover-card */
}
.genre-card-image {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.genre-card-image::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg,
rgba(102, 126, 234, 0.1) 0%,
rgba(118, 75, 162, 0.1) 100%);
opacity: 1;
transition: opacity 0.3s ease;
}
.genre-card-modern:hover .genre-card-image::before {
opacity: 0.3;
}
.genre-icon-large {
font-size: 96px;
line-height: 1;
position: relative;
z-index: 1;
transition: transform 0.3s ease;
}
.genre-card-modern:hover .genre-icon-large {
transform: scale(1.1) rotate(5deg);
}
/* ===============================
TIME MACHINE (DECADE TABS)
=============================== */
.decade-tabs,
.genre-tabs {
display: flex;
gap: 8px;
margin-bottom: 20px;
border-bottom: 2px solid rgba(255, 255, 255, 0.1);
padding-bottom: 0;
flex-wrap: wrap;
}
.decade-tab,
.genre-tab {
background: transparent;
border: none;
color: #999;
padding: 12px 20px;
font-size: 15px;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
border-bottom: 3px solid transparent;
position: relative;
bottom: -2px;
white-space: nowrap;
}
.decade-tab:hover,
.genre-tab:hover {
color: #fff;
background: rgba(255, 255, 255, 0.05);
}
.decade-tab.active,
.genre-tab.active {
color: #fff;
border-bottom-color: #667eea;
}
.decade-tab-content,
.genre-tab-content {
display: none;
}
.decade-tab-content.active,
.genre-tab-content.active {
display: block;
}
.decade-actions,
.genre-actions {
margin-bottom: 20px;
}
/* Responsive adjustments for Decade/Genre tabs */
@media (max-width: 768px) {
.decade-tabs,
.genre-tabs {
gap: 4px;
}
.decade-tab,
.genre-tab {
padding: 10px 14px;
font-size: 13px;
}
}
/* ===============================
LISTENBRAINZ PLAYLIST CARDS
=============================== */
.listenbrainz-tabs {
margin-top: 20px;
margin-bottom: 20px;
}
.listenbrainz-tab-content .discover-section-subsection {
margin-bottom: 40px;
}
.listenbrainz-tab-content .discover-section-subsection:not(:first-child) {
margin-top: 60px;
}
.listenbrainz-playlist-card {
background: linear-gradient(135deg, #eb743b 0%, #d26230 100%);
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.listenbrainz-playlist-card::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255, 255, 255, 0.1) 0%, transparent 70%);
animation: pulse 3s ease-in-out infinite;
}
.listenbrainz-icon {
font-size: 48px;
position: relative;
z-index: 1;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));
}
@keyframes pulse {
0%,
100% {
opacity: 0.5;
}
50% {
opacity: 0.8;
}
}
/* ========================================= */
/* SEARCH MODE TOGGLE SYSTEM */
/* ========================================= */
/* Toggle Container */
.search-mode-toggle-container {
display: flex;
justify-content: center;
margin: 20px 0;
}
.search-mode-toggle {
position: relative;
background: rgba(30, 30, 30, 0.8);
border-radius: 12px;
padding: 4px;
display: inline-flex;
gap: 4px;
border: 1px solid rgba(64, 64, 64, 0.4);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.search-mode-btn {
position: relative;
z-index: 2;
background: transparent;
border: none;
padding: 10px 24px;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 8px;
font-family: 'Segoe UI', sans-serif;
font-size: 14px;
font-weight: 500;
color: rgba(255, 255, 255, 0.6);
}
.search-mode-btn:hover {
color: rgba(255, 255, 255, 0.9);
}
.search-mode-btn.active {
color: #ffffff;
}
.mode-icon {
font-size: 16px;
transition: transform 0.3s ease;
}
.search-mode-btn.active .mode-icon {
transform: scale(1.1);
}
.search-mode-toggle .toggle-slider {
position: absolute;
top: 4px;
left: 4px;
width: calc(50% - 4px);
height: calc(100% - 8px);
background: linear-gradient(135deg, rgba(138, 43, 226, 0.9), rgba(123, 31, 162, 0.9));
border-radius: 8px;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 1;
box-shadow: 0 2px 8px rgba(138, 43, 226, 0.4);
}
.search-mode-toggle[data-active="basic"] .toggle-slider {
transform: translateX(100%);
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.9), rgba(24, 156, 71, 0.9));
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.4);
}
/* Search Section Visibility */
.search-section {
display: none;
}
.search-section.active {
display: flex;
flex-direction: column;
flex-grow: 1;
min-height: 0;
}
/* ========================================= */
/* ENHANCED SEARCH STYLING */
/* ========================================= */
/* Enhanced Search Input Wrapper (relative for dropdown positioning) */
/* Hide header/toggle when enhanced results are showing */
.enh-results-active-hide {
display: none !important;
}
.enhanced-search-input-wrapper {
position: relative;
margin-bottom: 0;
}
/* Enhanced Search Bar — clean, minimal */
.enhanced-search-bar-container {
background: rgba(255, 255, 255, 0.04);
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.08);
padding: 8px 8px 8px 0;
display: flex;
gap: 8px;
align-items: center;
transition: all 0.3s ease;
}
.enhanced-search-bar-container:focus-within {
border-color: rgba(255, 255, 255, 0.15);
background: rgba(255, 255, 255, 0.06);
}
.enhanced-search-wrapper {
flex-grow: 1;
position: relative;
display: flex;
align-items: center;
background: transparent;
border-radius: 12px;
border: none;
padding: 0 16px;
transition: all 0.3s ease;
}
.enhanced-search-wrapper:focus-within {
border-color: transparent;
box-shadow: none;
}
.enhanced-search-icon {
font-size: 18px;
margin-right: 10px;
opacity: 0.6;
animation: none;
}
@keyframes sparkle {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.1); }
}
#enhanced-search-input {
flex-grow: 1;
background: transparent;
border: none;
outline: none;
font-family: 'Segoe UI', sans-serif;
font-size: 15px;
color: #ffffff;
padding: 10px 0;
}
#enhanced-search-input::placeholder {
color: rgba(255, 255, 255, 0.35);
}
.enhanced-cancel-btn {
background: rgba(255, 255, 255, 0.08);
border: none;
border-radius: 6px;
padding: 6px 12px;
color: rgba(255, 255, 255, 0.7);
cursor: pointer;
font-size: 14px;
transition: all 0.2s ease;
}
.enhanced-cancel-btn:hover {
background: rgba(255, 255, 255, 0.14);
color: #fff;
}
.enhanced-search-btn {
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
padding: 10px 20px;
color: rgba(255, 255, 255, 0.8);
font-family: 'Segoe UI', sans-serif;
font-size: 13px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
gap: 6px;
transition: all 0.2s ease;
flex-shrink: 0;
}
.enhanced-search-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
transform: none;
box-shadow: none;
}
.enhanced-search-btn:active {
transform: scale(0.97);
}
.btn-icon {
font-size: 14px;
}
/* Enhanced Search Status */
.enhanced-search-status {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 20px;
margin-top: 16px;
background: rgba(20, 20, 20, 0.4);
border-radius: 10px;
border-left: 3px solid rgba(138, 43, 226, 0.8);
}
.enhanced-status-indicator {
width: 8px;
height: 8px;
border-radius: 50%;
background: rgba(138, 43, 226, 0.8);
animation: pulse-glow 2s ease-in-out infinite;
}
@keyframes pulse-glow {
0%,
100% {
box-shadow: 0 0 4px rgba(138, 43, 226, 0.6);
}
50% {
box-shadow: 0 0 12px rgba(138, 43, 226, 0.9);
}
}
#enhanced-search-status-text {
font-family: 'Segoe UI', sans-serif;
font-size: 13px;
color: rgba(255, 255, 255, 0.8);
margin: 0;
}
/* Enhanced Search Results */
.enhanced-search-results-container {
background: rgba(20, 20, 20, 0.3);
border-radius: 16px;
border: 2px solid rgba(138, 43, 226, 0.2);
padding: 20px;
margin-top: 20px;
display: flex;
flex-direction: column;
flex-grow: 1;
overflow: hidden;
}
.enhanced-results-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid rgba(138, 43, 226, 0.2);
}
.enhanced-results-header h3 {
color: rgba(255, 255, 255, 0.95);
font-size: 16px;
font-weight: 600;
margin: 0;
}
.results-count-badge {
background: linear-gradient(135deg, rgba(138, 43, 226, 0.3), rgba(123, 31, 162, 0.3));
border: 1px solid rgba(138, 43, 226, 0.5);
border-radius: 20px;
padding: 6px 14px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
}
.enhanced-results-scroll-area {
overflow-y: auto;
flex-grow: 1;
padding-right: 8px;
}
.enhanced-results-scroll-area::-webkit-scrollbar {
width: 8px;
}
.enhanced-results-scroll-area::-webkit-scrollbar-track {
background: rgba(20, 20, 20, 0.3);
border-radius: 4px;
}
.enhanced-results-scroll-area::-webkit-scrollbar-thumb {
background: linear-gradient(to bottom, rgba(138, 43, 226, 0.6), rgba(123, 31, 162, 0.6));
border-radius: 4px;
}
.enhanced-results-scroll-area::-webkit-scrollbar-thumb:hover {
background: linear-gradient(to bottom, rgba(138, 43, 226, 0.8), rgba(123, 31, 162, 0.8));
}
/* Enhanced Results Placeholder */
.enhanced-results-placeholder {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
}
.placeholder-icon {
font-size: 48px;
margin-bottom: 16px;
animation: sparkle 2s ease-in-out infinite;
}
.placeholder-title {
font-size: 18px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
margin: 0 0 8px 0;
}
.placeholder-subtitle {
font-size: 13px;
color: rgba(255, 255, 255, 0.6);
margin: 0;
}
/* ========================================= */
/* ENHANCED SEARCH DROPDOWN OVERLAY */
/* ========================================= */
.enhanced-dropdown {
position: relative;
margin-top: 16px;
background: transparent;
border: none;
border-radius: 0;
box-shadow: none;
max-height: none;
overflow-y: visible;
z-index: 1;
animation: enhFadeIn 0.2s ease-out;
}
@keyframes enhFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideDown {
from { opacity: 0; transform: translateY(-10px); }
to { opacity: 1; transform: translateY(0); }
}
.enhanced-dropdown-content {
max-height: none;
overflow-y: visible;
padding: 0;
}
/* Close button inside dropdown - hidden on desktop, shown on mobile */
.enhanced-dropdown-close {
display: none;
}
/* Responsive: mobile adjustments */
@media (max-width: 700px) {
.enhanced-dropdown-close {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
width: 100%;
padding: 8px 16px;
margin-bottom: 12px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.enhanced-dropdown-close:hover,
.enhanced-dropdown-close:active {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
}
.enhanced-dropdown-close span {
font-size: 14px;
line-height: 1;
}
.enhanced-search-bar-container {
flex-direction: column;
padding: 8px;
gap: 8px;
}
.enhanced-search-btn {
width: 100%;
justify-content: center;
padding: 10px 16px;
}
#enhanced-search-input {
font-size: 14px;
}
}
@media (max-width: 480px) {
.enhanced-search-wrapper {
padding: 0 10px;
}
#enhanced-search-input {
font-size: 13px;
padding: 10px 0;
}
.enhanced-search-icon {
font-size: 16px;
margin-right: 6px;
}
.enhanced-search-btn {
padding: 9px 14px;
font-size: 12px;
}
/* Better album/track results on mobile */
.album-result-item {
margin-bottom: 8px;
}
.album-item__header {
padding: 12px;
gap: 12px;
}
.album-item__icon {
width: 40px;
height: 40px;
font-size: 20px;
}
.album-item__title {
font-size: 11px;
}
.album-item__details {
font-size: 9px;
}
.album-action-btn {
height: 32px;
width: 140px;
font-size: 11px;
}
.track-item {
margin: 2px 12px 6px 50px;
padding: 6px 10px;
}
.track-item__title {
font-size: 10px;
}
.track-item__details {
font-size: 8px;
}
.track-item .action-btn {
width: 28px;
height: 28px;
font-size: 11px;
}
/* Search results area */
.enhanced-search-results-container {
padding: 12px;
}
.search-results-scroll-area {
padding-right: 3px;
}
.search-result-item {
padding: 12px;
border-radius: 14px;
}
}
.enhanced-dropdown-content::-webkit-scrollbar {
width: 6px;
}
.enhanced-dropdown-content::-webkit-scrollbar-track {
background: transparent;
}
.enhanced-dropdown-content::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
}
.enhanced-dropdown-content::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
/* Loading and Empty States */
.enhanced-loading,
.enhanced-empty {
text-align: center;
padding: 40px 20px;
color: rgba(255, 255, 255, 0.7);
}
.enhanced-loading .spinner {
width: 32px;
height: 32px;
margin: 0 auto 12px;
border: 2px solid rgba(255, 255, 255, 0.08);
border-top-color: rgba(255, 255, 255, 0.5);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.empty-icon {
font-size: 48px;
margin-bottom: 12px;
opacity: 0.5;
}
/* Dropdown Sections - Enhanced with Premium Design */
/* Source tabs for multi-source search */
.enh-source-tabs {
display: flex;
gap: 4px;
padding: 0;
margin-bottom: 20px;
border: none;
}
.enh-source-tab {
padding: 6px 14px;
border-radius: 8px;
border: none;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
white-space: nowrap;
letter-spacing: 0.02em;
}
.enh-source-tab:hover {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.85);
}
.enh-source-tab.active {
background: rgba(255, 255, 255, 0.12);
color: #fff;
font-weight: 700;
}
.enh-source-tab .enh-tab-count {
margin-left: 4px;
opacity: 0.5;
font-weight: 400;
}
.enh-source-tab.enh-tab-spotify.active { background: rgba(29, 185, 84, 0.2); color: #1db954; }
.enh-source-tab.enh-tab-itunes.active { background: rgba(252, 60, 68, 0.2); color: #fc3c44; }
.enh-source-tab.enh-tab-deezer.active { background: rgba(162, 56, 255, 0.2); color: #a238ff; }
.enh-source-tab.enh-tab-hydrabase.active { background: rgba(0, 180, 216, 0.2); color: #00b4d8; }
.enh-dropdown-section {
margin-bottom: 24px;
background: transparent;
border: none;
border-radius: 0;
padding: 0;
backdrop-filter: none;
box-shadow: none;
position: relative;
}
.enh-dropdown-section::before {
display: none;
}
.enh-dropdown-section:last-child {
margin-bottom: 0;
}
.enh-section-header {
display: flex;
align-items: center;
gap: 8px;
padding: 0;
margin-bottom: 12px;
border-bottom: none;
position: relative;
}
.enh-section-header::after {
display: none;
}
.enh-section-icon {
display: none;
}
.enh-section-title {
flex-grow: 1;
font-size: 12px;
font-weight: 700;
color: rgba(255, 255, 255, 0.45);
margin: 0;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.enh-section-count {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 20px;
height: 20px;
padding: 0 7px;
background: rgba(255, 255, 255, 0.06);
border: none;
border-radius: 10px;
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
box-shadow: none;
}
/* ========================================= */
/* ARTIST CARDS - Clean Spotify Style */
/* ========================================= */
.enh-artists-wrapper {
display: flex;
flex-direction: column;
gap: 20px;
margin-bottom: 24px;
}
.enh-artist-section {
margin-bottom: 0 !important;
padding: 0;
background: transparent;
border: none;
border-radius: 0;
backdrop-filter: none;
box-shadow: none;
position: relative;
overflow: visible;
}
.enh-artist-section::before {
display: none;
}
.enh-artist-section .enh-section-header {
border-bottom: none;
}
.enh-artist-section .enh-section-header::after {
display: none;
}
/* Artist grid — flexbox wrap with fixed-size cards */
.enh-compact-list.enh-artists-grid {
display: flex;
flex-wrap: wrap;
gap: 16px;
padding-bottom: 4px;
}
@media (max-width: 600px) {
.enh-compact-list.enh-artists-grid {
gap: 10px;
}
}
/* Artist cards — full-bleed photo style matching library page */
.enh-compact-item.artist-card {
background: rgba(18, 18, 18, 1);
border-radius: 14px;
border: 1px solid rgba(255, 255, 255, 0.06);
padding: 0;
cursor: pointer;
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1),
border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: block;
position: relative;
overflow: hidden;
width: 160px;
height: 195px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
flex-shrink: 0;
}
.enh-compact-item.artist-card::before {
display: none;
}
.enh-compact-item.artist-card.has-dynamic-glow::before {
display: none;
}
/* Gradient overlay for text readability */
.enh-compact-item.artist-card::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.85) 0%,
rgba(0, 0, 0, 0.4) 35%,
transparent 60%);
pointer-events: none;
z-index: 1;
}
.enh-compact-item.artist-card:hover {
transform: translateY(-5px) scale(1.02);
border-color: rgba(var(--accent-rgb), 0.25);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5),
0 0 24px rgba(var(--accent-rgb), 0.12);
z-index: 10;
}
.enh-compact-item.artist-card:hover::after {
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.9) 0%,
rgba(0, 0, 0, 0.3) 40%,
transparent 65%);
}
.enh-compact-item.artist-card.has-dynamic-glow:hover {
border-color: color-mix(in srgb, var(--glow-color-1) 30%, transparent);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5),
0 0 24px color-mix(in srgb, var(--glow-color-1) 15%, transparent);
}
/* Artist image — fills entire card */
.enh-item-image.artist-image {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
border-radius: 0;
object-fit: cover;
border: none;
margin: 0;
box-shadow: none;
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 0;
flex-shrink: 0;
}
.enh-compact-item.artist-card:hover .enh-item-image.artist-image {
transform: scale(1.06);
box-shadow: none;
}
.enh-compact-item.artist-card.has-dynamic-glow:hover .enh-item-image.artist-image {
transform: scale(1.06);
}
.enh-item-image-placeholder.artist-placeholder {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
border-radius: 0;
background: linear-gradient(135deg, rgba(30, 30, 30, 1) 0%, rgba(20, 20, 20, 1) 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
color: rgba(255, 255, 255, 0.3);
border: none;
margin: 0;
box-shadow: none;
z-index: 0;
flex-shrink: 0;
}
/* Info pinned to bottom over gradient */
.enh-compact-item.artist-card .enh-item-info {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 14px;
z-index: 2;
display: flex;
flex-direction: column;
gap: 2px;
text-align: left;
min-width: 0;
max-width: none;
}
.enh-compact-item.artist-card .enh-item-name {
font-size: 15px;
font-weight: 700;
color: #ffffff;
margin: 0;
line-height: 1.25;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: block;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.7);
}
.enh-compact-item.artist-card .enh-item-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.55);
display: block;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
}
.enh-compact-item.artist-card .enh-item-badge {
display: none;
}
/* In Library badge on search results */
.enh-item-lib-badge {
position: absolute;
top: 6px;
left: 6px;
font-size: 8px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
background: rgba(var(--accent-rgb), 0.85);
color: #fff;
padding: 3px 7px;
z-index: 5;
animation: libBadgeFadeIn 0.3s ease;
border-radius: 6px;
backdrop-filter: blur(4px);
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}
/* Track items need relative positioning for the badge */
@keyframes libBadgeFadeIn {
from { opacity: 0; transform: scale(0.8); }
to { opacity: 1; transform: scale(1); }
}
.enh-compact-item.track-item .enh-item-lib-badge {
position: static;
flex-shrink: 0;
margin-left: auto;
font-size: 9px;
}
/* Hydrabase badge (dev mode) */
.enh-badge-hydrabase {
background: linear-gradient(135deg, rgba(99, 102, 241, 0.3), rgba(139, 92, 246, 0.3));
border: 1px solid rgba(99, 102, 241, 0.5);
color: rgba(139, 92, 246, 1);
}
.enh-sr-artist-badge-hydrabase {
background: linear-gradient(135deg, rgba(99, 102, 241, 0.3), rgba(139, 92, 246, 0.3));
border: 1px solid rgba(99, 102, 241, 0.5);
color: rgba(139, 92, 246, 1);
}
/* ========================================= */
/* ALBUM CARDS - LARGE Spotify Browse Style */
/* ========================================= */
/* Album grid — discover-style cards */
.enh-compact-list.enh-albums-grid {
display: flex;
gap: 16px;
overflow-x: auto;
padding-bottom: 12px;
scroll-behavior: smooth;
}
.enh-compact-list.enh-albums-grid::-webkit-scrollbar {
height: 6px;
}
.enh-compact-list.enh-albums-grid::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.03);
border-radius: 3px;
}
.enh-compact-list.enh-albums-grid::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.12);
border-radius: 3px;
}
.enh-compact-list.enh-albums-grid::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.2);
}
@media (max-width: 900px) {
.enh-compact-list.enh-albums-grid {
gap: 12px;
}
}
/* Album cards — discover-style */
.enh-compact-item.album-card {
display: flex;
flex-direction: column;
padding: 0;
background: #1a1a1a;
border-radius: 8px;
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
border: none;
backdrop-filter: none;
position: relative;
overflow: hidden;
flex-shrink: 0;
width: 170px;
}
.enh-compact-item.album-card::before {
display: none;
}
.enh-compact-item.album-card.has-dynamic-glow::before {
display: none;
}
.enh-compact-item.album-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
}
.enh-compact-item.album-card.has-dynamic-glow:hover {
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.5),
0 0 16px color-mix(in srgb, var(--glow-color-1) 12%, transparent);
}
.enh-compact-item.album-card:hover::before {
display: none;
}
.enh-item-image.album-cover {
width: 100%;
aspect-ratio: 1;
border-radius: 0;
object-fit: cover;
margin-bottom: 0;
box-shadow: none;
transition: none;
position: relative;
z-index: 1;
}
.enh-compact-item.album-card:hover .enh-item-image.album-cover {
transform: none;
box-shadow: none;
opacity: 1;
}
.enh-compact-item.album-card.has-dynamic-glow:hover .enh-item-image.album-cover {
box-shadow: none;
}
.enh-item-image-placeholder.album-placeholder {
width: 100%;
aspect-ratio: 1;
border-radius: 0;
background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
display: flex;
align-items: center;
justify-content: center;
font-size: 40px;
margin-bottom: 0;
box-shadow: none;
position: relative;
z-index: 1;
}
.enh-compact-item.album-card .enh-item-info {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 10px 12px 12px;
z-index: 3;
}
/* Gradient overlay for text readability on enhanced search album cards */
.enh-compact-item.album-card::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(0deg,
rgba(0, 0, 0, 0.9) 0%,
rgba(0, 0, 0, 0.5) 30%,
transparent 60%);
pointer-events: none;
z-index: 2;
}
.enh-compact-item.album-card .enh-item-name {
font-size: 13px;
font-weight: 600;
color: #fff;
margin: 0 0 2px 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 1.3;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.7);
}
.enh-compact-item.album-card .enh-item-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.6);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 1.3;
margin: 0;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
z-index: 1;
}
/* ========================================= */
/* TRACK ITEMS */
/* ========================================= */
.enh-compact-list.enh-tracks-list {
display: flex;
flex-direction: column;
gap: 2px;
}
.enh-compact-item.track-item {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 12px;
background: transparent;
border-radius: 8px;
cursor: pointer;
transition: all 0.15s ease;
border: none;
min-width: 0;
overflow: hidden;
position: relative;
}
.enh-compact-item.track-item::before {
display: none;
}
.enh-compact-item.track-item.has-dynamic-glow::before {
display: none;
}
.enh-compact-item.track-item:hover {
background: rgba(255, 255, 255, 0.06);
border-color: transparent;
transform: none;
box-shadow: none;
}
.enh-compact-item.track-item.has-dynamic-glow:hover {
background: color-mix(in srgb, var(--glow-color-1) 6%, transparent);
border-color: transparent;
box-shadow: none;
}
.enh-compact-item.track-item:hover::before {
display: none;
}
.enh-item-image.track-cover {
width: 40px;
height: 40px;
border-radius: 4px;
object-fit: cover;
flex-shrink: 0;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
transition: all 0.15s ease;
position: relative;
z-index: 1;
}
.enh-compact-item.track-item:hover .enh-item-image.track-cover {
transform: none;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
}
.enh-compact-item.track-item.has-dynamic-glow:hover .enh-item-image.track-cover {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
}
.enh-item-image-placeholder.track-placeholder {
width: 40px;
height: 40px;
border-radius: 4px;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.05);
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
box-shadow: none;
transition: all 0.15s ease;
position: relative;
z-index: 1;
}
.enh-item-info {
flex-grow: 1;
min-width: 0;
position: relative;
z-index: 1;
}
.enh-compact-item.track-item .enh-item-name {
font-size: 14px;
font-weight: 500;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 2px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
letter-spacing: -0.1px;
}
.enh-compact-item.track-item .enh-item-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.enh-item-duration {
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.35);
flex-shrink: 0;
margin-left: 8px;
position: relative;
display: flex;
align-items: center;
gap: 10px;
z-index: 1;
font-variant-numeric: tabular-nums;
}
/* Play button on hover */
.enh-item-play-btn {
opacity: 0;
padding: 5px 12px;
background: rgba(255, 255, 255, 0.12);
color: #ffffff;
border: none;
border-radius: 14px;
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.15s ease;
box-shadow: none;
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
z-index: 10;
backdrop-filter: blur(8px);
}
.enh-compact-item.track-item:hover .enh-item-play-btn {
opacity: 1;
transform: translateY(-50%);
}
.enh-item-play-btn:hover {
background: rgba(var(--accent-rgb), 0.8);
box-shadow: none;
transform: translateY(-50%) scale(1.05);
}
.enh-item-play-btn:active {
transform: translateY(-50%) scale(0.95);
}
/* ========================================= */
/* SEARCH BUBBLE CARDS - Download Tracking */
/* ========================================= */
.search-bubble-section {
padding: 32px 24px;
}
.search-bubble-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 24px;
padding-bottom: 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.search-bubble-title {
font-size: 20px;
font-weight: 700;
color: #ffffff;
margin: 0;
letter-spacing: -0.4px;
}
.search-bubble-count {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 32px;
height: 32px;
padding: 0 12px;
background: rgba(var(--accent-rgb), 0.15);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 16px;
font-size: 14px;
font-weight: 600;
color: rgba(var(--accent-rgb), 1);
}
.search-bubble-container {
display: flex;
flex-wrap: wrap;
gap: 24px;
justify-content: center;
align-items: center;
padding: 12px;
}
.search-bubble-card {
position: relative;
width: 150px;
height: 150px;
border-radius: 50%;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: linear-gradient(135deg,
rgba(26, 26, 26, 0.95) 0%,
rgba(18, 18, 18, 0.98) 100%);
border: 2px solid rgba(255, 255, 255, 0.1);
box-shadow:
0 4px 12px rgba(0, 0, 0, 0.4),
0 0 0 1px rgba(var(--accent-rgb), 0.05),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.search-bubble-card:hover {
transform: translateY(-3px) scale(1.05);
border-color: rgba(var(--accent-rgb), 0.3);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.2),
0 0 15px rgba(var(--accent-rgb), 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.search-bubble-card.all-completed {
border-color: rgba(var(--accent-rgb), 0.4);
}
.search-bubble-card.all-completed:hover {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow:
0 8px 20px rgba(0, 0, 0, 0.5),
0 0 0 1px rgba(var(--accent-rgb), 0.3),
0 0 15px rgba(var(--accent-rgb), 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.search-bubble-image {
position: absolute;
inset: 0;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 50%;
overflow: hidden;
}
.search-bubble-overlay {
position: absolute;
inset: 0;
background: linear-gradient(135deg,
rgba(0, 0, 0, 0.3) 0%,
rgba(0, 0, 0, 0.6) 100%);
border-radius: 50%;
}
.search-bubble-content {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 16px;
text-align: center;
z-index: 2;
}
.search-bubble-name {
font-size: 14px;
font-weight: 700;
color: #ffffff;
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
line-height: 1.3;
}
.search-bubble-artist {
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 8px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
}
.search-bubble-status {
display: flex;
align-items: center;
gap: 4px;
margin-top: auto;
padding: 4px 8px;
background: rgba(0, 0, 0, 0.4);
border-radius: 12px;
backdrop-filter: blur(4px);
}
.search-bubble-status-icon {
font-size: 12px;
}
.search-bubble-status-text {
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.search-bubble-type {
position: absolute;
top: 8px;
right: 8px;
padding: 4px 8px;
background: rgba(var(--accent-rgb), 0.9);
border-radius: 8px;
font-size: 10px;
font-weight: 600;
color: #ffffff;
backdrop-filter: blur(4px);
}
/* Responsive search bubbles */
@media (max-width: 768px) {
.search-bubble-card {
width: 120px;
height: 120px;
}
.search-bubble-name {
font-size: 12px;
}
.search-bubble-artist {
font-size: 11px;
}
}
/* ========================================= */
/* ENHANCED SEARCH CATEGORIZED RESULTS */
/* (OLD - REMOVE IF NOT NEEDED) */
/* ========================================= */
/* Categorized Container */
.enh-sr-categorized-container {
display: flex;
flex-direction: column;
gap: 24px;
}
/* Category Section */
.enh-sr-category-section {
background: rgba(30, 30, 30, 0.5);
border-radius: 12px;
padding: 20px;
border: 1px solid rgba(138, 43, 226, 0.2);
}
.enh-sr-category-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid rgba(138, 43, 226, 0.2);
}
.enh-sr-category-icon {
font-size: 20px;
}
.enh-sr-category-title {
flex-grow: 1;
font-size: 16px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin: 0;
}
.enh-sr-category-count {
background: linear-gradient(135deg, rgba(138, 43, 226, 0.4), rgba(123, 31, 162, 0.4));
border: 1px solid rgba(138, 43, 226, 0.5);
border-radius: 12px;
padding: 4px 10px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
}
/* Artist Grid (for both DB and Spotify artists) */
.enh-sr-artist-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 16px;
}
.enh-sr-artist-card {
background: linear-gradient(135deg, rgba(40, 40, 40, 0.8), rgba(30, 30, 30, 0.8));
border-radius: 12px;
padding: 16px;
cursor: pointer;
transition: all 0.3s ease;
border: 2px solid transparent;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.enh-sr-artist-card:hover {
transform: translateY(-4px);
border-color: rgba(138, 43, 226, 0.6);
box-shadow: 0 8px 24px rgba(138, 43, 226, 0.3);
}
.enh-sr-artist-image-container {
width: 80px;
height: 80px;
border-radius: 50%;
overflow: hidden;
margin-bottom: 12px;
border: 3px solid rgba(138, 43, 226, 0.3);
}
.enh-sr-artist-image {
width: 100%;
height: 100%;
object-fit: cover;
}
.enh-sr-artist-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(138, 43, 226, 0.4), rgba(123, 31, 162, 0.4));
font-size: 36px;
}
.enh-sr-artist-name {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin-bottom: 6px;
word-wrap: break-word;
}
.enh-sr-artist-badge {
font-size: 11px;
padding: 4px 8px;
border-radius: 8px;
font-weight: 600;
}
.enh-sr-artist-badge-library {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.3), rgba(24, 156, 71, 0.3));
border: 1px solid rgba(var(--accent-rgb), 0.5);
color: rgba(var(--accent-rgb), 1);
}
.enh-sr-artist-badge-spotify {
background: linear-gradient(135deg, rgba(138, 43, 226, 0.3), rgba(123, 31, 162, 0.3));
border: 1px solid rgba(138, 43, 226, 0.5);
color: rgba(138, 43, 226, 1);
}
/* Album Grid */
.enh-sr-album-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 16px;
}
.enh-sr-album-card {
background: linear-gradient(135deg, rgba(40, 40, 40, 0.8), rgba(30, 30, 30, 0.8));
border-radius: 12px;
padding: 12px;
cursor: pointer;
transition: all 0.3s ease;
border: 2px solid transparent;
}
.enh-sr-album-card:hover {
transform: translateY(-4px);
border-color: rgba(138, 43, 226, 0.6);
box-shadow: 0 8px 24px rgba(138, 43, 226, 0.3);
}
.enh-sr-album-cover {
width: 100%;
aspect-ratio: 1;
border-radius: 8px;
overflow: hidden;
margin-bottom: 12px;
background: linear-gradient(135deg, rgba(138, 43, 226, 0.3), rgba(123, 31, 162, 0.3));
}
.enh-sr-album-cover img {
width: 100%;
height: 100%;
object-fit: cover;
}
.enh-sr-album-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
}
.enh-sr-album-name {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.enh-sr-album-artist {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 6px;
}
.enh-sr-album-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
display: flex;
justify-content: space-between;
}
/* Track List */
.enh-sr-track-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.enh-sr-track-item {
background: linear-gradient(135deg, rgba(40, 40, 40, 0.6), rgba(30, 30, 30, 0.6));
border-radius: 10px;
padding: 12px 16px;
cursor: pointer;
transition: all 0.2s ease;
border: 2px solid transparent;
display: flex;
align-items: center;
gap: 12px;
}
.enh-sr-track-item:hover {
border-color: rgba(138, 43, 226, 0.6);
background: linear-gradient(135deg, rgba(50, 50, 50, 0.8), rgba(40, 40, 40, 0.8));
transform: translateX(4px);
}
.enh-sr-track-cover {
width: 48px;
height: 48px;
border-radius: 6px;
overflow: hidden;
flex-shrink: 0;
background: linear-gradient(135deg, rgba(138, 43, 226, 0.3), rgba(123, 31, 162, 0.3));
}
.enh-sr-track-cover img {
width: 100%;
height: 100%;
object-fit: cover;
}
.enh-sr-track-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
}
.enh-sr-track-info {
flex-grow: 1;
min-width: 0;
}
.enh-sr-track-name {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin-bottom: 4px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.enh-sr-track-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.enh-sr-track-duration {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
flex-shrink: 0;
margin-left: 12px;
}
/* ========================================= */
/* SLSKD SEARCH RESULTS VIEW */
/* ========================================= */
.enh-sr-slskd-view {
display: flex;
flex-direction: column;
gap: 16px;
}
.enh-sr-back-btn {
background: rgba(40, 40, 40, 0.8);
border: 1px solid rgba(138, 43, 226, 0.4);
border-radius: 10px;
padding: 10px 20px;
color: rgba(255, 255, 255, 0.9);
font-size: 14px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
transition: all 0.2s ease;
align-self: flex-start;
}
.enh-sr-back-btn:hover {
background: rgba(50, 50, 50, 0.9);
border-color: rgba(138, 43, 226, 0.6);
transform: translateX(-4px);
}
.enh-sr-back-icon {
font-size: 16px;
}
.enh-sr-slskd-header {
background: linear-gradient(135deg, rgba(138, 43, 226, 0.15), rgba(75, 0, 130, 0.15));
border-radius: 12px;
padding: 20px;
display: flex;
justify-content: space-between;
align-items: center;
border: 1px solid rgba(138, 43, 226, 0.3);
}
.enh-sr-slskd-title {
font-size: 16px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin: 0;
}
.enh-sr-slskd-badge {
background: linear-gradient(135deg, rgba(138, 43, 226, 0.4), rgba(123, 31, 162, 0.4));
border: 1px solid rgba(138, 43, 226, 0.5);
border-radius: 12px;
padding: 6px 12px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
}
.enh-sr-slskd-list {
display: flex;
flex-direction: column;
gap: 12px;
}
/* Slskd Result Item (reuses download manager card styles with enh-sr prefix) */
.enh-sr-download-card {
background: linear-gradient(135deg, rgba(40, 40, 40, 0.8), rgba(30, 30, 30, 0.8));
border-radius: 12px;
padding: 16px;
border: 2px solid rgba(138, 43, 226, 0.2);
transition: all 0.3s ease;
}
.enh-sr-download-card:hover {
border-color: rgba(138, 43, 226, 0.5);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(138, 43, 226, 0.2);
}
.enh-sr-download-card-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 12px;
}
.enh-sr-download-title {
font-size: 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
margin: 0;
flex-grow: 1;
}
.enh-sr-download-btn {
background: linear-gradient(135deg, rgba(138, 43, 226, 0.8), rgba(123, 31, 162, 0.8));
border: none;
border-radius: 8px;
padding: 8px 16px;
color: #ffffff;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
margin-left: 12px;
}
.enh-sr-download-btn:hover {
background: linear-gradient(135deg, rgba(138, 43, 226, 1), rgba(123, 31, 162, 1));
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(138, 43, 226, 0.4);
}
.enh-sr-download-meta {
display: flex;
flex-wrap: wrap;
gap: 8px;
font-size: 11px;
color: rgba(255, 255, 255, 0.6);
}
.enh-sr-meta-badge {
background: rgba(50, 50, 50, 0.6);
border-radius: 6px;
padding: 4px 8px;
}
/* ============================================================================
MUSICBRAINZ ENRICHMENT STATUS BUTTON - PHASE 5 WEB UI
============================================================================ */
/* Container for button + tooltip positioning */
.mb-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
/* MusicBrainz Button */
.musicbrainz-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(186, 85, 211, 0.12) 0%,
rgba(147, 51, 156, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(186, 85, 211, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(186, 85, 211, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.musicbrainz-button:hover {
background: linear-gradient(135deg,
rgba(186, 85, 211, 0.18) 0%,
rgba(147, 51, 156, 0.25) 100%);
border-color: rgba(186, 85, 211, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(186, 85, 211, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.musicbrainz-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(186, 85, 211, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
/* MusicBrainz Logo */
.mb-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.musicbrainz-button:hover .mb-logo {
opacity: 1;
}
/* Loading Spinner - Animated Ring */
.mb-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(186, 85, 211, 0.8);
border-right-color: rgba(186, 85, 211, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Active State - Spinner visible and rotating */
.musicbrainz-button.active .mb-spinner {
opacity: 1;
animation: mb-spin 1.2s linear infinite;
}
.musicbrainz-button.active {
background: linear-gradient(135deg,
rgba(186, 85, 211, 0.22) 0%,
rgba(147, 51, 156, 0.28) 100%);
border-color: rgba(186, 85, 211, 0.5);
box-shadow:
0 6px 24px rgba(186, 85, 211, 0.4),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.musicbrainz-button.active .mb-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(186, 85, 211, 0.6));
}
/* Complete/Idle State */
.musicbrainz-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.musicbrainz-button.complete .mb-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.musicbrainz-button.complete .mb-spinner {
opacity: 0;
}
/* Paused State */
.musicbrainz-button.paused {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.12) 0%,
rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow:
0 4px 16px rgba(255, 193, 7, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.musicbrainz-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow:
0 6px 20px rgba(255, 193, 7, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2);
}
/* Spinner Rotation Animation */
@keyframes mb-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* ============================================================================
MUSICBRAINZ HOVER TOOLTIP
============================================================================ */
.musicbrainz-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
/* 12px gap below button */
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.musicbrainz-button:hover+.musicbrainz-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.tooltip-content {
min-width: 260px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(186, 85, 211, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(186, 85, 211, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(186, 85, 211, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
.tooltip-status,
.tooltip-current,
.tooltip-progress {
font-family: 'SF Pro Text', -apple-system, sans-serif;
font-size: 11px;
color: rgba(255, 255, 255, 0.75);
line-height: 1.5;
}
.tooltip-status span,
.tooltip-current,
.tooltip-progress {
color: rgba(255, 255, 255, 0.9);
font-weight: 500;
}
#mb-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.musicbrainz-button.paused+.musicbrainz-tooltip #mb-tooltip-status {
color: #ffc107;
}
/* Tooltip Arrow */
.tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(186, 85, 211, 0.3);
}
.tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ============================================================================
AUDIODB ENRICHMENT STATUS BUTTON
============================================================================ */
/* Container for button + tooltip positioning */
.audiodb-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
/* AudioDB Button */
.audiodb-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(0, 188, 212, 0.12) 0%,
rgba(0, 150, 170, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(0, 188, 212, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(0, 188, 212, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.audiodb-button:hover {
background: linear-gradient(135deg,
rgba(0, 188, 212, 0.18) 0%,
rgba(0, 150, 170, 0.25) 100%);
border-color: rgba(0, 188, 212, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(0, 188, 212, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.audiodb-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(0, 188, 212, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
/* AudioDB Logo */
.audiodb-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.audiodb-button:hover .audiodb-logo {
opacity: 1;
}
/* Loading Spinner - Animated Ring */
.audiodb-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(0, 188, 212, 0.8);
border-right-color: rgba(0, 188, 212, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Active State - Spinner visible and rotating */
.audiodb-button.active .audiodb-spinner {
opacity: 1;
animation: audiodb-spin 1.2s linear infinite;
}
.audiodb-button.active {
background: linear-gradient(135deg,
rgba(0, 188, 212, 0.22) 0%,
rgba(0, 150, 170, 0.28) 100%);
border-color: rgba(0, 188, 212, 0.5);
box-shadow:
0 6px 24px rgba(0, 188, 212, 0.4),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.audiodb-button.active .audiodb-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(0, 188, 212, 0.6));
}
/* Complete/Idle State */
.audiodb-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.audiodb-button.complete .audiodb-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.audiodb-button.complete .audiodb-spinner {
opacity: 0;
}
/* Paused State */
.audiodb-button.paused {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.12) 0%,
rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow:
0 4px 16px rgba(255, 193, 7, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.audiodb-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow:
0 6px 20px rgba(255, 193, 7, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2);
}
/* Spinner Rotation Animation */
@keyframes audiodb-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* ============================================================================
AUDIODB HOVER TOOLTIP
============================================================================ */
.audiodb-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.audiodb-button:hover+.audiodb-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.audiodb-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(0, 188, 212, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(0, 188, 212, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.audiodb-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(0, 188, 212, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.audiodb-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#audiodb-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.audiodb-button.paused+.audiodb-tooltip #audiodb-tooltip-status {
color: #ffc107;
}
/* AudioDB Tooltip Arrow */
.audiodb-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(0, 188, 212, 0.3);
}
.audiodb-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ============================================================================
DEEZER ENRICHMENT STATUS BUTTON
============================================================================ */
/* Container for button + tooltip positioning */
.deezer-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
/* Deezer Button */
.deezer-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(162, 56, 255, 0.12) 0%,
rgba(120, 30, 200, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(162, 56, 255, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(162, 56, 255, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.deezer-button:hover {
background: linear-gradient(135deg,
rgba(162, 56, 255, 0.18) 0%,
rgba(120, 30, 200, 0.25) 100%);
border-color: rgba(162, 56, 255, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(162, 56, 255, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.deezer-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(162, 56, 255, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
/* Deezer Logo */
.deezer-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.deezer-button:hover .deezer-logo {
opacity: 1;
}
/* Loading Spinner - Animated Ring */
.deezer-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(162, 56, 255, 0.8);
border-right-color: rgba(162, 56, 255, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Active State - Spinner visible and rotating */
.deezer-button.active .deezer-spinner {
opacity: 1;
animation: deezer-spin 1.2s linear infinite;
}
.deezer-button.active {
background: linear-gradient(135deg,
rgba(162, 56, 255, 0.22) 0%,
rgba(120, 30, 200, 0.28) 100%);
border-color: rgba(162, 56, 255, 0.5);
box-shadow:
0 6px 24px rgba(162, 56, 255, 0.4),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.deezer-button.active .deezer-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(162, 56, 255, 0.6));
}
/* Complete/Idle State */
.deezer-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.deezer-button.complete .deezer-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.deezer-button.complete .deezer-spinner {
opacity: 0;
}
/* Paused State */
.deezer-button.paused {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.12) 0%,
rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow:
0 4px 16px rgba(255, 193, 7, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.deezer-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow:
0 6px 20px rgba(255, 193, 7, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2);
}
/* Spinner Rotation Animation */
@keyframes deezer-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* ============================================================================
DEEZER HOVER TOOLTIP
============================================================================ */
.deezer-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.deezer-button:hover+.deezer-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.deezer-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(162, 56, 255, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(162, 56, 255, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.deezer-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(162, 56, 255, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.deezer-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#deezer-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.deezer-button.paused+.deezer-tooltip #deezer-tooltip-status {
color: #ffc107;
}
/* Deezer Tooltip Arrow */
.deezer-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(162, 56, 255, 0.3);
}
.deezer-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ============================================================================
SPOTIFY ENRICHMENT STATUS BUTTON
============================================================================ */
.spotify-enrich-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.spotify-enrich-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(30, 215, 96, 0.12) 0%,
rgba(21, 150, 67, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(30, 215, 96, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(30, 215, 96, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.spotify-enrich-button:hover {
background: linear-gradient(135deg,
rgba(30, 215, 96, 0.18) 0%,
rgba(21, 150, 67, 0.25) 100%);
border-color: rgba(30, 215, 96, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(30, 215, 96, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.spotify-enrich-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(30, 215, 96, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.spotify-enrich-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.spotify-enrich-button:hover .spotify-enrich-logo {
opacity: 1;
}
.spotify-enrich-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(30, 215, 96, 0.8);
border-right-color: rgba(30, 215, 96, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.spotify-enrich-button.active .spotify-enrich-spinner {
opacity: 1;
animation: spotify-enrich-spin 1.2s linear infinite;
}
.spotify-enrich-button.active {
background: linear-gradient(135deg,
rgba(30, 215, 96, 0.22) 0%,
rgba(21, 150, 67, 0.28) 100%);
border-color: rgba(30, 215, 96, 0.5);
box-shadow:
0 6px 24px rgba(30, 215, 96, 0.4),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.spotify-enrich-button.active .spotify-enrich-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(30, 215, 96, 0.6));
}
.spotify-enrich-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.spotify-enrich-button.complete .spotify-enrich-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.spotify-enrich-button.complete .spotify-enrich-spinner {
opacity: 0;
}
.spotify-enrich-button.paused {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.12) 0%,
rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow:
0 4px 16px rgba(255, 193, 7, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.spotify-enrich-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow:
0 6px 20px rgba(255, 193, 7, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2);
}
.spotify-enrich-button.no-auth {
background: linear-gradient(135deg,
rgba(120, 120, 120, 0.08) 0%,
rgba(80, 80, 80, 0.12) 100%);
border-color: rgba(120, 120, 120, 0.25);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.15),
0 2px 8px rgba(0, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
opacity: 0.5;
cursor: not-allowed;
}
.spotify-enrich-button.no-auth .spotify-enrich-logo {
filter: grayscale(1) opacity(0.4);
}
.spotify-enrich-button.no-auth .spotify-enrich-spinner {
display: none;
}
.spotify-enrich-button.no-auth:hover {
border-color: rgba(120, 120, 120, 0.35);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.2),
0 3px 12px rgba(0, 0, 0, 0.15);
opacity: 0.55;
}
.spotify-enrich-button.no-auth+.spotify-enrich-tooltip #spotify-enrich-tooltip-status {
color: rgba(120, 120, 120, 0.8);
}
@keyframes spotify-enrich-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ============================================================================
SPOTIFY ENRICHMENT HOVER TOOLTIP
============================================================================ */
.spotify-enrich-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.spotify-enrich-button:hover+.spotify-enrich-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.spotify-enrich-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(30, 215, 96, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(30, 215, 96, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.spotify-enrich-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(30, 215, 96, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.spotify-enrich-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#spotify-enrich-tooltip-status {
color: rgb(30, 215, 96);
font-weight: 600;
}
.spotify-enrich-button.paused+.spotify-enrich-tooltip #spotify-enrich-tooltip-status {
color: #ffc107;
}
.spotify-enrich-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 215, 96, 0.3);
}
.spotify-enrich-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ============================================================================
ITUNES ENRICHMENT STATUS BUTTON
============================================================================ */
.itunes-enrich-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.itunes-enrich-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(251, 91, 137, 0.12) 0%,
rgba(164, 69, 178, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(251, 91, 137, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(251, 91, 137, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.itunes-enrich-button:hover {
background: linear-gradient(135deg,
rgba(251, 91, 137, 0.18) 0%,
rgba(164, 69, 178, 0.25) 100%);
border-color: rgba(251, 91, 137, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(251, 91, 137, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.itunes-enrich-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(251, 91, 137, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.itunes-enrich-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.itunes-enrich-button:hover .itunes-enrich-logo {
opacity: 1;
}
.itunes-enrich-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(251, 91, 137, 0.8);
border-right-color: rgba(164, 69, 178, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.itunes-enrich-button.active .itunes-enrich-spinner {
opacity: 1;
animation: itunes-enrich-spin 1.2s linear infinite;
}
.itunes-enrich-button.active {
background: linear-gradient(135deg,
rgba(251, 91, 137, 0.22) 0%,
rgba(164, 69, 178, 0.28) 100%);
border-color: rgba(251, 91, 137, 0.5);
box-shadow:
0 6px 24px rgba(251, 91, 137, 0.4),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.itunes-enrich-button.active .itunes-enrich-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(251, 91, 137, 0.6));
}
.itunes-enrich-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.itunes-enrich-button.complete .itunes-enrich-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.itunes-enrich-button.complete .itunes-enrich-spinner {
opacity: 0;
}
.itunes-enrich-button.paused {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.12) 0%,
rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow:
0 4px 16px rgba(255, 193, 7, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.itunes-enrich-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow:
0 6px 20px rgba(255, 193, 7, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2);
}
@keyframes itunes-enrich-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* ============================================================================
ITUNES ENRICHMENT HOVER TOOLTIP
============================================================================ */
.itunes-enrich-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.itunes-enrich-button:hover+.itunes-enrich-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.itunes-enrich-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(251, 91, 137, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(251, 91, 137, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.itunes-enrich-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(251, 91, 137, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.itunes-enrich-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#itunes-enrich-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.itunes-enrich-button.paused+.itunes-enrich-tooltip #itunes-enrich-tooltip-status {
color: #ffc107;
}
.itunes-enrich-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(251, 91, 137, 0.3);
}
.itunes-enrich-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ========================================
LAST.FM ENRICHMENT STATUS BUTTON
======================================== */
.lastfm-enrich-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.lastfm-enrich-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg, rgba(213, 16, 7, 0.12) 0%, rgba(180, 10, 5, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(213, 16, 7, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 16px rgba(213, 16, 7, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.lastfm-enrich-button:hover {
background: linear-gradient(135deg, rgba(213, 16, 7, 0.18) 0%, rgba(180, 10, 5, 0.25) 100%);
border-color: rgba(213, 16, 7, 0.4);
transform: scale(1.05);
box-shadow: 0 6px 20px rgba(213, 16, 7, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.lastfm-enrich-button:active {
transform: scale(0.95);
}
.lastfm-enrich-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
border-radius: 50%;
}
.lastfm-enrich-button:hover .lastfm-enrich-logo {
opacity: 1;
}
.lastfm-enrich-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(213, 16, 7, 0.8);
border-right-color: rgba(213, 16, 7, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.lastfm-enrich-button.active .lastfm-enrich-spinner {
opacity: 1;
animation: lastfm-spin 1.2s linear infinite;
}
.lastfm-enrich-button.active {
background: linear-gradient(135deg, rgba(213, 16, 7, 0.22) 0%, rgba(180, 10, 5, 0.28) 100%);
border-color: rgba(213, 16, 7, 0.5);
box-shadow: 0 6px 24px rgba(213, 16, 7, 0.4), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.lastfm-enrich-button.active .lastfm-enrich-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(213, 16, 7, 0.6));
}
.lastfm-enrich-button.complete {
background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow: 0 4px 16px rgba(76, 175, 80, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.lastfm-enrich-button.complete .lastfm-enrich-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.lastfm-enrich-button.complete .lastfm-enrich-spinner {
opacity: 0;
}
.lastfm-enrich-button.paused {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow: 0 4px 16px rgba(255, 193, 7, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.lastfm-enrich-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow: 0 6px 20px rgba(255, 193, 7, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2);
}
@keyframes lastfm-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.lastfm-enrich-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.lastfm-enrich-button:hover+.lastfm-enrich-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.lastfm-enrich-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg, rgba(30, 30, 30, 0.98) 0%, rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(213, 16, 7, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(213, 16, 7, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.lastfm-enrich-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(213, 16, 7, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.lastfm-enrich-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#lastfm-enrich-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.lastfm-enrich-button.paused+.lastfm-enrich-tooltip #lastfm-enrich-tooltip-status {
color: #ffc107;
}
.lastfm-enrich-button.no-auth {
background: linear-gradient(135deg,
rgba(120, 120, 120, 0.08) 0%,
rgba(80, 80, 80, 0.12) 100%);
border-color: rgba(120, 120, 120, 0.25);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.15),
0 2px 8px rgba(0, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
opacity: 0.5;
cursor: not-allowed;
}
.lastfm-enrich-button.no-auth .lastfm-enrich-logo {
filter: grayscale(1) opacity(0.4);
}
.lastfm-enrich-button.no-auth .lastfm-enrich-spinner {
display: none;
}
.lastfm-enrich-button.no-auth:hover {
border-color: rgba(120, 120, 120, 0.35);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.2),
0 3px 12px rgba(0, 0, 0, 0.15);
opacity: 0.55;
}
.lastfm-enrich-button.no-auth+.lastfm-enrich-tooltip #lastfm-enrich-tooltip-status {
color: rgba(120, 120, 120, 0.8);
}
.lastfm-enrich-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(213, 16, 7, 0.3);
}
.lastfm-enrich-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ========================================
GENIUS ENRICHMENT STATUS BUTTON
======================================== */
.genius-enrich-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.genius-enrich-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg, rgba(255, 255, 100, 0.10) 0%, rgba(200, 200, 50, 0.16) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(255, 255, 100, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 16px rgba(255, 255, 100, 0.15), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.genius-enrich-button:hover {
background: linear-gradient(135deg, rgba(255, 255, 100, 0.16) 0%, rgba(200, 200, 50, 0.22) 100%);
border-color: rgba(255, 255, 100, 0.4);
transform: scale(1.05);
box-shadow: 0 6px 20px rgba(255, 255, 100, 0.25), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.genius-enrich-button:active {
transform: scale(0.95);
}
.genius-enrich-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
border-radius: 50%;
}
.genius-enrich-button:hover .genius-enrich-logo {
opacity: 1;
}
.genius-enrich-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(255, 255, 100, 0.8);
border-right-color: rgba(255, 255, 100, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.genius-enrich-button.active .genius-enrich-spinner {
opacity: 1;
animation: genius-spin 1.2s linear infinite;
}
.genius-enrich-button.active {
background: linear-gradient(135deg, rgba(255, 255, 100, 0.20) 0%, rgba(200, 200, 50, 0.26) 100%);
border-color: rgba(255, 255, 100, 0.5);
box-shadow: 0 6px 24px rgba(255, 255, 100, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.genius-enrich-button.active .genius-enrich-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(255, 255, 100, 0.6));
}
.genius-enrich-button.complete {
background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow: 0 4px 16px rgba(76, 175, 80, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.genius-enrich-button.complete .genius-enrich-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.genius-enrich-button.complete .genius-enrich-spinner {
opacity: 0;
}
.genius-enrich-button.paused {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow: 0 4px 16px rgba(255, 193, 7, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.genius-enrich-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow: 0 6px 20px rgba(255, 193, 7, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2);
}
@keyframes genius-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.genius-enrich-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.genius-enrich-button:hover+.genius-enrich-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.genius-enrich-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg, rgba(30, 30, 30, 0.98) 0%, rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(255, 255, 100, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(255, 255, 100, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.genius-enrich-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 100, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.genius-enrich-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#genius-enrich-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.genius-enrich-button.paused+.genius-enrich-tooltip #genius-enrich-tooltip-status {
color: #ffc107;
}
.genius-enrich-button.no-auth {
background: linear-gradient(135deg,
rgba(120, 120, 120, 0.08) 0%,
rgba(80, 80, 80, 0.12) 100%);
border-color: rgba(120, 120, 120, 0.25);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.15),
0 2px 8px rgba(0, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
opacity: 0.5;
cursor: not-allowed;
}
.genius-enrich-button.no-auth .genius-enrich-logo {
filter: grayscale(1) opacity(0.4);
}
.genius-enrich-button.no-auth .genius-enrich-spinner {
display: none;
}
.genius-enrich-button.no-auth:hover {
border-color: rgba(120, 120, 120, 0.35);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.2),
0 3px 12px rgba(0, 0, 0, 0.15);
opacity: 0.55;
}
.genius-enrich-button.no-auth+.genius-enrich-tooltip #genius-enrich-tooltip-status {
color: rgba(120, 120, 120, 0.8);
}
.genius-enrich-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(255, 255, 100, 0.3);
}
.genius-enrich-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ========================================
TIDAL ENRICHMENT STATUS BUTTON
======================================== */
.tidal-enrich-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.tidal-enrich-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg, rgba(0, 0, 0, 0.15) 0%, rgba(30, 30, 30, 0.22) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(255, 255, 255, 0.20);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.tidal-enrich-button:hover {
background: linear-gradient(135deg, rgba(0, 0, 0, 0.22) 0%, rgba(30, 30, 30, 0.30) 100%);
border-color: rgba(255, 255, 255, 0.35);
transform: scale(1.05);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.tidal-enrich-button:active {
transform: scale(0.95);
}
.tidal-enrich-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3)) invert(1) brightness(1.8);
border-radius: 50%;
}
.tidal-enrich-button:hover .tidal-enrich-logo {
opacity: 1;
}
.tidal-enrich-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(255, 255, 255, 0.8);
border-right-color: rgba(255, 255, 255, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.tidal-enrich-button.active .tidal-enrich-spinner {
opacity: 1;
animation: tidal-spin 1.2s linear infinite;
}
.tidal-enrich-button.active {
background: linear-gradient(135deg, rgba(0, 0, 0, 0.28) 0%, rgba(30, 30, 30, 0.36) 100%);
border-color: rgba(255, 255, 255, 0.45);
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4), 0 3px 12px rgba(0, 0, 0, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.tidal-enrich-button.active .tidal-enrich-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.6)) invert(1) brightness(1.8);
}
.tidal-enrich-button.complete {
background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow: 0 4px 16px rgba(76, 175, 80, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.tidal-enrich-button.complete .tidal-enrich-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5)) invert(1) brightness(1.8);
}
.tidal-enrich-button.complete .tidal-enrich-spinner {
opacity: 0;
}
.tidal-enrich-button.paused {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow: 0 4px 16px rgba(255, 193, 7, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.tidal-enrich-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow: 0 6px 20px rgba(255, 193, 7, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2);
}
@keyframes tidal-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.tidal-enrich-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.tidal-enrich-button:hover+.tidal-enrich-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.tidal-enrich-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg, rgba(30, 30, 30, 0.98) 0%, rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.tidal-enrich-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.tidal-enrich-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#tidal-enrich-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.tidal-enrich-button.paused+.tidal-enrich-tooltip #tidal-enrich-tooltip-status {
color: #ffc107;
}
.tidal-enrich-button.no-auth {
background: linear-gradient(135deg,
rgba(120, 120, 120, 0.08) 0%,
rgba(80, 80, 80, 0.12) 100%);
border-color: rgba(120, 120, 120, 0.25);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.15),
0 2px 8px rgba(0, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
opacity: 0.5;
cursor: not-allowed;
}
.tidal-enrich-button.no-auth .tidal-enrich-logo {
filter: grayscale(1) opacity(0.4) invert(1) brightness(1.8);
}
.tidal-enrich-button.no-auth .tidal-enrich-spinner {
display: none;
}
.tidal-enrich-button.no-auth:hover {
border-color: rgba(120, 120, 120, 0.35);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.2),
0 3px 12px rgba(0, 0, 0, 0.15);
opacity: 0.55;
}
.tidal-enrich-button.no-auth+.tidal-enrich-tooltip #tidal-enrich-tooltip-status {
color: rgba(120, 120, 120, 0.8);
}
.tidal-enrich-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(255, 255, 255, 0.3);
}
.tidal-enrich-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ========================================
QOBUZ ENRICHMENT STATUS BUTTON
======================================== */
.qobuz-enrich-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.qobuz-enrich-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg, rgba(1, 112, 239, 0.10) 0%, rgba(1, 90, 200, 0.16) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(1, 112, 239, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 16px rgba(1, 112, 239, 0.15), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.qobuz-enrich-button:hover {
background: linear-gradient(135deg, rgba(1, 112, 239, 0.16) 0%, rgba(1, 90, 200, 0.22) 100%);
border-color: rgba(1, 112, 239, 0.4);
transform: scale(1.05);
box-shadow: 0 6px 20px rgba(1, 112, 239, 0.25), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.qobuz-enrich-button:active {
transform: scale(0.95);
}
.qobuz-enrich-logo {
width: 24px;
height: 24px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3)) invert(1);
border-radius: 50%;
}
.qobuz-enrich-button:hover .qobuz-enrich-logo {
opacity: 1;
}
.qobuz-enrich-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(1, 112, 239, 0.8);
border-right-color: rgba(1, 112, 239, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.qobuz-enrich-button.active .qobuz-enrich-spinner {
opacity: 1;
animation: qobuz-spin 1.2s linear infinite;
}
.qobuz-enrich-button.active {
background: linear-gradient(135deg, rgba(1, 112, 239, 0.20) 0%, rgba(1, 90, 200, 0.26) 100%);
border-color: rgba(1, 112, 239, 0.5);
box-shadow: 0 6px 24px rgba(1, 112, 239, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.15);
}
.qobuz-enrich-button.active .qobuz-enrich-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(1, 112, 239, 0.6)) invert(1);
}
.qobuz-enrich-button.complete {
background: linear-gradient(135deg, rgba(76, 175, 80, 0.15) 0%, rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow: 0 4px 16px rgba(76, 175, 80, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.qobuz-enrich-button.complete .qobuz-enrich-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5)) invert(1);
}
.qobuz-enrich-button.complete .qobuz-enrich-spinner {
opacity: 0;
}
.qobuz-enrich-button.paused {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.12) 0%, rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow: 0 4px 16px rgba(255, 193, 7, 0.2), 0 2px 8px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.qobuz-enrich-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow: 0 6px 20px rgba(255, 193, 7, 0.3), 0 3px 12px rgba(0, 0, 0, 0.2);
}
@keyframes qobuz-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.qobuz-enrich-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.qobuz-enrich-button:hover+.qobuz-enrich-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.qobuz-enrich-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg, rgba(30, 30, 30, 0.98) 0%, rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(1, 112, 239, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(1, 112, 239, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.qobuz-enrich-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(1, 112, 239, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.qobuz-enrich-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#qobuz-enrich-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.qobuz-enrich-button.paused+.qobuz-enrich-tooltip #qobuz-enrich-tooltip-status {
color: #ffc107;
}
.qobuz-enrich-button.no-auth {
background: linear-gradient(135deg,
rgba(120, 120, 120, 0.08) 0%,
rgba(80, 80, 80, 0.12) 100%);
border-color: rgba(120, 120, 120, 0.25);
box-shadow:
0 4px 16px rgba(0, 0, 0, 0.15),
0 2px 8px rgba(0, 0, 0, 0.1),
inset 0 1px 0 rgba(255, 255, 255, 0.04);
opacity: 0.5;
cursor: not-allowed;
}
.qobuz-enrich-button.no-auth .qobuz-enrich-logo {
filter: grayscale(1) opacity(0.4) invert(1);
}
.qobuz-enrich-button.no-auth .qobuz-enrich-spinner {
display: none;
}
.qobuz-enrich-button.no-auth:hover {
border-color: rgba(120, 120, 120, 0.35);
box-shadow:
0 6px 20px rgba(0, 0, 0, 0.2),
0 3px 12px rgba(0, 0, 0, 0.15);
opacity: 0.55;
}
.qobuz-enrich-button.no-auth+.qobuz-enrich-tooltip #qobuz-enrich-tooltip-status {
color: rgba(120, 120, 120, 0.8);
}
.qobuz-enrich-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(1, 112, 239, 0.3);
}
.qobuz-enrich-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ========================================
HYDRABASE P2P MIRROR WORKER BUTTON
======================================== */
.hydrabase-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
.hydrabase-button {
position: relative;
width: 44px;
height: 44px;
border-radius: 50%;
border: 2px solid rgba(255, 255, 255, 0.25);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.08) 0%, rgba(255, 255, 255, 0.04) 100%);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
overflow: visible;
padding: 0;
}
.hydrabase-button:hover {
transform: scale(1.05);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%);
border-color: rgba(255, 255, 255, 0.4);
box-shadow: 0 0 15px rgba(255, 255, 255, 0.15);
}
.hydrabase-button:active {
transform: scale(0.95);
}
.hydrabase-worker-logo {
width: 24px;
height: 24px;
opacity: 0.85;
filter: brightness(0) invert(1);
transition: opacity 0.3s ease;
z-index: 1;
}
.hydrabase-spinner {
position: absolute;
top: -2px;
left: -2px;
width: 44px;
height: 44px;
border: 2px solid transparent;
border-top-color: rgba(255, 255, 255, 0.6);
border-right-color: rgba(255, 255, 255, 0.3);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Active state — white spinning */
.hydrabase-button.active .hydrabase-spinner {
opacity: 1;
animation: hydrabase-spin 1.2s linear infinite;
}
.hydrabase-button.active {
background: linear-gradient(135deg, rgba(255, 255, 255, 0.22) 0%, rgba(255, 255, 255, 0.10) 100%);
border-color: rgba(255, 255, 255, 0.5);
box-shadow: 0 0 20px rgba(255, 255, 255, 0.15), inset 0 0 10px rgba(255, 255, 255, 0.05);
}
.hydrabase-button.active .hydrabase-worker-logo {
opacity: 1;
}
/* Paused state — yellow/orange */
.hydrabase-button.paused {
background: linear-gradient(135deg, rgba(255, 193, 7, 0.18) 0%, rgba(255, 152, 0, 0.10) 100%);
border-color: rgba(255, 193, 7, 0.45);
box-shadow: 0 0 15px rgba(255, 193, 7, 0.1);
}
.hydrabase-button.paused .hydrabase-worker-logo {
opacity: 0.7;
filter: brightness(0) invert(1) sepia(1) saturate(5) hue-rotate(15deg);
}
.hydrabase-button.paused .hydrabase-spinner {
opacity: 0;
}
@keyframes hydrabase-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* Tooltip */
.hydrabase-tooltip {
position: absolute;
top: calc(100% + 8px);
left: 50%;
transform: translateX(-50%);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: opacity 0.2s ease, visibility 0.2s ease;
pointer-events: none;
}
.hydrabase-button-container:hover .hydrabase-tooltip {
opacity: 1;
visibility: visible;
}
.hydrabase-tooltip-content {
min-width: 180px;
background: rgba(30, 30, 30, 0.98);
border: 1px solid rgba(255, 255, 255, 0.25);
border-radius: 10px;
padding: 12px 14px;
backdrop-filter: blur(20px);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
}
.hydrabase-tooltip-header {
font-weight: 600;
font-size: 12px;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 6px;
letter-spacing: 0.3px;
}
.hydrabase-tooltip-body {
font-size: 11px;
color: rgba(255, 255, 255, 0.7);
}
.hydrabase-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(255, 255, 255, 0.25);
}
.hydrabase-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ============================================================================
LIBRARY REPAIR WORKER STATUS BUTTON
============================================================================ */
/* Rainbow color animation */
@keyframes rainbow-glow {
0% { box-shadow: 0 4px 16px rgba(255, 0, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(255, 0, 0, 0.4); }
17% { box-shadow: 0 4px 16px rgba(255, 136, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(255, 136, 0, 0.4); }
33% { box-shadow: 0 4px 16px rgba(255, 255, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(255, 255, 0, 0.4); }
50% { box-shadow: 0 4px 16px rgba(0, 255, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(0, 255, 0, 0.4); }
67% { box-shadow: 0 4px 16px rgba(0, 136, 255, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(0, 136, 255, 0.4); }
83% { box-shadow: 0 4px 16px rgba(136, 0, 255, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(136, 0, 255, 0.4); }
100% { box-shadow: 0 4px 16px rgba(255, 0, 0, 0.3), 0 2px 8px rgba(0, 0, 0, 0.15); border-color: rgba(255, 0, 0, 0.4); }
}
@keyframes rainbow-border {
0% { border-color: rgba(255, 0, 0, 0.5); }
17% { border-color: rgba(255, 136, 0, 0.5); }
33% { border-color: rgba(255, 255, 0, 0.5); }
50% { border-color: rgba(0, 255, 0, 0.5); }
67% { border-color: rgba(0, 136, 255, 0.5); }
83% { border-color: rgba(136, 0, 255, 0.5); }
100% { border-color: rgba(255, 0, 0, 0.5); }
}
@keyframes rainbow-spinner {
0% { border-top-color: rgba(255, 0, 0, 0.8); border-right-color: rgba(255, 136, 0, 0.5); }
17% { border-top-color: rgba(255, 136, 0, 0.8); border-right-color: rgba(255, 255, 0, 0.5); }
33% { border-top-color: rgba(255, 255, 0, 0.8); border-right-color: rgba(0, 255, 0, 0.5); }
50% { border-top-color: rgba(0, 255, 0, 0.8); border-right-color: rgba(0, 136, 255, 0.5); }
67% { border-top-color: rgba(0, 136, 255, 0.8); border-right-color: rgba(136, 0, 255, 0.5); }
83% { border-top-color: rgba(136, 0, 255, 0.8); border-right-color: rgba(255, 0, 0, 0.5); }
100% { border-top-color: rgba(255, 0, 0, 0.8); border-right-color: rgba(255, 136, 0, 0.5); }
}
@keyframes repair-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Container */
.repair-button-container {
position: relative;
display: inline-block;
margin-right: 12px;
}
/* Base Button */
.repair-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(180, 130, 255, 0.12) 0%,
rgba(130, 80, 220, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(180, 130, 255, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(180, 130, 255, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.repair-button:hover {
background: linear-gradient(135deg,
rgba(180, 130, 255, 0.18) 0%,
rgba(130, 80, 220, 0.25) 100%);
border-color: rgba(180, 130, 255, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(180, 130, 255, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.repair-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(180, 130, 255, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
/* Logo */
.repair-logo {
width: 24px;
height: 24px;
object-fit: cover;
border-radius: 50%;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.repair-button:hover .repair-logo {
opacity: 1;
}
/* Spinner Ring */
.repair-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(180, 130, 255, 0.8);
border-right-color: rgba(180, 130, 255, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Active State — Rainbow! */
.repair-button.active .repair-spinner {
opacity: 1;
animation: repair-spin 1.2s linear infinite, rainbow-spinner 3s linear infinite;
}
.repair-button.active {
animation: rainbow-glow 3s linear infinite;
background: linear-gradient(135deg,
rgba(180, 130, 255, 0.22) 0%,
rgba(130, 80, 220, 0.28) 100%);
}
.repair-button.active .repair-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(180, 130, 255, 0.6));
}
/* Complete/Idle State */
.repair-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.repair-button.complete .repair-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.repair-button.complete .repair-spinner {
opacity: 0;
}
/* Paused State */
.repair-button.paused {
background: linear-gradient(135deg,
rgba(255, 193, 7, 0.12) 0%,
rgba(255, 152, 0, 0.18) 100%);
border-color: rgba(255, 193, 7, 0.35);
box-shadow:
0 4px 16px rgba(255, 193, 7, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.repair-button.paused:hover {
border-color: rgba(255, 193, 7, 0.5);
box-shadow:
0 6px 20px rgba(255, 193, 7, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2);
}
/* ============================================================================
REPAIR WORKER HOVER TOOLTIP
============================================================================ */
.repair-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.repair-button:hover+.repair-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.repair-tooltip-content {
min-width: 280px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(180, 130, 255, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(180, 130, 255, 0.25),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.repair-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(180, 130, 255, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.repair-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#repair-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
.repair-button.paused+.repair-tooltip #repair-tooltip-status {
color: #ffc107;
}
/* Tooltip Arrow */
.repair-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(180, 130, 255, 0.3);
}
.repair-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* ============================================================================
SOULID WORKER BUTTON + TOOLTIP
Uses SoulSync logo (whisoul.png) with rainbow spinner like repair worker
============================================================================ */
.soulid-button-container {
position: relative;
display: flex;
align-items: center;
}
.soulid-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(29, 185, 84, 0.12) 0%,
rgba(100, 80, 220, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(29, 185, 84, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(29, 185, 84, 0.15),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.soulid-button:hover {
background: linear-gradient(135deg,
rgba(29, 185, 84, 0.18) 0%,
rgba(100, 80, 220, 0.25) 100%);
border-color: rgba(29, 185, 84, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(29, 185, 84, 0.25),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.soulid-button:active {
transform: scale(0.95);
}
.soulid-logo {
width: 24px;
height: 24px;
object-fit: cover;
border-radius: 50%;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.soulid-button:hover .soulid-logo {
opacity: 1;
}
.soulid-spinner {
position: absolute;
width: 44px;
height: 44px;
border: 3px solid transparent;
border-top-color: rgba(29, 185, 84, 0.8);
border-right-color: rgba(100, 80, 220, 0.5);
border-radius: 50%;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Active State — Rainbow spinner */
.soulid-button.active .soulid-spinner {
opacity: 1;
animation: repair-spin 1.2s linear infinite, rainbow-spinner 3s linear infinite;
}
.soulid-button.active {
animation: rainbow-glow 3s linear infinite;
background: linear-gradient(135deg,
rgba(29, 185, 84, 0.22) 0%,
rgba(100, 80, 220, 0.28) 100%);
}
.soulid-button.active .soulid-logo {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(29, 185, 84, 0.6));
}
/* Complete/Idle State */
.soulid-button.complete {
background: linear-gradient(135deg,
rgba(76, 175, 80, 0.15) 0%,
rgba(56, 142, 60, 0.20) 100%);
border-color: rgba(76, 175, 80, 0.35);
box-shadow:
0 4px 16px rgba(76, 175, 80, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
.soulid-button.complete .soulid-logo {
opacity: 0.85;
filter: drop-shadow(0 0 6px rgba(76, 175, 80, 0.5));
}
.soulid-button.complete .soulid-spinner {
opacity: 0;
}
/* Tooltip */
.soulid-tooltip {
position: absolute;
left: 50%;
top: calc(100% + 12px);
transform: translateX(-50%) translateY(-5px);
z-index: 1000;
opacity: 0;
visibility: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.soulid-button:hover+.soulid-tooltip {
opacity: 1;
visibility: visible;
transform: translateX(-50%) translateY(0);
}
.soulid-tooltip-content {
min-width: 260px;
background: linear-gradient(135deg,
rgba(30, 30, 30, 0.98) 0%,
rgba(20, 20, 20, 0.99) 100%);
backdrop-filter: blur(40px) saturate(1.6);
-webkit-backdrop-filter: blur(40px) saturate(1.6);
border: 1px solid rgba(29, 185, 84, 0.3);
border-radius: 16px;
padding: 16px 18px;
box-shadow:
0 12px 40px rgba(0, 0, 0, 0.5),
0 6px 20px rgba(29, 185, 84, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.1);
}
.soulid-tooltip-header {
font-family: 'SF Pro Display', -apple-system, sans-serif;
font-size: 13px;
font-weight: 600;
color: rgba(29, 185, 84, 0.95);
letter-spacing: -0.2px;
margin-bottom: 12px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.soulid-tooltip-body {
display: flex;
flex-direction: column;
gap: 8px;
}
#soulid-tooltip-status {
color: rgb(var(--accent-light-rgb));
font-weight: 600;
}
/* Tooltip Arrow */
.soulid-tooltip-content::before {
content: '';
position: absolute;
left: 50%;
top: -8px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(29, 185, 84, 0.3);
}
.soulid-tooltip-content::after {
content: '';
position: absolute;
left: 50%;
top: -7px;
transform: translateX(-50%);
width: 0;
height: 0;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 8px solid rgba(30, 30, 30, 0.98);
}
/* MusicBrainz Integration */
.release-card {
position: relative !important;
/* Ensure positioning context */
}
.mb-link-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 6px 12px;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 6px;
color: #fff;
text-decoration: none;
font-size: 13px;
font-weight: 500;
transition: all 0.2s ease;
margin-left: 10px;
cursor: pointer;
vertical-align: middle;
}
.mb-link-btn:hover {
background: rgba(186, 71, 143, 0.4);
/* MusicBrainz Purple-ish */
border-color: rgba(186, 71, 143, 0.6);
transform: translateY(-1px);
}
.mb-link-btn img,
.mb-link-btn svg {
width: 16px;
height: 16px;
margin-right: 6px;
vertical-align: middle;
}
/* Legacy .mb-card-icon override removed — now handled by .source-card-icon inside .card-badge-container */
/* Badge container for artist cards */
.card-badge-container {
position: absolute;
top: 8px;
align-items: flex-end;
right: 8px;
display: flex;
flex-direction: column;
gap: 3px;
z-index: 100;
}
.source-card-icon {
width: 24px;
height: 24px;
background: rgba(0, 0, 0, 0.75);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.9 !important;
transition: transform 0.2s;
cursor: pointer;
color: white;
font-size: 9px;
font-weight: 800;
flex-shrink: 0;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
/* Invert dark SVG logos on library artist cards (Tidal and Qobuz) */
.library-artist-card .source-card-icon[title="Tidal"] img,
.library-artist-card .source-card-icon[title="Qobuz"] img {
filter: invert(1);
}
.source-card-icon:hover {
transform: scale(1.1);
opacity: 1 !important;
}
.mb-card-icon:hover {
transform: scale(1.1);
background: #d466a9;
opacity: 1 !important;
}
.deezer-card-icon:hover {
background: #a238ff;
}
.audiodb-card-icon:hover {
background: #1a6bc4;
}
.spotify-card-icon:hover {
background: #1db954;
}
.itunes-card-icon:hover {
background: #fc3c44;
}
.lastfm-card-icon:hover {
background: #d51007;
}
.genius-card-icon:hover {
background: #ffff64;
}
.tidal-card-icon:hover {
background: #000000;
}
.qobuz-card-icon:hover {
background: #0170ef;
}
.tidal-card-icon img,
.qobuz-card-icon img {
filter: invert(1);
}
/* Two-column badge layout for overflow */
.card-badge-container:has(.badge-overflow-column) {
flex-direction: row;
gap: 3px;
align-items: flex-start;
}
.badge-primary-column,
.badge-overflow-column {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 3px;
}
.badge-overflow-column {
width: 24px;
flex-shrink: 0;
}
.watch-card-icon {
cursor: pointer;
font-size: 10px;
white-space: nowrap;
width: 24px !important;
height: 24px !important;
padding: 0 !important;
align-self: flex-end;
overflow: hidden;
transition: width 0.25s ease, padding 0.25s ease;
}
.watch-icon-emoji {
flex-shrink: 0;
}
.watch-icon-label {
opacity: 0;
max-width: 0;
overflow: hidden;
transition: opacity 0.2s ease 0.05s, max-width 0.25s ease;
}
.library-artist-card:hover .watch-card-icon {
width: auto !important;
padding: 3px 7px !important;
}
.library-artist-card:hover .watch-icon-label {
opacity: 1;
max-width: 60px;
margin-left: 2px;
}
.watch-card-icon.watched {
background: rgba(255, 193, 7, 0.2);
border-color: rgba(255, 193, 7, 0.4);
}
.watch-card-icon:hover {
background: rgba(255, 193, 7, 0.35);
}
/* Artist detail page source link buttons */
.source-link-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 16px;
margin-left: 12px;
border-radius: 20px;
text-decoration: none;
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
backdrop-filter: blur(8px);
transition: all 0.2s ease;
vertical-align: middle;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
}
.source-link-btn:hover {
background: rgba(255, 255, 255, 0.15);
border-color: rgba(255, 255, 255, 0.25);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.source-link-btn img {
height: 20px;
width: auto;
display: inline-block;
vertical-align: middle;
}
.source-link-btn span {
vertical-align: middle;
}
@media (max-width: 768px) {
.source-link-btn {
padding: 4px 10px;
margin-left: 6px;
font-size: 0;
}
.source-link-btn img {
height: 18px;
}
.source-link-btn span {
display: none;
}
}
.watchlist-card-icon {
position: absolute;
right: 8px;
width: 28px;
height: 28px;
background: rgba(0, 0, 0, 0.75);
border: 1px solid rgba(var(--accent-rgb), 0.4);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.9;
z-index: 100;
font-size: 14px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
pointer-events: none;
}
.library-card-watchlist-btn {
position: absolute;
right: 8px;
display: flex;
align-items: center;
gap: 4px;
padding: 4px 10px;
background: rgba(0, 0, 0, 0.75);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 12px;
color: #e0e0e0;
font-size: 11px;
font-weight: 600;
font-family: 'SF Pro Text', -apple-system, BlinkMacSystemFont, sans-serif;
cursor: pointer;
z-index: 100;
transition: opacity 0.2s ease, transform 0.2s ease;
opacity: 0;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
}
.library-artist-card:hover .library-card-watchlist-btn {
opacity: 1;
}
.library-card-watchlist-btn:hover {
background: rgba(var(--accent-rgb), 0.25);
border-color: rgba(var(--accent-rgb), 0.4);
color: #fff;
transform: scale(1.05);
}
.library-card-watchlist-btn.watching {
background: rgba(255, 193, 7, 0.2);
color: #ffc107;
border-color: rgba(255, 193, 7, 0.4);
opacity: 1;
}
.library-card-watchlist-btn.watching:hover {
background: rgba(255, 193, 7, 0.35);
border-color: rgba(255, 193, 7, 0.6);
color: #fff;
}
.library-card-watchlist-btn:disabled {
opacity: 0.5;
cursor: wait;
transform: none;
}
.library-card-watchlist-btn .watchlist-icon {
font-size: 12px;
}
.library-card-watchlist-btn .watchlist-text {
line-height: 1;
}
/* ============================= */
/* IMPORT MODAL */
/* ============================= */
.import-button {
position: relative;
width: 44px;
height: 44px;
background: linear-gradient(135deg,
rgba(124, 58, 237, 0.12) 0%,
rgba(99, 39, 196, 0.18) 100%);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
border: 1.5px solid rgba(124, 58, 237, 0.25);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow:
0 4px 16px rgba(124, 58, 237, 0.2),
0 2px 8px rgba(0, 0, 0, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
padding: 0;
}
.import-button:hover {
background: linear-gradient(135deg,
rgba(124, 58, 237, 0.18) 0%,
rgba(99, 39, 196, 0.25) 100%);
border-color: rgba(124, 58, 237, 0.4);
transform: scale(1.05);
box-shadow:
0 6px 20px rgba(124, 58, 237, 0.3),
0 3px 12px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.12);
}
.import-button:active {
transform: scale(0.95);
box-shadow:
0 2px 8px rgba(124, 58, 237, 0.15),
inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.import-logo {
width: 22px;
height: 22px;
object-fit: contain;
opacity: 0.85;
transition: opacity 0.3s ease;
filter: invert(1) drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));
}
.import-button:hover .import-logo {
opacity: 1;
}
/* ========================================
IMPORT PAGE (full page, replaces modal)
======================================== */
/* ============================================================================
STATS PAGE
============================================================================ */
/* Stats page uses dashboard-container pattern for consistency */
.stats-container {
display: flex;
flex-direction: column;
gap: 20px;
padding: 28px 24px 30px;
overflow: hidden;
background: linear-gradient(135deg,
rgba(20, 20, 20, 0.55) 0%,
rgba(12, 12, 12, 0.62) 100%);
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-top: 1px solid rgba(255, 255, 255, 0.12);
margin: 20px;
box-shadow:
0 8px 32px rgba(0, 0, 0, 0.3),
0 4px 16px rgba(0, 0, 0, 0.2),
inset 0 1px 0 rgba(255, 255, 255, 0.08);
}
/* Header uses same pattern as .dashboard-header */
.stats-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px;
margin: -28px -24px 0 -24px;
position: relative;
overflow: hidden;
flex-wrap: wrap;
gap: 16px;
background: linear-gradient(180deg,
rgba(var(--accent-rgb), 0.10) 0%,
rgba(var(--accent-rgb), 0.04) 40%,
transparent 100%);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
border-top-left-radius: 24px;
border-top-right-radius: 24px;
}
.stats-header::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 50%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.03), transparent);
animation: stats-header-sweep 12s ease-in-out infinite;
}
@keyframes stats-header-sweep {
0%, 100% { left: -100%; }
50% { left: 150%; }
}
.stats-header-title {
display: flex;
align-items: center;
gap: 14px;
}
.stats-header-title h1 {
font-size: 28px;
font-weight: 700;
color: #fff;
margin: 0;
font-family: 'SF Pro Display', -apple-system, sans-serif;
}
/* Time range pills */
.stats-time-range {
display: flex;
gap: 4px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 3px;
}
.stats-range-btn {
padding: 7px 16px;
border: none;
border-radius: 8px;
background: transparent;
color: rgba(255, 255, 255, 0.5);
font-size: 0.82em;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
font-family: inherit;
}
.stats-range-btn:hover {
color: rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.04);
}
.stats-range-btn.active {
background: rgb(var(--accent-rgb));
color: #fff;
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.3);
}
.stats-header-controls {
display: flex;
align-items: center;
gap: 16px;
}
.stats-sync-controls {
display: flex;
align-items: center;
gap: 8px;
}
.stats-last-synced {
font-size: 0.72em;
color: rgba(255, 255, 255, 0.3);
}
.stats-sync-btn {
width: 32px;
height: 32px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.5);
font-size: 16px;
cursor: pointer;
transition: all 0.2s;
font-family: inherit;
display: flex;
align-items: center;
justify-content: center;
}
.stats-sync-btn:hover {
background: rgba(255, 255, 255, 0.08);
color: #fff;
border-color: rgba(255, 255, 255, 0.15);
}
.stats-sync-btn.syncing {
pointer-events: none;
color: transparent;
position: relative;
}
.stats-sync-btn.syncing::after {
content: '';
position: absolute;
width: 14px;
height: 14px;
border: 2px solid rgba(var(--accent-rgb), 0.2);
border-top-color: rgba(var(--accent-rgb), 0.8);
border-radius: 50%;
animation: stats-spin 0.8s linear infinite;
}
@keyframes stats-spin {
to { transform: rotate(360deg); }
}
/* Overview cards */
.stats-overview {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 14px;
}
.stats-card {
background: linear-gradient(135deg, rgba(20, 20, 20, 0.95) 0%, rgba(12, 12, 12, 0.98) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14px;
padding: 20px;
text-align: center;
position: relative;
overflow: hidden;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.stats-card::before {
content: '';
position: absolute;
top: 0;
left: 20%;
right: 20%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb), 0.5), transparent);
border-radius: 2px;
transition: all 0.3s;
}
.stats-card:hover {
transform: translateY(-3px);
border-color: rgba(var(--accent-rgb), 0.2);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4), 0 0 20px rgba(var(--accent-rgb), 0.08);
}
.stats-card:hover::before {
left: 10%;
right: 10%;
height: 3px;
box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.4);
}
.stats-card-value {
font-size: 2em;
font-weight: 700;
color: #fff;
line-height: 1.2;
margin-bottom: 6px;
font-family: 'SF Pro Display', -apple-system, sans-serif;
}
.stats-card-label {
font-size: 0.78em;
color: rgba(255, 255, 255, 0.45);
text-transform: uppercase;
letter-spacing: 0.06em;
font-weight: 600;
}
/* Main grid */
.stats-main-grid {
display: grid;
grid-template-columns: 1fr 360px;
gap: 20px;
min-width: 0;
}
.stats-left-col, .stats-right-col {
display: flex;
flex-direction: column;
gap: 20px;
min-width: 0;
}
.stats-two-col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
/* Section cards */
.stats-section-card {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 14px;
padding: 20px;
transition: border-color 0.2s;
min-width: 0;
overflow: hidden;
}
.stats-section-card:hover {
border-color: rgba(255, 255, 255, 0.1);
}
.stats-full-width {
/* No extra margin — container handles it */
}
.stats-section-title {
font-size: 0.78em;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.06em;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 16px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
/* Genre chart */
.stats-genre-chart-container {
display: flex;
align-items: center;
gap: 24px;
}
.stats-genre-chart-container canvas {
width: 180px !important;
height: 180px !important;
flex-shrink: 0;
}
.stats-genre-legend {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
}
.stats-genre-legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 0.82em;
color: rgba(255, 255, 255, 0.7);
}
.stats-genre-dot {
width: 10px;
height: 10px;
border-radius: 3px;
flex-shrink: 0;
}
.stats-genre-pct {
margin-left: auto;
color: rgba(255, 255, 255, 0.4);
font-variant-numeric: tabular-nums;
}
/* Top artists visual bubbles */
.stats-top-artists-visual {
margin-bottom: 16px;
padding-bottom: 14px;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.stats-artist-bubbles {
display: flex;
justify-content: space-around;
align-items: flex-end;
gap: 8px;
}
.stats-artist-bubble {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
min-width: 0;
flex: 1;
transition: transform 0.2s;
}
.stats-artist-bubble:hover {
transform: translateY(-3px);
}
.stats-bubble-img {
border-radius: 50%;
background-size: cover;
background-position: center;
background-color: rgba(255, 255, 255, 0.06);
border: 2px solid rgba(var(--accent-rgb), 0.2);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: border-color 0.2s, box-shadow 0.2s;
}
.stats-artist-bubble:hover .stats-bubble-img {
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.2);
}
.stats-bubble-img span {
font-size: 1.2em;
font-weight: 700;
color: rgba(255, 255, 255, 0.4);
}
.stats-bubble-bar-container {
width: 100%;
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
overflow: hidden;
}
.stats-bubble-bar {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgba(var(--accent-rgb), 0.4));
border-radius: 2px;
transition: width 0.5s ease;
}
.stats-bubble-name {
font-size: 0.7em;
color: rgba(255, 255, 255, 0.7);
font-weight: 500;
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
.stats-bubble-count {
font-size: 0.65em;
color: rgba(var(--accent-rgb), 0.7);
font-weight: 600;
}
/* Ranked lists */
.stats-ranked-list {
display: flex;
flex-direction: column;
gap: 4px;
max-height: 280px;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
}
.stats-ranked-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border-radius: 8px;
transition: background 0.15s;
cursor: default;
}
.stats-ranked-item:hover {
background: rgba(255, 255, 255, 0.04);
}
.stats-ranked-num {
font-size: 0.75em;
color: rgba(255, 255, 255, 0.25);
font-weight: 700;
width: 18px;
text-align: right;
flex-shrink: 0;
}
.stats-ranked-img {
width: 36px;
height: 36px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.05);
}
.stats-ranked-info {
flex: 1;
min-width: 0;
}
.stats-ranked-name {
font-size: 0.88em;
color: rgba(255, 255, 255, 0.85);
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.stats-ranked-meta {
font-size: 0.72em;
color: rgba(255, 255, 255, 0.4);
}
.stats-ranked-count {
font-size: 0.78em;
color: rgba(var(--accent-rgb), 0.8);
font-weight: 600;
flex-shrink: 0;
font-variant-numeric: tabular-nums;
}
.stats-artist-link {
color: inherit;
text-decoration: none;
cursor: pointer;
transition: color 0.15s;
}
.stats-artist-link:hover {
color: rgb(var(--accent-rgb));
}
/* Play buttons */
.stats-play-btn {
width: 28px;
height: 28px;
border-radius: 50%;
border: none;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
font-size: 10px;
cursor: pointer;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
opacity: 0;
}
.stats-ranked-item:hover .stats-play-btn,
.stats-recent-item:hover .stats-play-btn {
opacity: 1;
}
.stats-play-btn:hover {
background: rgb(var(--accent-rgb));
color: #fff;
transform: scale(1.1);
}
.stats-play-btn-sm {
width: 22px;
height: 22px;
font-size: 8px;
}
/* Library health */
.stats-health-grid {
display: grid;
grid-template-columns: 2fr 1fr 1fr 1fr;
gap: 16px;
align-items: start;
}
.stats-health-item {
text-align: center;
}
.stats-health-item:first-child {
text-align: left;
}
.stats-health-value {
font-size: 1.6em;
font-weight: 700;
color: #fff;
line-height: 1.2;
margin-bottom: 4px;
}
.stats-health-label {
font-size: 0.75em;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.04em;
font-weight: 600;
}
/* Format breakdown bar */
.stats-format-bar {
display: flex;
height: 28px;
border-radius: 8px;
overflow: hidden;
margin-top: 8px;
background: rgba(255, 255, 255, 0.04);
}
.stats-format-segment {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.68em;
font-weight: 600;
color: #fff;
white-space: nowrap;
min-width: 30px;
transition: flex 0.5s ease;
}
/* Recent plays */
.stats-recent-list {
display: flex;
flex-direction: column;
gap: 4px;
max-height: 300px;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
}
.stats-recent-item {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 8px;
border-radius: 6px;
}
.stats-recent-item:hover {
background: rgba(255, 255, 255, 0.03);
}
.stats-recent-title {
flex: 1;
font-size: 0.85em;
color: rgba(255, 255, 255, 0.8);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.stats-recent-artist {
font-size: 0.78em;
color: rgba(255, 255, 255, 0.4);
flex-shrink: 0;
}
.stats-recent-time {
font-size: 0.72em;
color: rgba(255, 255, 255, 0.25);
flex-shrink: 0;
min-width: 65px;
text-align: right;
}
/* Enrichment coverage */
.stats-enrichment {
display: flex;
gap: 16px;
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
flex-wrap: wrap;
}
.stats-enrich-item {
flex: 1;
min-width: 120px;
display: flex;
align-items: center;
gap: 8px;
}
.stats-enrich-name {
font-size: 0.72em;
color: rgba(255, 255, 255, 0.45);
min-width: 70px;
font-weight: 500;
}
.stats-enrich-bar {
flex: 1;
height: 4px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
overflow: hidden;
}
.stats-enrich-fill {
height: 100%;
border-radius: 2px;
transition: width 0.5s ease;
}
.stats-enrich-pct {
font-size: 0.72em;
color: rgba(255, 255, 255, 0.4);
font-variant-numeric: tabular-nums;
min-width: 30px;
text-align: right;
}
/* Database Storage Chart */
.stats-db-storage-wrap {
display: flex;
align-items: center;
gap: 24px;
margin-top: 8px;
}
.stats-db-chart-container {
position: relative;
width: 180px;
height: 180px;
flex-shrink: 0;
}
.stats-db-chart-container canvas {
width: 180px !important;
height: 180px !important;
}
.stats-db-total {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
pointer-events: none;
}
.stats-db-total-value {
font-size: 20px;
font-weight: 700;
color: rgba(255, 255, 255, 0.85);
}
.stats-db-total-label {
font-size: 10px;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.stats-db-legend {
flex: 1;
display: flex;
flex-direction: column;
gap: 5px;
min-width: 0;
}
.stats-db-legend-item {
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
}
.stats-db-legend-dot {
width: 10px;
height: 10px;
border-radius: 3px;
flex-shrink: 0;
}
.stats-db-legend-name {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.stats-db-legend-size {
font-variant-numeric: tabular-nums;
color: rgba(255, 255, 255, 0.4);
font-size: 11px;
}
/* Stats empty state */
.stats-empty {
text-align: center;
padding: 80px 20px;
color: rgba(255, 255, 255, 0.5);
}
.stats-empty-icon {
font-size: 48px;
margin-bottom: 16px;
}
.stats-empty h3 {
font-size: 1.2em;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 8px;
}
.stats-empty p {
font-size: 0.88em;
max-width: 400px;
margin: 0 auto;
line-height: 1.5;
}
/* Mobile responsive */
@media (max-width: 768px) {
.stats-container {
margin: 10px;
padding: 16px;
}
.stats-overview {
grid-template-columns: repeat(2, 1fr);
}
.stats-main-grid {
grid-template-columns: 1fr;
}
.stats-health-grid {
grid-template-columns: 1fr 1fr;
}
.stats-genre-chart-container {
flex-direction: column;
}
.stats-two-col {
grid-template-columns: 1fr;
}
.stats-genre-chart-container canvas {
width: 150px !important;
height: 150px !important;
}
.stats-header {
flex-direction: column;
align-items: flex-start;
padding: 16px;
}
.stats-header-controls {
flex-direction: column;
align-items: flex-start;
gap: 10px;
width: 100%;
}
.stats-card-value {
font-size: 1.5em;
}
}
/* ============================================================================
IMPORT PAGE
============================================================================ */
.import-page-container {
max-width: 1200px;
margin: 0 auto;
padding: 24px 32px;
}
.import-page-header {
margin-bottom: 20px;
}
.import-page-title-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.import-page-title {
font-size: 28px;
font-weight: 700;
margin: 0;
letter-spacing: -0.3px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
display: flex;
align-items: center;
gap: 14px;
}
.import-page-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 50%, rgb(var(--accent-rgb)) 100%);
background-size: 200% 100%;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
animation: page-title-shimmer 6s ease-in-out infinite;
}
.import-page-refresh-btn {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
color: #ccc;
font-size: 13px;
cursor: pointer;
transition: all 0.2s;
}
.import-page-refresh-btn:hover {
background: rgba(255, 255, 255, 0.14);
color: #fff;
}
.import-page-staging-bar {
display: flex;
align-items: center;
gap: 16px;
padding: 10px 16px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
}
.import-staging-path {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.import-staging-stats {
color: rgb(var(--accent-light-rgb));
font-weight: 500;
white-space: nowrap;
}
/* Tab Bar */
.import-page-tab-bar {
display: flex;
gap: 4px;
margin-bottom: 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
padding-bottom: 0;
}
.import-page-tab {
padding: 10px 24px;
background: none;
border: none;
border-bottom: 2px solid transparent;
color: rgba(255, 255, 255, 0.5);
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
margin-bottom: -1px;
}
.import-page-tab:hover {
color: rgba(255, 255, 255, 0.8);
}
.import-page-tab.active {
color: rgb(var(--accent-light-rgb));
border-bottom-color: rgb(var(--accent-light-rgb));
}
.import-page-tab-content {
display: none;
}
.import-page-tab-content.active {
display: block;
}
/* Section labels */
.import-page-section-label {
font-size: 13px;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 500;
}
/* Search bar */
.import-page-search-bar {
display: flex;
gap: 8px;
margin-bottom: 20px;
position: relative;
}
.import-page-search-input {
flex: 1;
padding: 10px 16px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 10px;
color: #fff;
font-size: 14px;
outline: none;
transition: border-color 0.2s;
}
.import-page-search-input:focus {
border-color: rgba(var(--accent-light-rgb), 0.5);
}
.import-page-search-btn {
padding: 10px 20px;
background: rgb(var(--accent-light-rgb));
border: none;
border-radius: 10px;
color: #000;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
white-space: nowrap;
}
.import-page-search-btn:hover {
background: #1fdf64;
}
.import-page-clear-btn {
position: absolute;
right: 100px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: rgba(255, 255, 255, 0.4);
font-size: 16px;
cursor: pointer;
padding: 4px 8px;
}
.import-page-clear-btn:hover {
color: #fff;
}
/* Album grid */
.import-page-album-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 16px;
margin-bottom: 24px;
}
.import-page-album-card {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 12px;
cursor: pointer;
transition: all 0.2s;
text-align: center;
}
.import-page-album-card:hover {
background: rgba(255, 255, 255, 0.1);
border-color: rgba(var(--accent-light-rgb), 0.3);
transform: translateY(-2px);
}
.import-page-album-card img {
width: 100%;
aspect-ratio: 1;
object-fit: cover;
border-radius: 8px;
margin-bottom: 8px;
}
.import-page-album-card-title {
font-size: 13px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 2px;
}
.import-page-album-card-artist {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.import-page-album-card-meta {
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
margin-top: 4px;
}
/* Album hero (selected album) */
.import-page-album-hero {
display: flex;
gap: 20px;
padding: 20px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14px;
margin-bottom: 20px;
align-items: center;
}
.import-page-album-hero img {
width: 120px;
height: 120px;
border-radius: 10px;
object-fit: cover;
flex-shrink: 0;
}
.import-page-album-hero-info {
flex: 1;
min-width: 0;
}
.import-page-album-hero-title {
font-size: 22px;
font-weight: 700;
color: #fff;
margin-bottom: 4px;
}
.import-page-album-hero-artist {
font-size: 15px;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 4px;
}
.import-page-album-hero-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
}
/* Match header */
.import-page-match-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.import-page-match-header h3 {
font-size: 16px;
font-weight: 600;
color: #fff;
margin: 0;
}
.import-page-match-actions {
display: flex;
gap: 8px;
}
/* Match list */
.import-page-match-list {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 16px;
}
.import-page-match-row {
display: grid;
grid-template-columns: 36px 1fr 1fr 36px;
align-items: center;
gap: 12px;
padding: 10px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
min-height: 44px;
transition: all 0.2s;
}
.import-page-match-row.drag-over {
background: rgba(var(--accent-light-rgb), 0.08);
border-color: rgba(var(--accent-light-rgb), 0.4);
box-shadow: 0 0 12px rgba(var(--accent-light-rgb), 0.15);
}
.import-page-match-row.matched {
border-color: rgba(var(--accent-light-rgb), 0.2);
}
.import-page-match-num {
font-size: 13px;
color: rgba(255, 255, 255, 0.3);
text-align: center;
font-weight: 500;
}
.import-page-match-track {
font-size: 13px;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.import-page-match-file {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
display: flex;
align-items: center;
gap: 6px;
overflow: hidden;
}
.import-page-match-file.has-file {
color: rgb(var(--accent-light-rgb));
}
.import-page-match-file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.import-page-match-confidence {
font-size: 10px;
padding: 2px 6px;
border-radius: 4px;
background: rgba(var(--accent-light-rgb), 0.15);
color: rgb(var(--accent-light-rgb));
font-weight: 500;
white-space: nowrap;
}
.import-page-match-confidence.low {
background: rgba(255, 165, 0, 0.15);
color: #ffa500;
}
.import-page-match-drop-zone {
font-size: 11px;
color: rgba(255, 255, 255, 0.25);
font-style: italic;
}
.import-page-match-unmatch {
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 14px;
cursor: pointer;
padding: 4px;
border-radius: 4px;
transition: all 0.2s;
display: flex;
align-items: center;
justify-content: center;
}
.import-page-match-unmatch:hover {
color: #ff4444;
background: rgba(255, 68, 68, 0.1);
}
/* Unmatched file pool */
.import-page-unmatched-pool {
padding: 16px;
background: rgba(255, 255, 255, 0.02);
border: 1px dashed rgba(255, 255, 255, 0.1);
border-radius: 12px;
margin-bottom: 16px;
}
.import-page-pool-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 10px;
font-weight: 500;
}
.import-page-pool-chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.import-page-file-chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 20px;
font-size: 12px;
color: #ccc;
cursor: grab;
transition: all 0.2s;
user-select: none;
}
.import-page-file-chip:active {
cursor: grabbing;
}
.import-page-file-chip:hover {
background: rgba(255, 255, 255, 0.14);
border-color: rgba(var(--accent-light-rgb), 0.3);
color: #fff;
}
.import-page-file-chip.selected {
background: rgba(var(--accent-light-rgb), 0.15);
border-color: rgba(var(--accent-light-rgb), 0.4);
color: rgb(var(--accent-light-rgb));
}
.import-page-pool-empty {
font-size: 12px;
color: rgba(255, 255, 255, 0.2);
font-style: italic;
}
/* Match footer */
.import-page-match-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: 16px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.import-page-match-stats {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
}
/* Buttons */
.import-page-process-btn {
padding: 10px 24px;
background: rgb(var(--accent-light-rgb));
border: none;
border-radius: 10px;
color: #000;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s;
}
.import-page-process-btn:hover {
background: #1fdf64;
}
.import-page-process-btn:disabled {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.3);
cursor: not-allowed;
}
.import-page-secondary-btn {
padding: 8px 16px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
color: #ccc;
font-size: 13px;
cursor: pointer;
transition: all 0.2s;
}
.import-page-secondary-btn:hover {
background: rgba(255, 255, 255, 0.14);
color: #fff;
}
.import-page-back-btn {
padding: 8px 16px;
background: none;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
cursor: pointer;
transition: all 0.2s;
}
.import-page-back-btn:hover {
color: #fff;
border-color: rgba(255, 255, 255, 0.2);
}
/* Singles */
.import-page-singles-header {
display: flex;
align-items: center;
justify-content: flex-end;
margin-bottom: 16px;
}
.import-page-singles-actions {
display: flex;
gap: 8px;
align-items: center;
}
.import-page-singles-list {
display: flex;
flex-direction: column;
gap: 4px;
}
.import-page-single-item {
display: grid;
grid-template-columns: 32px 1fr auto;
align-items: center;
gap: 12px;
padding: 10px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
transition: all 0.2s;
}
.import-page-single-item.matched {
border-color: rgba(var(--accent-light-rgb), 0.2);
}
.import-page-single-checkbox {
width: 18px;
height: 18px;
border: 2px solid rgba(255, 255, 255, 0.2);
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
flex-shrink: 0;
}
.import-page-single-checkbox.checked {
background: rgb(var(--accent-light-rgb));
border-color: rgb(var(--accent-light-rgb));
}
.import-page-single-checkbox.checked::after {
content: '✓';
color: #000;
font-size: 12px;
font-weight: 700;
}
.import-page-single-info {
min-width: 0;
}
.import-page-single-filename {
font-size: 13px;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.import-page-single-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
margin-top: 2px;
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.import-page-single-matched-info {
font-size: 12px;
color: rgb(var(--accent-light-rgb));
margin-top: 4px;
display: flex;
align-items: center;
gap: 6px;
}
.import-page-single-matched-change {
color: rgba(255, 255, 255, 0.4);
cursor: pointer;
font-size: 11px;
text-decoration: underline;
}
.import-page-single-matched-change:hover {
color: #fff;
}
.import-page-single-actions {
display: flex;
gap: 6px;
align-items: center;
flex-shrink: 0;
}
.import-page-identify-btn {
padding: 6px 12px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 6px;
color: #ccc;
font-size: 12px;
cursor: pointer;
transition: all 0.2s;
display: flex;
align-items: center;
gap: 4px;
}
.import-page-identify-btn:hover {
background: rgba(255, 255, 255, 0.14);
color: #fff;
}
/* Inline search panel for singles */
.import-page-single-search-panel {
grid-column: 1 / -1;
padding: 12px 0 4px 44px;
}
.import-page-single-search-bar {
display: flex;
gap: 8px;
margin-bottom: 10px;
}
.import-page-single-search-input {
flex: 1;
padding: 8px 12px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
color: #fff;
font-size: 13px;
outline: none;
}
.import-page-single-search-input:focus {
border-color: rgba(var(--accent-light-rgb), 0.4);
}
.import-page-single-search-go {
padding: 8px 14px;
background: rgb(var(--accent-light-rgb));
border: none;
border-radius: 8px;
color: #000;
font-size: 13px;
font-weight: 600;
cursor: pointer;
}
.import-page-single-search-results {
display: flex;
flex-direction: column;
gap: 4px;
max-height: 200px;
overflow-y: auto;
}
.import-page-single-result-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
cursor: pointer;
transition: all 0.15s;
}
.import-page-single-result-item:hover {
background: rgba(var(--accent-light-rgb), 0.08);
border-color: rgba(var(--accent-light-rgb), 0.25);
}
.import-page-single-result-img {
width: 36px;
height: 36px;
border-radius: 4px;
object-fit: cover;
flex-shrink: 0;
}
.import-page-single-result-info {
flex: 1;
min-width: 0;
}
.import-page-single-result-name {
font-size: 13px;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.import-page-single-result-detail {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
}
.import-page-single-result-select {
padding: 4px 12px;
background: rgba(var(--accent-light-rgb), 0.15);
border: 1px solid rgba(var(--accent-light-rgb), 0.3);
border-radius: 6px;
color: rgb(var(--accent-light-rgb));
font-size: 11px;
font-weight: 600;
cursor: pointer;
flex-shrink: 0;
}
.import-page-single-result-select:hover {
background: rgba(var(--accent-light-rgb), 0.25);
}
/* Empty state */
.import-page-empty-state {
text-align: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.3);
font-size: 14px;
}
/* Suggestions */
.import-page-suggestions {
margin-bottom: 24px;
}
/* Processing Queue */
.import-page-queue {
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
background: rgba(255, 255, 255, 0.02);
overflow: hidden;
}
.import-page-queue-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.import-page-queue-title {
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.import-page-queue-clear {
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 12px;
cursor: pointer;
padding: 2px 8px;
}
.import-page-queue-clear:hover {
color: #fff;
}
.import-page-queue-list {
display: flex;
flex-direction: column;
}
.import-page-queue-item {
display: grid;
grid-template-columns: 44px 1fr auto;
gap: 12px;
align-items: center;
padding: 10px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.import-page-queue-item:last-child {
border-bottom: none;
}
.import-page-queue-art {
width: 44px;
height: 44px;
border-radius: 6px;
object-fit: cover;
}
.import-page-queue-info {
min-width: 0;
}
.import-page-queue-name {
font-size: 13px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.import-page-queue-detail {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
}
.import-page-queue-progress {
width: 120px;
flex-shrink: 0;
}
.import-page-queue-bar {
height: 4px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
overflow: hidden;
margin-bottom: 4px;
}
.import-page-queue-fill {
height: 100%;
background: rgb(var(--accent-light-rgb));
border-radius: 2px;
width: 0%;
transition: width 0.3s ease;
}
.import-page-queue-fill.error {
background: #ef4444;
}
.import-page-queue-status {
font-size: 10px;
color: rgba(255, 255, 255, 0.4);
text-align: right;
}
.import-page-queue-status.done {
color: rgb(var(--accent-light-rgb));
}
.import-page-queue-status.error {
color: #ef4444;
}
/* ========================================
END IMPORT PAGE
======================================== */
/* ========================================
FAILED DOWNLOAD ERROR TOOLTIP
======================================== */
.has-error-tooltip {
cursor: help;
text-decoration: underline dotted;
text-underline-offset: 3px;
}
#error-tooltip-popup {
position: fixed;
display: none;
min-width: 220px;
max-width: 480px;
padding: 10px 14px;
background: linear-gradient(135deg, rgba(30, 30, 30, 0.98), rgba(20, 20, 20, 0.99));
border: 1px solid rgba(244, 67, 54, 0.3);
border-radius: 10px;
color: rgba(255, 255, 255, 0.9);
font-size: 12px;
font-weight: 400;
white-space: normal;
text-align: left;
z-index: 100000;
pointer-events: none;
opacity: 0;
transition: opacity 0.2s ease;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
}
#error-tooltip-popup.visible {
display: block;
opacity: 1;
}
#error-tooltip-popup::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 6px solid transparent;
border-top-color: rgba(244, 67, 54, 0.3);
}
/* =====================================
SEARCH CANDIDATES MODAL
===================================== */
.has-candidates {
cursor: pointer !important;
text-decoration: underline dotted !important;
}
.has-candidates:hover {
color: rgb(var(--accent-rgb)) !important;
}
.candidates-modal-overlay {
position: fixed;
top: 0; left: 0;
width: 100vw; height: 100vh;
background: rgba(18, 18, 18, 0.85);
backdrop-filter: blur(12px);
z-index: 100001;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.candidates-modal-overlay.visible {
opacity: 1;
pointer-events: auto;
}
.candidates-modal {
background: linear-gradient(135deg, #1a1a1a 0%, #121212 100%);
border-radius: 16px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
width: 90%;
max-width: 95vw;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 25px 80px rgba(0, 0, 0, 0.7);
transform: scale(0.95);
transition: transform 0.3s ease;
}
.candidates-modal-overlay.visible .candidates-modal {
transform: scale(1);
}
.candidates-modal-header {
padding: 20px 28px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
justify-content: space-between;
align-items: center;
}
.candidates-modal-title {
color: #fff;
font-size: 20px;
font-weight: 700;
margin: 0;
}
.candidates-modal-subtitle {
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
margin-top: 4px;
}
.candidates-modal-close {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.8);
border: none;
border-radius: 50%;
width: 32px; height: 32px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.candidates-modal-close:hover {
background: rgba(255, 255, 255, 0.2);
color: #fff;
}
.candidates-modal-body {
padding: 20px 28px;
overflow-y: auto;
flex: 1;
}
.candidates-modal-body::-webkit-scrollbar { width: 8px; }
.candidates-modal-body::-webkit-scrollbar-track { background: rgba(255,255,255,0.05); border-radius: 4px; }
.candidates-modal-body::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb),0.3); border-radius: 4px; }
.candidates-error-summary {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 12px 16px;
color: rgba(255, 255, 255, 0.7);
font-size: 13px;
margin-bottom: 16px;
line-height: 1.5;
word-break: break-word;
}
.candidates-count {
color: rgba(255, 255, 255, 0.5);
font-size: 13px;
margin-bottom: 12px;
}
.candidates-table-wrapper { overflow-x: auto; }
.candidates-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
table-layout: fixed;
}
.candidates-table thead th {
color: rgba(255, 255, 255, 0.5);
font-weight: 600;
text-transform: uppercase;
font-size: 11px;
letter-spacing: 0.5px;
padding: 8px 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
text-align: left;
white-space: nowrap;
}
.candidates-table tbody tr {
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
transition: background 0.15s ease;
}
.candidates-table tbody tr:hover {
background: rgba(var(--accent-rgb), 0.05);
}
.candidates-table td {
padding: 10px 12px;
color: rgba(255, 255, 255, 0.85);
vertical-align: middle;
}
.candidates-col-index { color: rgba(255,255,255,0.3); width: 32px; text-align: center; }
.candidates-col-file { width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.candidates-col-quality { width: 110px; white-space: nowrap; }
.candidates-col-size { width: 70px; white-space: nowrap; }
.candidates-col-duration { width: 60px; white-space: nowrap; }
.candidates-col-user { width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.candidates-col-action { width: 44px; text-align: center; padding: 6px 4px !important; }
.candidates-quality-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.5px;
margin-right: 4px;
}
.candidates-quality-flac { background: rgba(var(--accent-rgb),0.2); color: rgb(var(--accent-rgb)); }
.candidates-quality-mp3 { background: rgba(100,149,237,0.2); color: #6495ed; }
.candidates-quality-ogg, .candidates-quality-aac, .candidates-quality-wma { background: rgba(255,165,0,0.2); color: #ffa500; }
.candidates-download-btn {
background: rgba(var(--accent-rgb), 0.15);
border: 1px solid rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-rgb));
border-radius: 6px;
width: 30px; height: 30px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
display: inline-flex;
align-items: center;
justify-content: center;
}
.candidates-download-btn:hover {
background: rgba(var(--accent-rgb), 0.3);
border-color: rgb(var(--accent-rgb));
}
/* =====================================
HYDRABASE PAGE
===================================== */
.hydrabase-container {
display: flex;
gap: 24px;
height: calc(100% - 80px);
}
.hydrabase-panel {
flex: 1;
display: flex;
flex-direction: column;
gap: 16px;
min-width: 0;
}
.hydrabase-panel h3 {
margin: 0 0 4px 0;
color: #fff;
font-size: 16px;
font-weight: 600;
}
.hydrabase-card {
background: linear-gradient(135deg, rgba(35, 35, 35, 0.6), rgba(20, 20, 20, 0.8));
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 16px;
}
.hydrabase-card h4 {
margin: 0 0 10px 0;
color: #ccc;
font-size: 14px;
font-weight: 500;
}
.hydrabase-input-group {
display: flex;
gap: 8px;
}
.hydrabase-input-group input {
flex: 1;
}
.hydrabase-icon {
width: 18px;
height: 18px;
filter: invert(1);
vertical-align: middle;
}
.hydra-payload {
width: 100%;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 8px;
padding: 10px;
color: #ccc;
font-family: 'Courier New', monospace;
font-size: 12px;
resize: vertical;
box-sizing: border-box;
}
.hydra-payload:focus {
border-color: rgba(var(--accent-rgb), 0.4);
outline: none;
}
.hydrabase-response-area {
flex: 1;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 16px;
font-family: 'Courier New', monospace;
font-size: 13px;
color: #aaa;
overflow-y: auto;
white-space: pre-wrap;
word-break: break-word;
}
/* ── Launch PIN Lock Screen ─────────────────────────────────────────── */
.launch-pin-overlay {
position: fixed;
inset: 0;
z-index: 1000000;
background: rgba(8, 8, 8, 0.97);
backdrop-filter: blur(24px);
display: flex;
align-items: center;
justify-content: center;
}
.launch-pin-container {
text-align: center;
max-width: 320px;
width: 100%;
padding: 40px 32px;
background: rgba(20, 20, 20, 0.8);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 20px;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5);
}
.launch-pin-icon {
font-size: 48px;
margin-bottom: 16px;
}
.launch-pin-title {
font-size: 22px;
font-weight: 800;
color: #fff;
margin: 0 0 6px;
letter-spacing: -0.3px;
}
.launch-pin-subtitle {
font-size: 13px;
color: rgba(255, 255, 255, 0.4);
margin: 0 0 24px;
}
.launch-pin-input {
width: 100%;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.06);
border: 1.5px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
color: #fff;
font-size: 18px;
font-weight: 600;
text-align: center;
letter-spacing: 4px;
outline: none;
transition: border-color 0.2s ease;
box-sizing: border-box;
font-family: inherit;
}
.launch-pin-input:focus {
border-color: rgba(var(--accent-rgb), 0.5);
}
.launch-pin-input::placeholder {
letter-spacing: normal;
font-weight: 400;
font-size: 14px;
color: rgba(255, 255, 255, 0.2);
}
.launch-pin-submit {
width: 100%;
margin-top: 12px;
padding: 12px;
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgba(var(--accent-rgb), 0.7));
border: none;
border-radius: 12px;
color: #fff;
font-size: 15px;
font-weight: 700;
cursor: pointer;
transition: all 0.2s ease;
font-family: inherit;
}
.launch-pin-submit:hover {
filter: brightness(1.1);
box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.3);
}
.launch-pin-submit:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.launch-pin-error {
margin: 12px 0 0;
font-size: 13px;
color: #ff5252;
font-weight: 600;
}
.launch-pin-forgot {
display: block;
margin: 16px auto 0;
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 12px;
cursor: pointer;
font-family: inherit;
transition: color 0.15s ease;
padding: 4px 8px;
}
.launch-pin-forgot:hover {
color: rgba(255, 255, 255, 0.6);
}
.launch-pin-container.shake {
animation: launchPinShake 0.4s ease;
}
@keyframes launchPinShake {
0%, 100% { transform: translateX(0); }
20% { transform: translateX(-10px); }
40% { transform: translateX(10px); }
60% { transform: translateX(-6px); }
80% { transform: translateX(6px); }
}
/* ── Profile Picker ─────────────────────────────────────────────── */
.profile-picker-overlay {
position: fixed;
inset: 0;
z-index: 99999;
background: linear-gradient(135deg, #0a0a1a 0%, #111827 50%, #0a0a1a 100%);
display: flex;
align-items: center;
justify-content: center;
animation: profileFadeIn 0.4s ease;
}
@keyframes profileFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.profile-picker-container {
text-align: center;
max-width: 700px;
width: 100%;
padding: 40px 20px;
}
.profile-picker-title {
font-size: 28px;
font-weight: 600;
color: #e5e7eb;
margin-bottom: 40px;
letter-spacing: -0.02em;
}
.profile-picker-grid {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 32px;
margin-bottom: 40px;
}
.profile-picker-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
cursor: pointer;
transition: transform 0.2s ease;
min-width: 100px;
}
.profile-picker-card:hover {
transform: scale(1.08);
}
.profile-picker-card:hover .profile-avatar {
box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.3);
}
.profile-avatar {
width: 80px;
height: 80px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 32px;
font-weight: 700;
color: #fff;
transition: box-shadow 0.2s ease;
user-select: none;
overflow: hidden;
position: relative;
}
.profile-avatar-img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: inherit;
}
.profile-picker-card .profile-name {
font-size: 14px;
color: #9ca3af;
font-weight: 500;
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.profile-picker-card .profile-badge {
font-size: 10px;
color: #6366f1;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.profile-picker-actions {
margin-top: 16px;
}
.profile-manage-btn {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.15);
color: #9ca3af;
padding: 10px 24px;
border-radius: 8px;
font-size: 13px;
cursor: pointer;
transition: all 0.2s ease;
}
.profile-manage-btn:hover {
border-color: rgba(255, 255, 255, 0.3);
color: #e5e7eb;
}
.profile-picker-cancel {
background: transparent;
border: none;
color: #6b7280;
padding: 10px 24px;
font-size: 13px;
cursor: pointer;
margin-top: 8px;
transition: color 0.2s ease;
}
.profile-picker-cancel:hover {
color: #e5e7eb;
}
/* PIN Dialog */
.profile-pin-dialog {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
z-index: 100000;
}
.profile-pin-content {
background: #1f2937;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 32px;
text-align: center;
min-width: 300px;
}
.profile-pin-avatar {
width: 60px;
height: 60px;
border-radius: 10px;
margin: 0 auto 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
font-weight: 700;
color: #fff;
overflow: hidden;
position: relative;
}
.profile-pin-name {
color: #e5e7eb;
font-size: 16px;
font-weight: 600;
margin-bottom: 20px;
}
.profile-pin-input {
width: 160px;
padding: 12px 16px;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 8px;
color: #e5e7eb;
font-size: 18px;
text-align: center;
letter-spacing: 8px;
outline: none;
}
.profile-pin-input::placeholder {
font-size: 13px;
letter-spacing: normal;
}
.profile-pin-input:focus {
border-color: #6366f1;
}
.profile-pin-buttons {
display: flex;
gap: 12px;
justify-content: center;
margin-top: 20px;
}
.profile-pin-cancel, .profile-pin-submit {
padding: 8px 20px;
border-radius: 8px;
font-size: 13px;
cursor: pointer;
border: none;
}
.profile-pin-cancel {
background: rgba(255, 255, 255, 0.1);
color: #9ca3af;
}
.profile-pin-submit {
background: #6366f1;
color: #fff;
}
.profile-pin-error {
color: #ef4444;
font-size: 13px;
margin-top: 12px;
}
/* Profile Management Panel */
.profile-manage-panel {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
z-index: 100000;
}
.profile-manage-content {
background: #1f2937;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
padding: 28px;
width: 420px;
max-height: 80vh;
overflow-y: auto;
}
.profile-manage-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.profile-manage-header h3 {
color: #e5e7eb;
font-size: 18px;
margin: 0;
}
.profile-manage-close-btn {
background: none;
border: none;
color: #9ca3af;
font-size: 24px;
cursor: pointer;
}
.profile-manage-list {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 24px;
}
.profile-manage-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
background: rgba(0, 0, 0, 0.2);
border-radius: 8px;
}
.profile-manage-item .profile-avatar {
width: 36px;
height: 36px;
border-radius: 8px;
font-size: 16px;
}
.profile-manage-item .profile-info {
flex: 1;
}
.profile-manage-item .profile-info .name {
color: #e5e7eb;
font-size: 14px;
font-weight: 500;
}
.profile-manage-item .profile-info .role {
color: #6366f1;
font-size: 11px;
text-transform: uppercase;
}
.profile-manage-actions {
display: flex;
gap: 4px;
align-items: center;
}
.profile-manage-item .profile-edit-btn,
.profile-manage-item .profile-delete-btn {
background: none;
border: none;
color: #6b7280;
font-size: 16px;
cursor: pointer;
padding: 4px 8px;
border-radius: 4px;
}
.profile-manage-item .profile-edit-btn:hover {
color: #6366f1;
background: rgba(99, 102, 241, 0.1);
}
.profile-manage-item .profile-delete-btn:hover {
color: #ef4444;
background: rgba(239, 68, 68, 0.1);
}
.profile-edit-form {
display: flex;
flex-direction: column;
gap: 10px;
padding: 12px;
background: rgba(99, 102, 241, 0.05);
border: 1px solid rgba(99, 102, 241, 0.2);
border-radius: 8px;
margin-top: 4px;
}
.profile-edit-buttons {
display: flex;
gap: 8px;
}
.profile-edit-buttons .profile-create-btn {
flex: 1;
}
.profile-edit-buttons .profile-picker-cancel {
flex: 1;
}
.profile-manage-add h4, .admin-pin-section h4 {
color: #e5e7eb;
font-size: 14px;
margin: 0 0 12px;
}
.profile-input {
width: 100%;
padding: 10px 14px;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: 8px;
font-size: 13px;
color: #e5e7eb;
font-size: 14px;
margin-bottom: 10px;
outline: none;
box-sizing: border-box;
}
.profile-input:focus {
border-color: #6366f1;
}
.profile-input::placeholder {
font-size: 12px;
}
.profile-color-picker {
display: flex;
gap: 8px;
margin-bottom: 10px;
flex-wrap: wrap;
}
.profile-color-swatch {
width: 28px;
height: 28px;
border-radius: 6px;
cursor: pointer;
border: 2px solid transparent;
transition: border-color 0.2s, transform 0.15s;
}
.profile-color-swatch:hover {
transform: scale(1.15);
}
.profile-color-swatch.selected {
border-color: #fff;
}
.profile-create-btn {
width: 100%;
padding: 10px;
background: #6366f1;
color: #fff;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s;
}
.profile-create-btn:hover {
background: #4f46e5;
}
.admin-pin-section {
margin-top: 20px;
padding-top: 16px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
}
.admin-pin-note {
color: #9ca3af;
font-size: 12px;
margin: 0 0 10px;
}
/* Profile Settings in Management Panel */
.profile-settings-section {
margin: 12px 0;
display: flex;
flex-direction: column;
gap: 8px;
}
.profile-settings-label {
color: #d1d5db;
font-size: 12px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 4px;
}
.profile-page-checkboxes {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px 12px;
}
.profile-page-checkboxes label {
display: flex;
align-items: center;
gap: 6px;
color: #d1d5db;
font-size: 13px;
cursor: pointer;
padding: 3px 0;
}
.profile-page-checkboxes label input[type="checkbox"] {
accent-color: rgba(var(--accent-rgb), 1);
cursor: pointer;
}
.profile-checkbox-label {
display: flex;
align-items: center;
gap: 6px;
color: #d1d5db;
font-size: 13px;
cursor: pointer;
padding: 4px 0;
}
.profile-checkbox-label input[type="checkbox"] {
accent-color: rgba(var(--accent-rgb), 1);
cursor: pointer;
}
/* Download-disabled state — hide download buttons globally */
body.downloads-disabled .download-result-btn,
body.downloads-disabled .download-btn,
body.downloads-disabled .download-button,
body.downloads-disabled .album-download-btn,
body.downloads-disabled .download-missing-btn,
body.downloads-disabled .enh-download-btn,
body.downloads-disabled .enh-download-all-btn,
body.downloads-disabled [onclick*="downloadTrack"],
body.downloads-disabled [onclick*="downloadAlbum"],
body.downloads-disabled [onclick*="startDownload"],
body.downloads-disabled [onclick*="startMissingTracksProcess"],
body.downloads-disabled [onclick*="startWishlistMissingTracksProcess"],
body.downloads-disabled [onclick*="DownloadMissing"]:not([onclick*="close"]) {
display: none !important;
}
/* Profile Indicator in Sidebar */
.profile-indicator {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
margin-top: 4px;
padding: 4px 8px;
border-radius: 6px;
transition: background 0.2s;
}
.profile-indicator:hover {
background: rgba(255, 255, 255, 0.08);
}
.profile-indicator-avatar {
width: 22px;
height: 22px;
border-radius: 5px;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
font-weight: 700;
color: #fff;
flex-shrink: 0;
overflow: hidden;
position: relative;
}
.profile-indicator-name {
font-size: 11px;
color: rgba(255, 255, 255, 0.7);
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* Personal Settings Trigger (gear icon) */
.personal-settings-trigger {
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
cursor: pointer;
padding: 2px;
margin-left: auto;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
flex-shrink: 0;
}
.personal-settings-trigger:hover {
color: rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.08);
transform: rotate(30deg);
}
/* Personal Settings Modal */
.personal-settings-overlay {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(8px);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
animation: ps-fade-in 0.2s ease;
}
@keyframes ps-fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
.personal-settings-container {
background: linear-gradient(145deg, rgba(28, 28, 32, 0.98), rgba(18, 18, 22, 0.99));
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
width: 90%;
max-width: 500px;
max-height: 85vh;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5);
animation: ps-slide-up 0.25s ease;
overflow: hidden;
display: flex;
flex-direction: column;
}
@keyframes ps-slide-up {
from { opacity: 0; transform: translateY(20px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.personal-settings-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 22px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.personal-settings-header h3 {
margin: 0;
font-size: 15px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
display: flex;
align-items: center;
gap: 8px;
}
.personal-settings-header h3 svg {
color: rgba(255, 255, 255, 0.5);
}
.personal-settings-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.4);
font-size: 22px;
cursor: pointer;
padding: 0 4px;
line-height: 1;
transition: color 0.2s;
}
.personal-settings-close:hover {
color: rgba(255, 255, 255, 0.9);
}
.personal-settings-body {
padding: 0;
overflow-y: auto;
flex: 1;
}
/* Tab bar within personal settings */
.ps-tabbar {
display: flex;
gap: 2px;
padding: 12px 22px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
background: rgba(0, 0, 0, 0.15);
}
.ps-tab {
padding: 8px 16px 10px;
border: none;
background: transparent;
color: rgba(255, 255, 255, 0.4);
font-size: 0.82em;
font-weight: 500;
font-family: inherit;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: all 0.2s;
white-space: nowrap;
}
.ps-tab:hover {
color: rgba(255, 255, 255, 0.7);
}
.ps-tab.active {
color: #fff;
border-bottom-color: var(--accent-color, #1db954);
font-weight: 600;
}
.ps-tab-content {
display: none;
padding: 18px 22px 22px;
}
.ps-tab-content.active {
display: block;
}
/* Section cards within Personal Settings */
.ps-section {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
padding: 16px 18px;
margin-bottom: 12px;
}
.ps-section:last-child { margin-bottom: 0; }
.ps-section-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 14px;
}
.ps-section-title {
font-size: 11px;
font-weight: 700;
letter-spacing: 0.5px;
text-transform: uppercase;
color: #eb743b;
margin: 0;
}
.ps-connection-badge {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
font-weight: 500;
}
.ps-connection-badge.connected {
color: rgb(var(--accent-rgb));
}
.ps-connection-badge.disconnected {
color: rgba(255, 255, 255, 0.35);
}
.ps-connection-dot {
width: 7px;
height: 7px;
border-radius: 50%;
flex-shrink: 0;
}
.ps-connection-badge.connected .ps-connection-dot {
background: rgb(var(--accent-rgb));
box-shadow: 0 0 6px rgba(var(--accent-rgb), 0.4);
}
.ps-connection-badge.disconnected .ps-connection-dot {
background: rgba(255, 255, 255, 0.25);
}
/* Connected State */
.ps-connected-info {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
background: rgba(var(--accent-rgb), 0.06);
border: 1px solid rgba(var(--accent-rgb), 0.12);
border-radius: 10px;
margin-bottom: 12px;
}
.ps-connected-icon {
font-size: 24px;
flex-shrink: 0;
}
.ps-connected-details {
flex: 1;
min-width: 0;
}
.ps-connected-username {
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
}
.ps-connected-server {
font-size: 10px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
}
.ps-connected-source {
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
font-style: italic;
margin-top: 2px;
}
/* Form Fields */
.ps-form-group {
margin-bottom: 12px;
}
.ps-form-group label {
display: block;
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.55);
margin-bottom: 5px;
letter-spacing: 0.2px;
}
.ps-form-group input {
width: 100%;
padding: 9px 12px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
color: rgba(255, 255, 255, 0.9);
font-size: 12px;
transition: all 0.25s ease;
box-sizing: border-box;
}
.ps-form-group input:focus {
outline: none;
border-color: rgba(235, 116, 59, 0.5);
background: rgba(235, 116, 59, 0.06);
box-shadow: 0 0 0 3px rgba(235, 116, 59, 0.1);
}
.ps-form-group input::placeholder {
color: rgba(255, 255, 255, 0.2);
}
.ps-help-text {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
margin-top: 4px;
}
.ps-help-text a {
color: #eb743b;
text-decoration: none;
}
.ps-help-text a:hover {
text-decoration: underline;
}
/* Buttons */
.ps-actions {
display: flex;
gap: 8px;
margin-top: 14px;
}
.ps-btn {
padding: 8px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
border: none;
transition: all 0.2s ease;
}
.ps-btn-primary {
background: #eb743b;
color: #fff;
}
.ps-btn-primary:hover {
background: #d4632f;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(235, 116, 59, 0.3);
}
.ps-btn-secondary {
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.7);
border: 1px solid rgba(255, 255, 255, 0.08);
}
.ps-btn-secondary:hover {
background: rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.9);
}
.ps-btn-danger {
background: rgba(239, 68, 68, 0.1);
color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.2);
}
.ps-btn-danger:hover {
background: rgba(239, 68, 68, 0.2);
}
.ps-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none !important;
}
/* Inline feedback */
.ps-inline-result {
margin-top: 10px;
padding: 8px 12px;
border-radius: 8px;
font-size: 11px;
font-weight: 500;
animation: ps-fade-in 0.2s ease;
}
.ps-inline-result.success {
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-rgb));
}
.ps-inline-result.error {
background: rgba(239, 68, 68, 0.08);
border: 1px solid rgba(239, 68, 68, 0.15);
color: #ef4444;
}
/* ListenBrainz empty state on Discover page */
.lb-empty-state {
text-align: center;
padding: 40px 24px;
background: rgba(255, 255, 255, 0.015);
border: 1px dashed rgba(255, 255, 255, 0.08);
border-radius: 16px;
margin: 8px 0;
}
.lb-empty-state .lb-empty-icon {
font-size: 40px;
margin-bottom: 12px;
}
.lb-empty-state h3 {
font-size: 16px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
margin: 0 0 8px 0;
}
.lb-empty-state p {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
margin: 0 0 16px 0;
max-width: 340px;
margin-left: auto;
margin-right: auto;
line-height: 1.5;
}
.lb-empty-state .lb-connect-btn {
background: #eb743b !important;
border-color: #eb743b !important;
color: #fff !important;
padding: 10px 24px !important;
font-size: 13px !important;
border-radius: 10px !important;
}
.lb-empty-state .lb-connect-btn:hover {
background: #d4632f !important;
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(235, 116, 59, 0.3);
}
.lb-empty-state .lb-empty-help {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
margin-top: 12px;
}
.lb-empty-state .lb-empty-help a {
color: #eb743b;
text-decoration: none;
}
.lb-empty-state .lb-empty-help a:hover {
text-decoration: underline;
}
/* ===========================
AUTOMATIONS PAGE
=========================== */
.automations-container { padding: 20px 24px; }
.automations-list { display: flex; flex-direction: column; gap: 0; }
/* --- Section Headers (System / My Automations) --- */
.automations-section {
margin-bottom: 8px;
}
.automations-section:last-child { margin-bottom: 0; }
.automations-section-header {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 2px 10px;
cursor: pointer;
user-select: none;
-webkit-user-select: none;
}
.automations-section-header:hover .section-label { color: rgba(255,255,255,0.85); }
.section-chevron {
font-size: 11px;
color: rgba(255,255,255,0.3);
transition: transform 0.25s ease;
width: 14px;
text-align: center;
flex-shrink: 0;
}
.automations-section.collapsed .section-chevron { transform: rotate(-90deg); }
.section-label {
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1px;
color: rgba(255,255,255,0.4);
transition: color 0.2s ease;
}
.section-count {
font-size: 10px;
color: rgba(255,255,255,0.25);
padding: 1px 8px;
border-radius: 8px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.06);
}
.section-line {
flex: 1;
height: 1px;
background: rgba(255,255,255,0.06);
}
.automations-section-body {
overflow: hidden;
transition: max-height 0.3s ease, opacity 0.25s ease;
max-height: 8000px;
opacity: 1;
}
.automations-section.collapsed .automations-section-body {
max-height: 0;
opacity: 0;
}
/* --- System Automations 2-Column Grid --- */
.automations-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
}
@media (max-width: 800px) {
.automations-grid { grid-template-columns: 1fr; }
}
/* --- New Automation Button (rainbow glow) --- */
@keyframes btn-rainbow-glow {
0% { box-shadow: 0 4px 18px rgba(255, 0, 100, 0.3), 0 2px 6px rgba(0,0,0,0.2); border-color: rgba(255, 0, 100, 0.35); }
20% { box-shadow: 0 4px 18px rgba(255, 140, 0, 0.3), 0 2px 6px rgba(0,0,0,0.2); border-color: rgba(255, 140, 0, 0.35); }
40% { box-shadow: 0 4px 18px rgba(0, 210, 120, 0.3), 0 2px 6px rgba(0,0,0,0.2); border-color: rgba(0, 210, 120, 0.35); }
60% { box-shadow: 0 4px 18px rgba(0, 140, 255, 0.3), 0 2px 6px rgba(0,0,0,0.2); border-color: rgba(0, 140, 255, 0.35); }
80% { box-shadow: 0 4px 18px rgba(160, 0, 255, 0.3), 0 2px 6px rgba(0,0,0,0.2); border-color: rgba(160, 0, 255, 0.35); }
100% { box-shadow: 0 4px 18px rgba(255, 0, 100, 0.3), 0 2px 6px rgba(0,0,0,0.2); border-color: rgba(255, 0, 100, 0.35); }
}
@keyframes btn-rainbow-glow-hover {
0% { box-shadow: 0 6px 28px rgba(255, 0, 100, 0.45), 0 3px 10px rgba(0,0,0,0.25); border-color: rgba(255, 0, 100, 0.5); }
20% { box-shadow: 0 6px 28px rgba(255, 140, 0, 0.45), 0 3px 10px rgba(0,0,0,0.25); border-color: rgba(255, 140, 0, 0.5); }
40% { box-shadow: 0 6px 28px rgba(0, 210, 120, 0.45), 0 3px 10px rgba(0,0,0,0.25); border-color: rgba(0, 210, 120, 0.5); }
60% { box-shadow: 0 6px 28px rgba(0, 140, 255, 0.45), 0 3px 10px rgba(0,0,0,0.25); border-color: rgba(0, 140, 255, 0.5); }
80% { box-shadow: 0 6px 28px rgba(160, 0, 255, 0.45), 0 3px 10px rgba(0,0,0,0.25); border-color: rgba(160, 0, 255, 0.5); }
100% { box-shadow: 0 6px 28px rgba(255, 0, 100, 0.45), 0 3px 10px rgba(0,0,0,0.25); border-color: rgba(255, 0, 100, 0.5); }
}
.auto-new-btn {
position: relative;
background: linear-gradient(135deg, rgba(255,255,255,0.10) 0%, rgba(255,255,255,0.04) 100%);
color: #fff;
border: 1.5px solid rgba(255,255,255,0.15);
padding: 10px 22px;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
letter-spacing: 0.3px;
animation: btn-rainbow-glow 6s linear infinite;
backdrop-filter: blur(12px);
}
.auto-new-btn:hover {
transform: translateY(-2px);
background: linear-gradient(135deg, rgba(255,255,255,0.16) 0%, rgba(255,255,255,0.08) 100%);
animation: btn-rainbow-glow-hover 4s linear infinite;
}
.auto-new-btn:active {
transform: translateY(0) scale(0.97);
}
/* --- Stats Summary Bar --- */
.automations-stats {
display: flex;
gap: 10px;
padding: 0 0 16px 0;
flex-wrap: wrap;
}
.auto-stat {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
border-radius: 10px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.06);
font-size: 12px;
color: rgba(255,255,255,0.5);
transition: all 0.2s ease;
}
.auto-stat:hover {
background: rgba(255,255,255,0.06);
border-color: rgba(255,255,255,0.1);
}
.auto-stat-value {
font-weight: 700;
color: rgb(var(--accent-light-rgb));
}
/* --- Automation Card --- */
.automation-card {
background: rgba(22, 22, 22, 0.95);
border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.07);
margin: 4px 0; padding: 10px 14px;
display: flex; align-items: center; gap: 10px;
transition: all 0.2s ease;
position: relative; overflow: hidden;
}
.automation-card:hover {
background: rgba(28, 28, 28, 0.98);
border-color: rgba(var(--accent-rgb), 0.2);
}
.automation-card.running {
border-color: rgba(var(--accent-rgb), 0.35);
box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.15), inset 0 0 12px rgba(var(--accent-rgb), 0.03);
animation: card-glow 2s ease-in-out infinite;
}
@keyframes card-glow {
0%, 100% { box-shadow: 0 0 12px rgba(var(--accent-rgb), 0.15), inset 0 0 12px rgba(var(--accent-rgb), 0.03); }
50% { box-shadow: 0 0 18px rgba(var(--accent-rgb), 0.25), inset 0 0 18px rgba(var(--accent-rgb), 0.05); }
}
.automation-card.disabled { opacity: 0.55; }
.automation-card.disabled:hover { opacity: 0.75; }
.automation-card.disabled .automation-name { color: rgba(255,255,255,0.5); }
.automation-card.system { border-left: none; padding: 8px 12px; }
.system-badge { display: inline-block; font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; padding: 1px 5px; border-radius: 6px; background: rgba(99,102,241,0.2); color: #818cf8; vertical-align: middle; }
.automation-status { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.automation-status.enabled { background: #4ade80; box-shadow: 0 0 6px rgba(74,222,128,0.4); }
.automation-status.disabled { background: #555; }
.automation-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.automation-name { font-size: 13px; font-weight: 600; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.automation-flow { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.flow-trigger, .flow-action, .flow-notify {
font-size: 11px; padding: 2px 8px; border-radius: 10px; white-space: nowrap;
}
.flow-trigger { background: rgba(var(--accent-rgb),0.12); color: rgb(var(--accent-light-rgb)); }
.flow-action { background: rgba(88,101,242,0.12); color: #7289da; }
.flow-notify { background: rgba(250,204,21,0.10); color: #fbbf24; }
.flow-arrow { color: rgba(255,255,255,0.25); font-size: 12px; }
.flow-delay { font-size: 10px; padding: 2px 6px; border-radius: 8px; white-space: nowrap; background: rgba(255,255,255,0.05); color: rgba(255,255,255,0.4); border: 1px dashed rgba(255,255,255,0.12); }
.day-picker { display: flex; gap: 4px; flex-wrap: wrap; }
.day-btn { background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.5); border: 1px solid rgba(255,255,255,0.12); border-radius: 8px; padding: 4px 10px; font-size: 12px; cursor: pointer; transition: all 0.2s ease; }
.day-btn:hover { background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.7); }
.day-btn.active { background: rgba(var(--accent-rgb), 0.2); color: rgb(var(--accent-light-rgb)); border-color: rgba(var(--accent-rgb), 0.4); }
.automation-meta { font-size: 10px; color: rgba(255,255,255,0.35); line-height: 1.3; }
.automation-actions { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }
.automation-run-btn, .automation-edit-btn, .automation-delete-btn, .automation-dupe-btn, .automation-group-btn {
background: transparent; border: 1px solid rgba(255,255,255,0.08);
border-radius: 6px; width: 26px; height: 26px;
display: flex; align-items: center; justify-content: center;
cursor: pointer; font-size: 12px; transition: all 0.2s ease; color: rgba(255,255,255,0.45);
}
.automation-run-btn:hover { background: rgba(var(--accent-rgb),0.2); border-color: rgba(var(--accent-rgb),0.4); color: rgb(var(--accent-light-rgb)); }
.automation-edit-btn:hover { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.2); color: #fff; }
.automation-delete-btn:hover { background: rgba(239,68,68,0.2); border-color: rgba(239,68,68,0.4); color: #ef4444; }
/* Automation toggle switch */
.automation-toggle { position: relative; display: inline-block; width: 32px; height: 18px; }
.automation-toggle input { opacity: 0; width: 0; height: 0; }
.automation-toggle .toggle-slider {
position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0;
width: auto; height: auto;
background: rgba(255,255,255,0.1); border-radius: 18px; transition: all 0.3s ease; border: 1px solid rgba(255,255,255,0.12);
box-shadow: none; z-index: auto;
}
.automation-toggle .toggle-slider::before {
content: ''; position: absolute; height: 12px; width: 12px; left: 2px; bottom: 2px;
background: rgba(255,255,255,0.6); border-radius: 50%; transition: all 0.3s ease;
transform: none;
}
.automation-toggle input:checked + .toggle-slider { background: rgba(var(--accent-rgb),0.5); border-color: rgba(var(--accent-rgb),0.5); }
.automation-toggle input:checked + .toggle-slider::before { transform: translateX(14px); background: rgb(var(--accent-light-rgb)); }
/* Only wrap card layout when output panel is present */
.automation-card:has(.automation-output) { flex-wrap: wrap; }
/* Automation progress output panel */
.automation-output {
width: 100%; max-height: 0; overflow: hidden;
transition: max-height 0.3s ease, padding 0.3s ease, margin 0.3s ease;
border-top: none; padding: 0; margin: 0;
}
.automation-output.visible {
max-height: 300px; padding: 8px 0 4px; margin-top: 6px;
border-top: 1px solid rgba(255,255,255,0.06);
}
.auto-progress-bar-wrap {
width: 100%; height: 3px; background: rgba(255,255,255,0.06);
border-radius: 3px; overflow: hidden; margin-bottom: 6px;
}
.auto-progress-bar {
height: 100%; border-radius: 3px;
background: linear-gradient(90deg, rgb(var(--accent-rgb)), rgb(var(--accent-light-rgb)));
transition: width 0.5s ease;
}
.automation-output.finished .auto-progress-bar { background: #4ade80; }
.automation-output.error .auto-progress-bar { background: #ef4444; }
.auto-progress-phase {
font-size: 10px; color: rgba(255,255,255,0.5);
margin-bottom: 4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.auto-progress-log {
max-height: 200px; overflow-y: auto;
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
font-size: 10px; line-height: 1.5;
scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.1) transparent;
}
.auto-log-line { padding: 1px 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.auto-log-line.success { color: #4ade80; }
.auto-log-line.error { color: #f87171; }
.auto-log-line.skip { color: rgba(255,255,255,0.35); }
.auto-log-line.info { color: rgba(255,255,255,0.55); }
/* Pulsing status indicator for running automation */
.automation-status.running {
background: rgb(var(--accent-rgb));
box-shadow: 0 0 6px rgba(var(--accent-rgb), 0.5);
animation: auto-pulse 1.5s ease-in-out infinite;
}
@keyframes auto-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
/* Duplicate & Group button hovers */
.automation-dupe-btn:hover { background: rgba(var(--accent-rgb),0.2); border-color: rgba(var(--accent-rgb),0.4); color: rgb(var(--accent-light-rgb)); }
.automation-group-btn:hover { background: rgba(250,204,21,0.15); border-color: rgba(250,204,21,0.35); color: #facc15; }
.automation-group-btn.grouped { color: #facc15; }
/* --- Filter Bar --- */
.auto-filter-bar {
display: flex; align-items: center; gap: 10px; padding: 10px 14px; margin-bottom: 12px;
background: rgba(22, 22, 22, 0.8); border: 1px solid rgba(255,255,255,0.07);
border-radius: 12px; flex-wrap: wrap;
}
.auto-filter-search {
flex: 1; min-width: 180px; max-width: 320px;
background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
border-radius: 8px; padding: 7px 12px; color: #fff; font-size: 12px; outline: none;
transition: border-color 0.2s ease;
}
.auto-filter-search:focus { border-color: rgba(var(--accent-rgb),0.5); background: rgba(var(--accent-rgb),0.04); }
.auto-filter-search::placeholder { color: rgba(255,255,255,0.25); }
.auto-filter-select {
background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
border-radius: 8px; padding: 7px 10px; color: rgba(255,255,255,0.7); font-size: 11px;
outline: none; cursor: pointer; transition: border-color 0.2s ease;
-webkit-appearance: none; appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='rgba(255,255,255,0.3)'/%3E%3C/svg%3E");
background-repeat: no-repeat; background-position: right 8px center; padding-right: 24px;
}
.auto-filter-select:focus { border-color: rgba(var(--accent-rgb),0.5); }
.auto-filter-select option { background: #1a1a1a; color: #fff; }
.auto-filter-count {
font-size: 11px; color: rgba(255,255,255,0.35); white-space: nowrap; margin-left: auto;
}
/* --- Inspiration / Templates Section --- */
.auto-template-card {
display: flex; align-items: center; gap: 12px;
padding: 12px 14px; border-radius: 12px;
background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
cursor: pointer; transition: all 0.25s ease; position: relative;
}
.auto-template-card:hover {
background: rgba(var(--accent-rgb),0.06); border-color: rgba(var(--accent-rgb),0.25);
transform: translateY(-1px); box-shadow: 0 4px 16px rgba(0,0,0,0.3);
}
.auto-template-icon {
font-size: 22px; width: 36px; height: 36px;
display: flex; align-items: center; justify-content: center; flex-shrink: 0;
background: rgba(255,255,255,0.04); border-radius: 10px;
}
.auto-template-info { flex: 1; min-width: 0; }
.auto-template-name { font-size: 13px; font-weight: 600; color: #fff; margin-bottom: 3px; }
.auto-template-desc { font-size: 11px; color: rgba(255,255,255,0.4); line-height: 1.4; margin-bottom: 6px; }
.auto-template-flow { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.auto-template-use {
flex-shrink: 0; padding: 5px 14px; border-radius: 16px; border: none;
background: rgba(var(--accent-rgb),0.15); color: rgb(var(--accent-light-rgb));
font-size: 11px; font-weight: 600; cursor: pointer; transition: all 0.2s ease;
}
.auto-template-use:hover { background: rgba(var(--accent-rgb),0.3); transform: translateY(-1px); }
/* --- Automation Hub --- */
.auto-hub-tabs {
display: flex;
gap: 4px;
border-bottom: 1px solid rgba(255,255,255,0.06);
padding: 0 4px 0 0;
margin-bottom: 16px;
overflow-x: auto;
}
.auto-hub-tab {
padding: 8px 16px;
border: none;
background: transparent;
color: rgba(255,255,255,0.45);
font-size: 12.5px;
font-weight: 600;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: all 0.2s ease;
white-space: nowrap;
letter-spacing: 0.2px;
}
.auto-hub-tab:hover {
color: rgba(255,255,255,0.7);
background: rgba(255,255,255,0.03);
}
.auto-hub-tab.active {
color: rgb(var(--accent-light-rgb));
border-bottom-color: rgb(var(--accent-light-rgb));
}
.auto-hub-tab-content { display: none; }
.auto-hub-tab-content.active { display: block; }
/* Hub Filters */
.auto-hub-filters {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 14px;
}
.auto-hub-filter-pill {
padding: 4px 12px;
border-radius: 14px;
border: 1px solid rgba(255,255,255,0.08);
background: rgba(255,255,255,0.03);
color: rgba(255,255,255,0.45);
font-size: 11px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.auto-hub-filter-pill:hover {
background: rgba(255,255,255,0.06);
color: rgba(255,255,255,0.65);
}
.auto-hub-filter-pill.active {
background: rgba(var(--accent-rgb),0.15);
border-color: rgba(var(--accent-rgb),0.3);
color: rgb(var(--accent-light-rgb));
}
/* Recipe Cards Grid */
.auto-hub-recipes-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 10px;
}
/* ── Pipeline Cards — Premium Design ── */
.auto-hub-pipeline-intro {
font-size: 0.84em;
color: rgba(255,255,255,0.35);
padding: 0 0 20px;
line-height: 1.5;
}
.auto-hub-pipeline-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 14px;
}
@media (max-width: 768px) {
.auto-hub-pipeline-grid { grid-template-columns: 1fr; }
}
.auto-hub-pipeline-card {
display: flex;
flex-direction: column;
background: linear-gradient(
145deg,
color-mix(in srgb, var(--pipeline-color) 6%, rgba(20,20,28,0.95)),
rgba(14,14,20,0.98)
);
border: 1px solid color-mix(in srgb, var(--pipeline-color) 15%, transparent);
border-radius: 16px;
padding: 22px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
cursor: default;
}
.auto-hub-pipeline-card::after {
content: '';
position: absolute;
top: 0; right: 0;
width: 140px; height: 140px;
background: radial-gradient(circle at top right,
color-mix(in srgb, var(--pipeline-color) 8%, transparent),
transparent 70%);
pointer-events: none;
}
.auto-hub-pipeline-card:hover {
border-color: color-mix(in srgb, var(--pipeline-color) 30%, transparent);
transform: translateY(-2px);
box-shadow: 0 8px 30px color-mix(in srgb, var(--pipeline-color) 10%, transparent),
0 2px 8px rgba(0,0,0,0.3);
}
/* Top row: icon + title + badge */
.pipeline-card-top {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 8px;
position: relative;
z-index: 1;
}
.pipeline-card-icon {
font-size: 1.3em;
flex-shrink: 0;
width: 38px;
height: 38px;
display: flex;
align-items: center;
justify-content: center;
background: color-mix(in srgb, var(--pipeline-color) 12%, transparent);
border-radius: 11px;
border: 1px solid color-mix(in srgb, var(--pipeline-color) 18%, transparent);
}
.pipeline-card-title-row {
flex: 1;
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.pipeline-card-name {
font-size: 0.98em;
font-weight: 600;
color: #fff;
letter-spacing: 0.01em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.pipeline-card-badge {
font-size: 0.65em;
font-weight: 600;
padding: 3px 9px;
border-radius: 20px;
background: color-mix(in srgb, var(--pipeline-color) 15%, transparent);
color: color-mix(in srgb, var(--pipeline-color) 80%, white);
white-space: nowrap;
flex-shrink: 0;
letter-spacing: 0.03em;
text-transform: uppercase;
}
/* Description */
.pipeline-card-desc {
font-size: 0.8em;
color: rgba(255,255,255,0.38);
line-height: 1.5;
margin-bottom: 14px;
position: relative;
z-index: 1;
}
/* Pipeline flow — connected circles */
.pipeline-flow {
display: flex;
align-items: flex-start;
justify-content: center;
gap: 0;
padding: 10px 0;
flex: 1;
position: relative;
z-index: 1;
}
.pipeline-node {
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
flex: 1;
min-width: 0;
}
.pipeline-node-icon {
width: 38px;
height: 38px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.05em;
border-radius: 50%;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.07);
transition: all 0.25s;
flex-shrink: 0;
}
.pipeline-node-action .pipeline-node-icon {
background: color-mix(in srgb, var(--pipeline-color) 10%, transparent);
border-color: color-mix(in srgb, var(--pipeline-color) 20%, transparent);
}
.pipeline-node-notify .pipeline-node-icon {
background: rgba(251, 191, 36, 0.08);
border-color: rgba(251, 191, 36, 0.2);
}
.auto-hub-pipeline-card:hover .pipeline-node-icon {
transform: scale(1.06);
border-color: color-mix(in srgb, var(--pipeline-color) 35%, transparent);
}
.pipeline-node-label {
font-size: 0.66em;
color: rgba(255,255,255,0.38);
font-weight: 500;
text-align: center;
line-height: 1.3;
max-width: 80px;
word-wrap: break-word;
}
.pipeline-connector {
width: 100%;
max-width: 40px;
height: 1px;
background: linear-gradient(90deg,
color-mix(in srgb, var(--pipeline-color) 30%, transparent),
color-mix(in srgb, var(--pipeline-color) 12%, transparent));
flex-shrink: 1;
margin-top: 19px; /* vertically center with circle icons */
align-self: flex-start;
}
/* Footer with deploy button */
.pipeline-card-footer {
margin-top: 14px;
position: relative;
z-index: 1;
}
.pipeline-deploy-btn {
width: 100%;
padding: 10px;
border: none;
border-radius: 10px;
background: linear-gradient(135deg,
color-mix(in srgb, var(--pipeline-color) 85%, white),
var(--pipeline-color));
color: #fff;
font-size: 0.84em;
font-weight: 600;
font-family: inherit;
cursor: pointer;
transition: all 0.25s;
letter-spacing: 0.02em;
}
.pipeline-deploy-btn:hover {
filter: brightness(1.12);
box-shadow: 0 4px 16px color-mix(in srgb, var(--pipeline-color) 30%, transparent);
transform: translateY(-1px);
}
/* ── Pipeline Detail Modal ── */
.pipeline-detail-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.75);
backdrop-filter: blur(8px);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.pipeline-detail-modal {
background: linear-gradient(
160deg,
color-mix(in srgb, var(--pipeline-color) 5%, rgba(22, 22, 30, 0.98)),
rgba(14, 14, 20, 0.99)
);
border: 1px solid color-mix(in srgb, var(--pipeline-color) 15%, transparent);
border-radius: 20px;
padding: 32px;
max-width: 580px;
width: 100%;
max-height: 85vh;
overflow-y: auto;
position: relative;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.5),
0 0 40px color-mix(in srgb, var(--pipeline-color) 8%, transparent);
}
.pipeline-detail-modal::-webkit-scrollbar { width: 4px; }
.pipeline-detail-modal::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 2px; }
.pipeline-detail-close {
position: absolute;
top: 16px; right: 18px;
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 1.5em;
cursor: pointer;
width: 32px; height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8px;
transition: all 0.2s;
}
.pipeline-detail-close:hover {
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.7);
}
.pipeline-detail-header {
display: flex;
align-items: flex-start;
gap: 16px;
margin-bottom: 20px;
padding-right: 32px;
}
.pipeline-detail-icon {
font-size: 2em;
width: 52px; height: 52px;
display: flex;
align-items: center;
justify-content: center;
background: color-mix(in srgb, var(--pipeline-color) 12%, transparent);
border: 1px solid color-mix(in srgb, var(--pipeline-color) 20%, transparent);
border-radius: 14px;
flex-shrink: 0;
}
.pipeline-detail-title {
font-size: 1.2em;
font-weight: 700;
color: #fff;
margin-bottom: 6px;
}
.pipeline-detail-desc {
font-size: 0.85em;
color: rgba(255, 255, 255, 0.42);
line-height: 1.5;
}
.pipeline-detail-flow {
display: flex;
align-items: flex-start;
justify-content: center;
padding: 18px 8px;
background: rgba(255, 255, 255, 0.02);
border-radius: 12px;
margin-bottom: 22px;
border: 1px solid rgba(255, 255, 255, 0.04);
}
.pipeline-detail-section-title {
font-size: 0.72em;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.35);
margin-bottom: 6px;
}
.pipeline-detail-section-desc {
font-size: 0.82em;
color: rgba(255, 255, 255, 0.38);
line-height: 1.5;
margin-bottom: 16px;
}
/* Automation step cards */
.pipeline-detail-autos {
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 18px;
}
.pipeline-detail-auto {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 14px 16px;
background: rgba(255, 255, 255, 0.025);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
transition: border-color 0.2s;
}
.pipeline-detail-auto:hover {
border-color: color-mix(in srgb, var(--step-color) 25%, transparent);
}
.pipeline-detail-step-num {
width: 26px; height: 26px;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.75em;
font-weight: 700;
color: color-mix(in srgb, var(--step-color) 80%, white);
background: color-mix(in srgb, var(--step-color) 15%, transparent);
border-radius: 50%;
flex-shrink: 0;
margin-top: 1px;
}
.pipeline-detail-step-body {
flex: 1;
min-width: 0;
}
.pipeline-detail-step-name {
font-size: 0.88em;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
margin-bottom: 6px;
}
.pipeline-detail-step-flow {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 5px;
}
.pipeline-detail-tag {
font-size: 0.62em;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 2px 6px;
border-radius: 4px;
}
.pipeline-detail-tag.when {
background: rgba(99, 102, 241, 0.15);
color: rgba(129, 140, 248, 0.9);
}
.pipeline-detail-tag.do {
background: rgba(34, 197, 94, 0.15);
color: rgba(74, 222, 128, 0.9);
}
.pipeline-detail-tag.then {
background: rgba(251, 191, 36, 0.15);
color: rgba(253, 224, 71, 0.9);
}
.pipeline-detail-tag-value {
font-size: 0.78em;
color: rgba(255, 255, 255, 0.55);
}
@media (max-width: 600px) {
.pipeline-detail-modal { padding: 20px; border-radius: 14px; }
.pipeline-detail-header { flex-direction: column; gap: 12px; }
.pipeline-detail-flow { flex-wrap: wrap; }
}
.auto-hub-recipe-card {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
border-radius: 12px;
padding: 16px;
display: flex;
flex-direction: column;
gap: 8px;
transition: all 0.2s ease;
cursor: pointer;
}
.auto-hub-recipe-card:hover {
background: rgba(var(--accent-rgb),0.06);
border-color: rgba(var(--accent-rgb),0.2);
transform: translateY(-1px);
}
.auto-hub-recipe-header {
display: flex;
align-items: center;
gap: 10px;
}
.auto-hub-recipe-icon {
font-size: 20px;
width: 34px;
height: 34px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: rgba(255,255,255,0.04);
border-radius: 9px;
}
.auto-hub-recipe-name {
flex: 1;
font-size: 13px;
font-weight: 600;
color: #fff;
}
.auto-hub-badge {
padding: 2px 9px;
border-radius: 10px;
font-size: 10px;
font-weight: 600;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.auto-hub-badge.beginner {
background: rgba(52, 211, 153, 0.12);
color: #6ee7b7;
}
.auto-hub-badge.intermediate {
background: rgba(251, 191, 36, 0.12);
color: #fbbf24;
}
.auto-hub-badge.advanced {
background: rgba(192, 90, 242, 0.12);
color: #c084fc;
}
.auto-hub-recipe-desc {
font-size: 11.5px;
line-height: 1.45;
color: rgba(255,255,255,0.42);
}
.auto-hub-recipe-chain {
display: flex;
flex-wrap: wrap;
gap: 4px;
align-items: center;
}
.auto-hub-recipe-note {
font-size: 10.5px;
color: rgba(var(--accent-light-rgb), 0.7);
background: rgba(var(--accent-rgb), 0.06);
border-radius: 6px;
padding: 5px 10px;
line-height: 1.4;
}
.auto-hub-recipe-use {
align-self: flex-end;
padding: 5px 14px;
border-radius: 14px;
border: none;
background: rgba(var(--accent-rgb),0.15);
color: rgb(var(--accent-light-rgb));
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.auto-hub-recipe-use:hover {
background: rgba(var(--accent-rgb),0.3);
transform: translateY(-1px);
}
/* Guide Cards */
.auto-hub-guide-card {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
border-radius: 12px;
padding: 20px;
margin-bottom: 10px;
}
.auto-hub-guide-header {
display: flex;
align-items: center;
gap: 12px;
margin-bottom: 4px;
cursor: pointer;
}
.auto-hub-guide-icon {
font-size: 22px;
flex-shrink: 0;
}
.auto-hub-guide-title {
flex: 1;
font-size: 14px;
font-weight: 600;
color: #fff;
}
.auto-hub-guide-subtitle {
font-size: 12px;
color: rgba(255,255,255,0.4);
margin-bottom: 12px;
padding-left: 34px;
}
.auto-hub-steps {
counter-reset: hub-step;
list-style: none;
padding: 0;
margin: 12px 0;
}
.auto-hub-steps li {
counter-increment: hub-step;
display: flex;
align-items: flex-start;
gap: 12px;
padding: 9px 0;
border-bottom: 1px solid rgba(255,255,255,0.04);
font-size: 12.5px;
line-height: 1.55;
color: rgba(255,255,255,0.65);
}
.auto-hub-steps li:last-child { border-bottom: none; }
.auto-hub-steps li::before {
content: counter(hub-step);
min-width: 24px;
height: 24px;
border-radius: 50%;
background: rgba(var(--accent-rgb),0.15);
color: rgb(var(--accent-light-rgb));
font-size: 11px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.auto-hub-guide-related {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 8px;
padding-top: 8px;
border-top: 1px solid rgba(255,255,255,0.04);
}
.auto-hub-guide-related-label {
font-size: 10.5px;
color: rgba(255,255,255,0.3);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.3px;
align-self: center;
}
.auto-hub-guide-related-link {
padding: 3px 10px;
border-radius: 10px;
background: rgba(var(--accent-rgb),0.1);
color: rgb(var(--accent-light-rgb));
font-size: 10.5px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s ease;
border: none;
}
.auto-hub-guide-related-link:hover {
background: rgba(var(--accent-rgb),0.2);
}
.auto-hub-guide-body { display: none; }
.auto-hub-guide-card.expanded .auto-hub-guide-body { display: block; }
.auto-hub-guide-chevron {
color: rgba(255,255,255,0.3);
font-size: 11px;
transition: transform 0.2s ease;
}
.auto-hub-guide-card.expanded .auto-hub-guide-chevron {
transform: rotate(180deg);
}
/* Tips Grid */
.auto-hub-tips-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.auto-hub-tip-card {
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.06);
border-left: 3px solid rgba(var(--accent-rgb),0.4);
border-radius: 10px;
padding: 14px 16px;
}
.auto-hub-tip-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 6px;
}
.auto-hub-tip-icon { font-size: 16px; flex-shrink: 0; }
.auto-hub-tip-title {
font-size: 12.5px;
font-weight: 600;
color: #fff;
flex: 1;
}
.auto-hub-tip-tag {
padding: 2px 8px;
border-radius: 8px;
background: rgba(255,255,255,0.05);
color: rgba(255,255,255,0.35);
font-size: 9.5px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.auto-hub-tip-body {
font-size: 11.5px;
line-height: 1.5;
color: rgba(255,255,255,0.45);
}
/* Reference Accordion */
.auto-hub-ref-group {
border: 1px solid rgba(255,255,255,0.06);
border-radius: 10px;
margin-bottom: 8px;
overflow: hidden;
}
.auto-hub-ref-group-header {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
background: rgba(255,255,255,0.03);
cursor: pointer;
transition: background 0.15s ease;
}
.auto-hub-ref-group-header:hover {
background: rgba(255,255,255,0.05);
}
.auto-hub-ref-group-label {
font-size: 13px;
font-weight: 600;
color: rgba(255,255,255,0.8);
flex: 1;
}
.auto-hub-ref-group-count {
font-size: 10px;
color: rgba(255,255,255,0.25);
padding: 1px 7px;
border-radius: 8px;
background: rgba(255,255,255,0.04);
}
.auto-hub-ref-chevron {
color: rgba(255,255,255,0.3);
font-size: 11px;
transition: transform 0.2s ease;
}
.auto-hub-ref-group.expanded .auto-hub-ref-chevron {
transform: rotate(180deg);
}
.auto-hub-ref-body {
display: none;
padding: 0 16px 12px;
}
.auto-hub-ref-group.expanded .auto-hub-ref-body {
display: block;
}
.auto-hub-ref-subheader {
font-size: 11px;
font-weight: 600;
color: rgba(255,255,255,0.35);
text-transform: uppercase;
letter-spacing: 0.4px;
padding: 10px 0 6px;
}
.auto-hub-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
margin-bottom: 8px;
}
.auto-hub-table th {
text-align: left;
padding: 7px 10px;
font-weight: 600;
color: rgba(255,255,255,0.5);
border-bottom: 1px solid rgba(255,255,255,0.08);
background: rgba(255,255,255,0.02);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.4px;
}
.auto-hub-table td {
padding: 7px 10px;
color: rgba(255,255,255,0.55);
border-bottom: 1px solid rgba(255,255,255,0.03);
line-height: 1.4;
}
.auto-hub-table td:first-child {
color: rgba(255,255,255,0.7);
font-weight: 500;
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 11px;
}
.auto-hub-table tr:hover td {
background: rgba(255,255,255,0.02);
}
/* Hub Callout */
.auto-hub-callout {
padding: 12px 16px;
border-radius: 10px;
margin-bottom: 14px;
font-size: 12px;
line-height: 1.5;
display: flex;
gap: 10px;
align-items: flex-start;
background: rgba(var(--accent-rgb),0.06);
border: 1px solid rgba(var(--accent-rgb),0.12);
color: rgba(255,255,255,0.65);
}
.auto-hub-callout-icon {
font-size: 15px;
flex-shrink: 0;
margin-top: 1px;
}
/* Responsive */
@media (max-width: 800px) {
.auto-hub-recipes-grid { grid-template-columns: 1fr; }
.auto-hub-tips-grid { grid-template-columns: 1fr; }
}
/* --- Group Dropdown Popover --- */
.auto-group-dropdown {
z-index: 9999;
background: rgba(22,22,22,0.97); border: 1px solid rgba(255,255,255,0.12);
border-radius: 10px; padding: 6px; min-width: 180px; max-width: 240px;
box-shadow: 0 8px 24px rgba(0,0,0,0.5); backdrop-filter: blur(12px);
margin-top: 4px;
}
.auto-group-option {
padding: 7px 10px; border-radius: 6px; font-size: 12px; color: rgba(255,255,255,0.7);
cursor: pointer; transition: background 0.15s ease; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.auto-group-option:hover { background: rgba(255,255,255,0.08); color: #fff; }
.auto-group-option.active { color: rgb(var(--accent-light-rgb)); background: rgba(var(--accent-rgb),0.12); }
.auto-group-option.ungroup { color: rgba(255,255,255,0.4); font-style: italic; }
.auto-group-divider { height: 1px; background: rgba(255,255,255,0.08); margin: 4px 0; }
.auto-group-input {
width: 100%; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.1);
border-radius: 6px; padding: 6px 8px; color: #fff; font-size: 11px; outline: none;
margin-top: 2px;
}
.auto-group-input::placeholder { color: rgba(255,255,255,0.25); }
.auto-group-input:focus { border-color: rgba(var(--accent-rgb),0.5); }
/* Group section label styling */
.automations-section .section-group-icon { margin-right: 4px; font-size: 12px; }
/* --- Empty State --- */
.automations-empty {
text-align: center; padding: 80px 24px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.03) 0%, transparent 60%);
border-radius: 20px;
border: 1px dashed rgba(255,255,255,0.08);
}
.automations-empty-icon { font-size: 56px; margin-bottom: 20px; filter: grayscale(0.3); }
.automations-empty-title {
font-size: 22px; font-weight: 700; margin-bottom: 10px;
background: linear-gradient(135deg, #fff 0%, rgb(var(--accent-light-rgb)) 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}
.automations-empty-text {
font-size: 14px; color: rgba(255,255,255,0.4); margin-bottom: 28px;
max-width: 420px; margin-left: auto; margin-right: auto; line-height: 1.6;
}
/* --- Builder View --- */
.automations-builder-view { display: flex; flex-direction: column; height: 100%; }
.builder-header {
display: flex; align-items: center; gap: 12px;
padding: 16px 24px; border-bottom: 1px solid rgba(255,255,255,0.08);
background: rgba(18,18,18,0.95); flex-shrink: 0;
}
.builder-back-btn {
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.1);
border-radius: 10px; width: 36px; height: 36px; display: flex; align-items: center; justify-content: center;
cursor: pointer; font-size: 18px; color: rgba(255,255,255,0.6); transition: all 0.2s ease;
}
.builder-back-btn:hover { background: rgba(255,255,255,0.1); color: #fff; }
.builder-name-input {
flex: 1; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.1);
border-radius: 10px; padding: 8px 14px; color: #fff; font-size: 16px; font-weight: 600;
outline: none; transition: border-color 0.2s ease;
}
.builder-name-input:focus { border-color: rgba(var(--accent-rgb),0.5); }
.builder-name-input::placeholder { color: rgba(255,255,255,0.3); }
.builder-group-input {
width: 160px; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
border-radius: 8px; padding: 7px 10px; color: rgba(255,255,255,0.7); font-size: 12px;
outline: none; transition: border-color 0.2s ease;
}
.builder-group-input:focus { border-color: rgba(var(--accent-rgb),0.5); }
.builder-group-input::placeholder { color: rgba(255,255,255,0.25); }
.builder-header-actions { display: flex; gap: 8px; }
.builder-header-actions .btn-cancel {
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12);
color: rgba(255,255,255,0.7); padding: 8px 20px; border-radius: 10px; cursor: pointer; font-size: 13px; transition: all 0.2s ease;
}
.builder-header-actions .btn-cancel:hover { background: rgba(255,255,255,0.1); color: #fff; }
.builder-header-actions .btn-save {
background: rgb(var(--accent-rgb)); border: none; color: #fff;
padding: 8px 24px; border-radius: 10px; cursor: pointer; font-size: 13px; font-weight: 600; transition: all 0.2s ease;
}
.builder-header-actions .btn-save:hover { filter: brightness(1.15); transform: translateY(-1px); }
.builder-content { display: flex; flex: 1; overflow: hidden; }
/* --- Builder Sidebar --- */
.builder-sidebar {
width: 260px; flex-shrink: 0; overflow-y: auto;
border-right: 1px solid rgba(255,255,255,0.06);
padding: 16px; background: rgba(14,14,14,0.5);
}
.sidebar-section { margin-bottom: 20px; }
.sidebar-section-title {
font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1.2px;
color: rgba(255,255,255,0.35); margin-bottom: 8px; padding-left: 4px;
}
.block-item {
display: flex; align-items: center; gap: 10px;
padding: 10px 12px; border-radius: 12px;
background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06);
margin-bottom: 6px; cursor: grab; transition: all 0.2s ease; user-select: none;
}
.block-item:hover {
background: rgba(255,255,255,0.08); border-color: rgba(var(--accent-rgb),0.3);
transform: translateX(2px);
}
.block-item:active { cursor: grabbing; }
.block-item.coming-soon {
opacity: 0.35; cursor: default; pointer-events: none;
}
.block-item-icon { font-size: 18px; flex-shrink: 0; width: 28px; text-align: center; }
.block-item-text { flex: 1; min-width: 0; }
.block-item-label { font-size: 13px; font-weight: 500; color: #fff; }
.block-item-desc { font-size: 10px; color: rgba(255,255,255,0.35); margin-top: 1px; }
.block-item .coming-soon-badge {
font-size: 8px; text-transform: uppercase; letter-spacing: 0.5px;
color: rgba(255,255,255,0.3); background: rgba(255,255,255,0.06);
padding: 2px 6px; border-radius: 6px; white-space: nowrap;
}
.block-help-btn {
width: 20px;
height: 20px;
font-size: 11px;
flex-shrink: 0;
opacity: 0;
transition: opacity 0.2s ease;
}
.block-item:hover .block-help-btn {
opacity: 1;
}
/* --- Builder Canvas --- */
.builder-canvas {
flex: 1; overflow-y: auto; display: flex; flex-direction: column;
align-items: center; padding: 40px 24px; gap: 0;
}
.flow-slot {
width: 100%; max-width: 480px; min-height: 70px;
border: 2px dashed rgba(255,255,255,0.1); border-radius: 16px;
display: flex; align-items: center; justify-content: center;
transition: all 0.3s ease; position: relative;
}
.flow-slot.empty { cursor: default; }
.flow-slot.empty .flow-slot-prompt {
font-size: 13px; color: rgba(255,255,255,0.25); text-align: center; padding: 20px;
}
.flow-slot.drag-over {
border-color: rgba(var(--accent-rgb),0.6); background: rgba(var(--accent-rgb),0.05);
box-shadow: 0 0 20px rgba(var(--accent-rgb),0.1);
}
.flow-slot.filled { border: none; min-height: auto; }
.flow-connector {
width: 2px; height: 32px; background: rgba(255,255,255,0.1); position: relative;
}
.flow-connector::after {
content: ''; position: absolute; bottom: -4px; left: -4px;
width: 0; height: 0;
border-left: 5px solid transparent; border-right: 5px solid transparent;
border-top: 6px solid rgba(255,255,255,0.15);
}
.flow-slot-label {
font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px;
padding: 3px 10px; border-radius: 6px; margin-bottom: 6px;
}
.flow-slot-label.when { background: rgba(var(--accent-rgb),0.2); color: rgb(var(--accent-light-rgb)); }
.flow-slot-label.do { background: rgba(88,101,242,0.2); color: #7289da; }
.flow-slot-label.notify { background: rgba(250,204,21,0.15); color: #fbbf24; }
.flow-slot-label.then { background: rgba(250,204,21,0.15); color: #fbbf24; }
.flow-connector.small { height: 16px; }
.then-add {
min-height: 48px !important;
border-style: dashed;
opacity: 0.6;
transition: opacity 0.3s ease;
}
.then-add:hover, .then-add.drag-over { opacity: 1; }
.then-add .flow-slot-prompt { font-size: 12px; padding: 12px; }
/* --- Placed Block (in flow) --- */
.placed-block {
width: 100%; max-width: 480px;
background: linear-gradient(135deg, rgba(26,26,26,0.95) 0%, rgba(18,18,18,0.98) 100%);
border-radius: 16px; border: 1px solid rgba(255,255,255,0.1);
overflow: hidden; transition: all 0.3s ease;
box-shadow: 0 4px 16px rgba(0,0,0,0.3);
}
.placed-block:hover { border-color: rgba(255,255,255,0.18); }
.placed-block.locked { border-color: rgba(var(--accent-rgb),0.2); opacity: 0.85; }
.placed-block.locked .placed-block-header::after { content: 'Locked'; font-size: 10px; color: rgba(255,255,255,0.3); text-transform: uppercase; letter-spacing: 0.5px; }
.placed-block-header {
display: flex; align-items: center; gap: 10px; padding: 14px 16px;
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.placed-block-icon { font-size: 18px; }
.placed-block-label { flex: 1; font-size: 14px; font-weight: 600; color: #fff; }
.placed-block-remove {
background: none; border: none; color: rgba(255,255,255,0.3);
font-size: 16px; cursor: pointer; padding: 2px 6px; border-radius: 6px; transition: all 0.2s ease;
}
.placed-block-remove:hover { background: rgba(239,68,68,0.2); color: #ef4444; }
.placed-block-config { padding: 14px 16px; }
.placed-block-config .config-row {
display: flex; align-items: center; gap: 8px; margin-bottom: 10px;
}
.placed-block-config .config-row:last-child { margin-bottom: 0; }
.placed-block-config label {
font-size: 12px; color: rgba(255,255,255,0.5); text-transform: uppercase;
letter-spacing: 0.5px; white-space: nowrap; min-width: 50px;
}
.placed-block-config input[type="text"],
.placed-block-config input[type="number"],
.placed-block-config textarea {
flex: 1; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px; padding: 7px 10px; color: #fff; font-size: 13px;
outline: none; transition: border-color 0.2s ease;
}
.placed-block-config input:focus,
.placed-block-config textarea:focus { border-color: rgba(var(--accent-rgb),0.5); }
.placed-block-config select {
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px; padding: 7px 10px; color: #fff; font-size: 13px;
outline: none; cursor: pointer;
}
.placed-block-config select option,
.condition-match-select option,
.condition-row select option {
background: #1a1a1a; color: #fff;
}
.placed-block-config textarea { resize: vertical; min-height: 60px; font-family: inherit; }
/* Variable tags */
.variable-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.variable-tag {
font-size: 11px; padding: 3px 8px; border-radius: 8px; cursor: pointer;
background: rgba(var(--accent-rgb),0.1); color: rgb(var(--accent-light-rgb));
border: 1px solid rgba(var(--accent-rgb),0.2); transition: all 0.2s ease; font-family: monospace;
}
.variable-tag:hover { background: rgba(var(--accent-rgb),0.2); border-color: rgba(var(--accent-rgb),0.4); }
/* Condition builder */
.condition-builder { margin-top: 8px; }
.condition-header { margin-bottom: 8px; }
.condition-match-select {
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12);
color: #fff; padding: 4px 8px; border-radius: 6px; font-size: 12px;
}
.condition-row {
display: flex; gap: 6px; align-items: center; margin-bottom: 6px; padding: 8px 10px;
background: rgba(255,255,255,0.03); border-radius: 6px; border: 1px solid rgba(255,255,255,0.06);
}
.condition-row select, .condition-row input[type="text"] {
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12);
color: #fff; padding: 5px 8px; border-radius: 5px; font-size: 12px;
}
.condition-row select { min-width: 80px; }
.condition-row input[type="text"] { flex: 1; min-width: 80px; }
.condition-row select:focus, .condition-row input:focus {
border-color: rgba(var(--accent-rgb),0.5); outline: none;
}
.add-condition-btn {
display: inline-block; margin-top: 6px; padding: 5px 12px; font-size: 12px;
background: transparent; color: rgba(var(--accent-light-rgb),0.8);
border: 1px dashed rgba(var(--accent-rgb),0.3); border-radius: 6px; cursor: pointer;
transition: all 0.2s ease;
}
.add-condition-btn:hover {
background: rgba(var(--accent-rgb),0.1); border-color: rgba(var(--accent-rgb),0.5);
}
.remove-condition-btn {
background: none; border: none; color: rgba(255,255,255,0.3); cursor: pointer;
font-size: 14px; padding: 2px 6px; border-radius: 4px; transition: all 0.2s ease;
}
.remove-condition-btn:hover { color: #ff6b6b; background: rgba(255,0,0,0.1); }
/* Mirrored playlist select */
.placed-block-config input[type="checkbox"] {
margin-right: 6px; accent-color: rgb(var(--accent-rgb));
}
/* --- Automation Run History Modal --- */
.auto-runs-link {
cursor: pointer; text-decoration: underline; text-decoration-style: dotted;
text-underline-offset: 2px; color: rgba(255,255,255,0.5);
transition: color 0.2s ease;
}
.auto-runs-link:hover { color: rgb(var(--accent-light-rgb)); }
.automation-history-modal {
max-width: 560px; width: 90%; max-height: 75vh; display: flex; flex-direction: column;
}
.history-modal-header {
display: flex; align-items: center; justify-content: space-between;
padding: 16px 20px; border-bottom: 1px solid rgba(255,255,255,0.08);
}
.history-modal-header h3 {
margin: 0; font-size: 15px; font-weight: 600; color: #fff;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.history-close-btn {
background: none; border: none; color: rgba(255,255,255,0.4); font-size: 22px;
cursor: pointer; padding: 0 4px; line-height: 1; transition: color 0.2s;
}
.history-close-btn:hover { color: #fff; }
.history-modal-body {
padding: 12px 20px 20px; overflow-y: auto; flex: 1;
}
.history-loading, .history-empty {
text-align: center; color: rgba(255,255,255,0.4); padding: 40px 0; font-size: 13px;
}
.history-entries { display: flex; flex-direction: column; gap: 8px; }
.history-entry {
background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
border-radius: 8px; overflow: hidden; transition: border-color 0.2s;
}
.history-entry:hover { border-color: rgba(255,255,255,0.12); }
.history-entry-header {
display: flex; align-items: center; gap: 10px; padding: 10px 14px;
cursor: pointer; user-select: none;
}
.history-status-badge {
font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px;
padding: 2px 8px; border-radius: 10px; flex-shrink: 0;
}
.history-status-completed { background: rgba(74,222,128,0.15); color: #4ade80; }
.history-status-error { background: rgba(239,68,68,0.15); color: #ef4444; }
.history-status-skipped { background: rgba(250,204,21,0.15); color: #facc15; }
.history-status-timeout { background: rgba(251,146,60,0.15); color: #fb923c; }
.history-time {
font-size: 11px; color: rgba(255,255,255,0.4); flex: 1;
}
.history-duration {
font-size: 10px; color: rgba(255,255,255,0.3);
background: rgba(255,255,255,0.05); padding: 2px 6px; border-radius: 6px;
}
.history-expand-icon {
font-size: 8px; color: rgba(255,255,255,0.25); transition: transform 0.2s;
}
.history-summary {
padding: 0 14px 8px; font-size: 12px; color: rgba(255,255,255,0.55); line-height: 1.4;
}
.history-log-section {
max-height: 0; overflow: hidden; transition: max-height 0.3s ease;
border-top: 1px solid rgba(255,255,255,0.04);
}
.history-log-section.expanded {
max-height: 400px; overflow-y: auto;
}
.history-log-line {
padding: 4px 14px; font-size: 11px; font-family: 'SF Mono', 'Fira Code', monospace;
line-height: 1.5; border-bottom: 1px solid rgba(255,255,255,0.02);
}
.history-log-info { color: rgba(255,255,255,0.45); }
.history-log-success { color: #4ade80; }
.history-log-error { color: #ef4444; }
.history-log-warning { color: #facc15; }
.history-stats-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 8px; padding: 10px 14px;
border-top: 1px solid rgba(255,255,255,0.06);
}
.history-stat-item {
background: rgba(0,0,0,0.25); border-radius: 8px; padding: 8px 12px;
}
.history-stat-label {
font-size: 11px; color: rgba(255,255,255,0.45); margin-bottom: 2px;
}
.history-stat-value {
font-size: 14px; font-weight: 600; color: #e0e0e0;
}
.history-log-skip { color: rgba(255,255,255,0.35); }
.history-total {
text-align: center; padding: 12px 0 4px; font-size: 11px; color: rgba(255,255,255,0.3);
}
/* ==================== Enhanced Library Management View ==================== */
/* View Toggle Buttons */
.enhanced-view-toggle-btn {
padding: 8px 18px;
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));
border: 1px solid rgba(255,255,255,0.12);
border-radius: 8px;
color: rgba(255,255,255,0.6);
font-size: 13px;
font-weight: 600;
cursor: pointer;
letter-spacing: 0.3px;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.enhanced-view-toggle-btn:hover:not(.active) {
background: rgba(255,255,255,0.08);
color: rgba(255,255,255,0.8);
}
.enhanced-view-toggle-btn.active {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.25) 0%, rgba(var(--accent-light-rgb), 0.15) 100%);
border-color: rgba(var(--accent-rgb), 0.6);
color: rgb(var(--accent-light-rgb));
font-weight: 700;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.2), inset 0 1px 0 rgba(255,255,255,0.1);
text-shadow: 0 0 12px rgba(var(--accent-rgb), 0.3);
}
/* Main Container */
.enhanced-view-container {
padding: 0;
animation: enhancedFadeIn 0.35s ease-out;
}
@keyframes enhancedFadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
/* Artist Meta Panel */
.enhanced-artist-meta {
background: linear-gradient(135deg, rgba(35,35,35,0.6), rgba(20,20,20,0.8));
border: 1px solid rgba(255,255,255,0.08);
border-radius: 16px;
padding: 0;
margin-bottom: 20px;
position: relative;
overflow: visible;
}
.enhanced-artist-meta::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 2px;
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.6) 0%, transparent 100%);
border-radius: 16px 16px 0 0;
}
.enhanced-artist-meta-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 24px;
}
.enhanced-artist-meta-header-left {
display: flex;
align-items: center;
gap: 16px;
flex: 1;
min-width: 0;
}
.enhanced-artist-meta-image {
width: 64px;
height: 64px;
border-radius: 50%;
object-fit: cover;
border: 2px solid rgba(var(--accent-rgb), 0.3);
flex-shrink: 0;
}
.enhanced-artist-meta-info {
display: flex;
flex-direction: column;
gap: 6px;
min-width: 0;
}
.enhanced-artist-meta-name {
font-size: 22px;
font-weight: 700;
color: #ffffff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.enhanced-artist-id-badges {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.enhanced-id-badge {
padding: 2px 8px;
border-radius: 4px;
font-size: 9px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
cursor: pointer;
transition: all 0.15s ease;
text-decoration: none;
}
.enhanced-id-badge:hover {
filter: brightness(1.3);
transform: translateY(-1px);
}
a.enhanced-id-badge,
a.enhanced-id-badge:visited {
text-decoration: none;
}
.enhanced-id-badge.spotify { background: rgba(30, 215, 96, 0.15); color: #1ed760; border: 1px solid rgba(30, 215, 96, 0.25); }
.enhanced-id-badge.mb { background: rgba(186, 72, 27, 0.15); color: #e8834a; border: 1px solid rgba(186, 72, 27, 0.25); }
.enhanced-id-badge.deezer { background: rgba(160, 55, 200, 0.15); color: #c770e8; border: 1px solid rgba(160, 55, 200, 0.25); }
.enhanced-id-badge.audiodb { background: rgba(50, 120, 220, 0.15); color: #5a9de6; border: 1px solid rgba(50, 120, 220, 0.25); }
.enhanced-id-badge.lastfm { background: rgba(185, 0, 0, 0.15); color: #d42f2f; border: 1px solid rgba(185, 0, 0, 0.25); }
.enhanced-id-badge.genius { background: rgba(255, 255, 100, 0.12); color: #e8d44d; border: 1px solid rgba(255, 255, 100, 0.2); }
.enhanced-id-badge.tidal { background: rgba(0, 0, 0, 0.15); color: #ffffff; border: 1px solid rgba(255, 255, 255, 0.2); }
.enhanced-id-badge.qobuz { background: rgba(1, 112, 239, 0.15); color: #4da6ff; border: 1px solid rgba(1, 112, 239, 0.25); }
.enhanced-id-badge.server { background: rgba(255,255,255,0.08); color: rgba(255,255,255,0.5); border: 1px solid rgba(255,255,255,0.12); }
.enhanced-meta-edit-toggle {
padding: 8px 18px;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.12);
border-radius: 8px;
color: rgba(255,255,255,0.7);
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.enhanced-meta-edit-toggle:hover {
background: rgba(255,255,255,0.1);
color: #fff;
}
.enhanced-meta-edit-toggle.active {
background: rgba(var(--accent-rgb), 0.12);
border-color: rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-light-rgb));
}
.enhanced-artist-meta-form {
padding: 0 24px 20px;
border-top: 1px solid rgba(255,255,255,0.06);
animation: enhancedFadeIn 0.25s ease-out;
}
.enhanced-artist-meta-form.hidden {
display: none;
}
.enhanced-artist-form-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 16px;
padding-top: 12px;
border-top: 1px solid rgba(255,255,255,0.05);
}
.enhanced-artist-meta-actions {
display: flex;
gap: 8px;
}
.enhanced-meta-save-btn,
.enhanced-meta-cancel-btn {
padding: 6px 16px;
border: none;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.enhanced-meta-save-btn {
background: rgb(var(--accent-rgb));
color: #ffffff;
}
.enhanced-meta-save-btn:hover {
background: rgb(var(--accent-light-rgb));
transform: translateY(-1px);
}
.enhanced-meta-cancel-btn {
background: rgba(255,255,255,0.1);
color: rgba(255,255,255,0.7);
}
.enhanced-meta-cancel-btn:hover {
background: rgba(255,255,255,0.15);
}
/* Stats Summary Bar */
.enhanced-stats-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.05) 0%, rgba(255,255,255,0.02) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.1);
border-radius: 12px;
margin-bottom: 24px;
flex-wrap: wrap;
gap: 12px;
}
.enhanced-stats-items {
display: flex;
gap: 24px;
flex-wrap: wrap;
}
.enhanced-stat-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
}
.enhanced-stat-value {
font-size: 20px;
font-weight: 700;
color: #ffffff;
font-variant-numeric: tabular-nums;
}
.enhanced-stat-label {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255,255,255,0.4);
}
.enhanced-stats-formats {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
/* Expanded Album Header (inside panel) */
.enhanced-expanded-header {
display: flex;
gap: 24px;
margin-bottom: 16px;
padding: 20px;
padding-bottom: 20px;
border-bottom: 1px solid rgba(255,255,255,0.06);
background: linear-gradient(135deg, rgba(255,255,255,0.025) 0%, rgba(255,255,255,0.01) 100%);
border-radius: 12px;
}
.enhanced-expanded-art {
width: 160px;
height: 160px;
border-radius: 12px;
object-fit: cover;
flex-shrink: 0;
border: 1px solid rgba(255,255,255,0.1);
box-shadow: 0 8px 32px rgba(0,0,0,0.4), 0 2px 8px rgba(0,0,0,0.2);
}
.enhanced-expanded-info {
display: flex;
flex-direction: column;
gap: 8px;
justify-content: center;
min-width: 0;
flex: 1;
}
.enhanced-expanded-title {
font-size: 20px;
font-weight: 700;
color: #ffffff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.enhanced-expanded-meta {
font-size: 13px;
color: rgba(255,255,255,0.5);
}
.enhanced-expanded-genres {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.enhanced-genre-tag {
padding: 2px 10px;
background: rgba(var(--accent-rgb), 0.1);
border: 1px solid rgba(var(--accent-rgb), 0.2);
border-radius: 12px;
font-size: 11px;
color: rgb(var(--accent-light-rgb));
font-weight: 500;
}
.enhanced-expanded-ids {
display: flex;
gap: 6px;
margin-top: 2px;
}
.enhanced-artist-meta-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 16px;
}
.enhanced-meta-field {
display: flex;
flex-direction: column;
gap: 4px;
}
.enhanced-meta-field.wide {
grid-column: span 2;
}
.enhanced-meta-field-label {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255,255,255,0.4);
}
.enhanced-meta-field-input {
width: 100%;
padding: 8px 12px;
background: linear-gradient(135deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));
border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px;
color: #ffffff;
font-size: 13px;
font-family: inherit;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-sizing: border-box;
}
.enhanced-meta-field-input:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.6);
background: rgba(var(--accent-rgb), 0.05);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.12), 0 0 16px rgba(var(--accent-rgb), 0.08);
}
.enhanced-meta-field-input::placeholder {
color: rgba(255,255,255,0.25);
}
textarea.enhanced-meta-field-input {
min-height: 60px;
resize: vertical;
}
.enhanced-meta-field-readonly {
padding: 8px 12px;
background: rgba(255,255,255,0.03);
border: 1px solid rgba(255,255,255,0.05);
border-radius: 8px;
color: rgba(255,255,255,0.5);
font-size: 13px;
font-family: 'SF Mono', 'Consolas', 'Courier New', monospace;
cursor: default;
word-break: break-all;
}
/* Section Headers */
.enhanced-section {
margin-bottom: 28px;
}
.enhanced-section-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
margin-bottom: 4px;
border-bottom: 2px solid rgba(255,255,255,0.06);
}
.enhanced-section-title {
font-size: 16px;
font-weight: 700;
color: #ffffff;
}
.enhanced-section-count {
font-size: 12px;
color: rgba(255,255,255,0.4);
font-weight: 500;
}
/* Album Grid */
.enhanced-album-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 6px;
}
.enhanced-album-wrapper.expanded {
grid-column: 1 / -1;
}
/* Album Rows */
.enhanced-album-row {
display: flex;
align-items: center;
gap: 14px;
padding: 12px 16px;
background: rgba(255,255,255,0.02);
border: 1px solid rgba(255,255,255,0.05);
border-radius: 10px;
cursor: pointer;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
user-select: none;
}
.enhanced-album-row:hover {
background: rgba(255,255,255,0.05);
border-color: rgba(255,255,255,0.1);
}
.enhanced-album-row.expanded {
background: rgba(var(--accent-rgb), 0.04);
border-color: rgba(var(--accent-rgb), 0.2);
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
margin-bottom: 0;
}
.enhanced-album-expand-icon {
font-size: 12px;
color: rgba(255,255,255,0.4);
transition: transform 0.25s ease;
flex-shrink: 0;
width: 16px;
text-align: center;
}
.enhanced-album-row.expanded .enhanced-album-expand-icon {
transform: rotate(90deg);
color: rgb(var(--accent-light-rgb));
}
.enhanced-album-thumb {
width: 40px;
height: 40px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: rgba(255,255,255,0.05);
}
.enhanced-album-thumb-fallback {
width: 40px;
height: 40px;
border-radius: 6px;
background: linear-gradient(135deg, rgba(255,255,255,0.08), rgba(255,255,255,0.03));
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
flex-shrink: 0;
}
.enhanced-album-info-block {
flex: 1;
display: flex;
flex-direction: column;
gap: 4px;
min-width: 0;
}
.enhanced-album-meta-line {
font-size: 12px;
color: rgba(255,255,255,0.4);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.enhanced-album-title {
font-size: 14px;
font-weight: 600;
color: #ffffff;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.enhanced-album-year {
font-size: 12px;
color: rgba(255,255,255,0.4);
flex-shrink: 0;
min-width: 40px;
}
.enhanced-album-type-badge {
padding: 2px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
flex-shrink: 0;
}
.enhanced-album-type-badge.album {
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-light-rgb));
border: 1px solid rgba(var(--accent-rgb), 0.25);
}
.enhanced-album-type-badge.ep {
background: rgba(255, 184, 77, 0.15);
color: #ffb84d;
border: 1px solid rgba(255, 184, 77, 0.25);
}
.enhanced-album-type-badge.single {
background: rgba(147, 130, 255, 0.15);
color: #9382ff;
border: 1px solid rgba(147, 130, 255, 0.25);
}
.enhanced-album-track-count {
font-size: 12px;
color: rgba(255,255,255,0.35);
flex-shrink: 0;
min-width: 60px;
text-align: right;
}
/* Expandable Tracks Panel */
.enhanced-tracks-panel {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 0.3s ease-out;
background: rgba(0,0,0,0.2);
border: 1px solid rgba(var(--accent-rgb), 0.12);
border-top: none;
border-radius: 0 0 10px 10px;
margin-bottom: 4px;
}
.enhanced-tracks-panel.visible {
grid-template-rows: 1fr;
}
.enhanced-tracks-panel-inner {
overflow: hidden;
padding: 0 16px;
transition: padding 0.3s ease-out;
}
.enhanced-tracks-panel.visible > .enhanced-tracks-panel-inner {
padding: 16px;
}
/* Album Meta Edit Row (inside expanded panel) */
.enhanced-album-meta-row {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 12px;
padding: 12px 16px;
background: rgba(255,255,255,0.02);
border-radius: 8px;
margin-bottom: 12px;
border: 1px solid rgba(255,255,255,0.05);
}
.enhanced-album-meta-field {
display: flex;
flex-direction: column;
gap: 3px;
}
.enhanced-album-meta-label {
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255,255,255,0.35);
}
.enhanced-album-meta-input {
width: 100%;
padding: 6px 10px;
background: rgba(255,255,255,0.05);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 6px;
color: #ffffff;
font-size: 12px;
font-family: inherit;
transition: all 0.2s ease;
box-sizing: border-box;
}
.enhanced-album-meta-input:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.5);
background: rgba(var(--accent-rgb), 0.04);
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.1);
}
.enhanced-album-save-btn {
align-self: flex-end;
padding: 6px 14px;
background: rgb(var(--accent-rgb));
color: #fff;
border: none;
border-radius: 6px;
font-size: 11px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.enhanced-album-save-btn:hover {
background: rgb(var(--accent-light-rgb));
}
/* Track Table */
.enhanced-track-table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
contain: layout style;
}
.enhanced-track-table th {
background: rgba(255,255,255,0.06);
color: rgba(255,255,255,0.7);
font-weight: 600;
padding: 10px 10px;
text-align: left;
border-bottom: 1px solid rgba(255,255,255,0.1);
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
position: sticky;
top: 0;
z-index: 1;
}
.enhanced-track-table th:first-child { width: 36px; text-align: center; }
.enhanced-track-table .col-play { width: 36px; text-align: center; padding: 0 4px; }
.enhanced-track-table .col-num { width: 45px; text-align: center; }
.enhanced-track-table .col-title { width: auto; }
.enhanced-track-table .col-duration { width: 70px; text-align: right; }
.enhanced-track-table .col-format { width: 80px; }
.enhanced-track-table .col-bitrate { width: 75px; text-align: right; }
.enhanced-track-table .col-path { width: 25%; }
.enhanced-track-table .col-bpm { width: 60px; text-align: right; }
.enhanced-track-table .col-actions { width: 50px; text-align: center; }
.enhanced-track-table .col-queue,
.enhanced-track-table .col-writetag,
.enhanced-track-table .col-delete { padding-left: 4px; padding-right: 4px; }
/* Mobile actions column — hidden on desktop, shown on mobile via mobile.css */
.enhanced-track-table .col-mobile-actions { display: none; }
.enhanced-mobile-actions-btn {
background: none;
border: 1px solid rgba(255, 255, 255, 0.12);
color: rgba(255, 255, 255, 0.5);
border-radius: 50%;
width: 28px;
height: 28px;
font-size: 14px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
letter-spacing: 1px;
}
.enhanced-mobile-actions-btn:active {
background: rgba(255, 255, 255, 0.1);
color: #fff;
}
.enhanced-track-table td {
padding: 8px 10px;
border-bottom: 1px solid rgba(255,255,255,0.04);
font-size: 13px;
color: rgba(255,255,255,0.85);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: middle;
}
.enhanced-track-table td:first-child { text-align: center; }
.enhanced-track-table td.col-num { text-align: center; color: rgba(255,255,255,0.4); font-size: 12px; }
.enhanced-track-table td.col-duration { text-align: right; color: rgba(255,255,255,0.5); font-size: 12px; }
.enhanced-track-table td.col-bitrate { text-align: right; }
.enhanced-track-table td.col-bpm { text-align: right; color: rgba(255,255,255,0.5); }
.enhanced-track-table td.col-path {
font-family: 'SF Mono', 'Consolas', 'Courier New', monospace;
font-size: 11px;
color: rgba(255,255,255,0.35);
direction: rtl;
text-align: left;
}
.enhanced-track-table tr:hover {
background: rgba(255,255,255,0.03);
}
.enhanced-track-table tr.selected {
background: rgba(var(--accent-rgb), 0.06);
}
/* Play button */
.enhanced-play-btn {
background: none;
border: none;
color: rgba(var(--accent-rgb), 0.7);
font-size: 12px;
cursor: pointer;
padding: 4px 6px;
border-radius: 50%;
transition: all 0.2s ease;
line-height: 1;
display: inline-flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
}
.enhanced-play-btn:hover {
color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.12);
transform: scale(1.15);
}
.enhanced-play-btn:disabled {
color: rgba(255,255,255,0.15);
cursor: not-allowed;
transform: none;
background: none;
}
/* Editable cells */
.enhanced-track-table td.editable {
cursor: text;
position: relative;
}
.enhanced-track-table td.editable:hover {
background: rgba(var(--accent-rgb), 0.04);
}
.enhanced-track-table td.editable:hover::after {
content: '\270E';
position: absolute;
right: 4px;
top: 50%;
transform: translateY(-50%);
font-size: 10px;
color: rgba(var(--accent-rgb), 0.5);
}
/* Inline Edit Input */
.enhanced-inline-input {
width: 100%;
padding: 4px 8px;
background: rgba(var(--accent-rgb), 0.06);
border: 1px solid rgba(var(--accent-rgb), 0.5);
border-radius: 4px;
color: #ffffff;
font-size: 13px;
font-family: inherit;
outline: none;
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.15);
box-sizing: border-box;
}
.enhanced-inline-input.num {
text-align: right;
font-variant-numeric: tabular-nums;
}
/* Track Checkbox */
.enhanced-track-checkbox {
width: 16px;
height: 16px;
accent-color: rgb(var(--accent-light-rgb));
cursor: pointer;
}
/* Format Badge */
.enhanced-format-badge {
display: inline-block;
padding: 2px 6px;
border-radius: 4px;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.3px;
}
.enhanced-format-badge.flac {
background: rgba(255, 184, 77, 0.15);
color: #ffb84d;
}
.enhanced-format-badge.mp3 {
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-light-rgb));
}
.enhanced-format-badge.other {
background: rgba(255,255,255,0.08);
color: rgba(255,255,255,0.5);
}
/* Bitrate display */
.enhanced-bitrate {
font-variant-numeric: tabular-nums;
font-size: 12px;
}
.enhanced-bitrate.high { color: rgb(var(--accent-light-rgb)); }
.enhanced-bitrate.medium { color: #ffb84d; }
.enhanced-bitrate.low { color: #ff6b6b; }
/* Bulk Actions Bar */
.enhanced-bulk-bar {
position: fixed;
bottom: -80px;
left: 240px;
right: 0;
height: 60px;
background: linear-gradient(135deg, rgba(30,30,30,0.98), rgba(20,20,20,0.98));
backdrop-filter: blur(12px);
border-top: 1px solid rgba(var(--accent-rgb), 0.25);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32px;
z-index: 100;
transition: bottom 0.3s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 -4px 20px rgba(0,0,0,0.4);
}
.enhanced-bulk-bar.visible {
bottom: 0;
}
.enhanced-bulk-bar-info {
display: flex;
align-items: center;
gap: 12px;
}
.enhanced-bulk-bar-count {
font-size: 14px;
font-weight: 600;
color: rgb(var(--accent-light-rgb));
}
.enhanced-bulk-bar-label {
font-size: 13px;
color: rgba(255,255,255,0.6);
}
.enhanced-bulk-bar-actions {
display: flex;
gap: 8px;
}
.enhanced-bulk-btn {
padding: 8px 16px;
border: none;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.enhanced-bulk-btn.primary {
background: rgb(var(--accent-rgb));
color: #ffffff;
}
.enhanced-bulk-btn.primary:hover {
background: rgb(var(--accent-light-rgb));
}
.enhanced-bulk-btn.secondary {
background: rgba(255,255,255,0.1);
color: rgba(255,255,255,0.8);
}
.enhanced-bulk-btn.secondary:hover {
background: rgba(255,255,255,0.15);
}
.enhanced-bulk-btn.clear {
background: rgba(255, 65, 54, 0.1);
color: #ff4136;
}
.enhanced-bulk-btn.clear:hover {
background: rgba(255, 65, 54, 0.2);
}
/* Bulk Edit Modal */
.enhanced-bulk-modal {
background: linear-gradient(135deg, #1a1a1a 0%, #121212 100%);
border-radius: 16px;
border: 1px solid rgba(var(--accent-rgb), 0.2);
width: 500px;
max-width: 90vw;
box-shadow: 0 25px 80px rgba(0,0,0,0.7);
}
.enhanced-bulk-modal-header {
padding: 20px 24px;
border-bottom: 1px solid rgba(var(--accent-rgb), 0.15);
display: flex;
justify-content: space-between;
align-items: center;
}
.enhanced-bulk-modal-header h3 {
font-size: 18px;
font-weight: 700;
color: #ffffff;
margin: 0;
}
.enhanced-bulk-modal-close {
background: rgba(255,255,255,0.1);
color: rgba(255,255,255,0.8);
border: none;
border-radius: 50%;
width: 32px;
height: 32px;
cursor: pointer;
font-size: 16px;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.enhanced-bulk-modal-close:hover {
background: rgba(255,255,255,0.2);
transform: scale(1.1);
}
.enhanced-bulk-modal-body {
padding: 24px;
display: flex;
flex-direction: column;
gap: 16px;
}
.enhanced-bulk-modal-field {
display: flex;
flex-direction: column;
gap: 6px;
}
.enhanced-bulk-modal-field label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255,255,255,0.5);
}
.enhanced-bulk-modal-field input,
.enhanced-bulk-modal-field select {
padding: 10px 14px;
background: rgba(255,255,255,0.06);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px;
color: #fff;
font-size: 13px;
font-family: inherit;
}
.enhanced-bulk-modal-field input:focus,
.enhanced-bulk-modal-field select:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.1);
}
.enhanced-bulk-modal-footer {
padding: 16px 24px;
border-top: 1px solid rgba(255,255,255,0.06);
display: flex;
justify-content: flex-end;
gap: 8px;
}
/* Empty album state */
.enhanced-no-tracks {
padding: 20px;
text-align: center;
color: rgba(255,255,255,0.3);
font-size: 13px;
font-style: italic;
}
/* Scrollbar for track panels */
.enhanced-tracks-panel-inner::-webkit-scrollbar { width: 6px; }
.enhanced-tracks-panel-inner::-webkit-scrollbar-track { background: rgba(255,255,255,0.03); border-radius: 10px; }
.enhanced-tracks-panel-inner::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb), 0.3); border-radius: 10px; }
.enhanced-tracks-panel-inner::-webkit-scrollbar-thumb:hover { background: rgba(var(--accent-rgb), 0.5); }
/* Loading state for enhanced view */
.enhanced-view-container .enhanced-loading {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
padding: 60px 0;
color: rgba(255,255,255,0.5);
font-size: 14px;
}
.enhanced-view-container .enhanced-loading::before {
content: '';
width: 20px;
height: 20px;
border: 2px solid rgba(var(--accent-rgb), 0.3);
border-top: 2px solid rgb(var(--accent-rgb));
border-radius: 50%;
animation: spin 1s linear infinite;
}
/* Enrich Dropdown */
.enhanced-enrich-wrap {
position: relative;
display: inline-block;
}
.enhanced-enrich-btn {
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.2);
color: rgb(var(--accent-light-rgb));
padding: 8px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}
.enhanced-enrich-btn:hover {
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.35);
}
.enhanced-sync-btn {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.7);
padding: 8px 16px;
border-radius: 8px;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
font-family: inherit;
}
.enhanced-sync-btn:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
color: #fff;
}
.enhanced-sync-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* ═══════════════════════════════════════════════════════════════════════════
DOWNLOAD DISCOGRAPHY — Button + Modal
═══════════════════════════════════════════════════════════════════════════ */
.discog-download-wrap { margin: 12px 0 4px; }
.discog-download-btn {
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
width: 100%;
padding: 10px 20px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.15) 0%, rgba(var(--accent-rgb), 0.05) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.25);
border-radius: 10px;
color: rgb(var(--accent-light-rgb));
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: all 0.25s ease;
overflow: hidden;
font-family: inherit;
}
.discog-download-btn:hover {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.25) 0%, rgba(var(--accent-rgb), 0.1) 100%);
border-color: rgba(var(--accent-rgb), 0.4);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.2);
}
.discog-btn-icon { font-size: 15px; }
.discog-btn-compact {
width: auto;
max-width: 220px;
padding: 7px 16px;
font-size: 12px;
border-radius: 8px;
margin-top: 8px;
}
.discog-btn-compact .discog-btn-icon { font-size: 12px; }
.discog-btn-shimmer {
position: absolute;
top: 0; left: -100%; width: 50%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.06), transparent);
animation: discogShimmer 3s ease-in-out infinite;
}
@keyframes discogShimmer {
0%, 100% { left: -100%; }
50% { left: 150%; }
}
/* Modal overlay */
.discog-modal-overlay {
position: fixed; inset: 0; z-index: 100000;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(8px);
display: flex; align-items: center; justify-content: center;
opacity: 0; transition: opacity 0.3s ease;
}
.discog-modal-overlay.visible { opacity: 1; }
.discog-modal {
width: 680px; max-width: 95vw; max-height: 85vh;
background: rgba(14, 14, 14, 0.97);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 18px;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.7);
backdrop-filter: blur(24px);
display: flex; flex-direction: column;
overflow: hidden;
transform: scale(0.96) translateY(8px);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.discog-modal-overlay.visible .discog-modal {
transform: scale(1) translateY(0);
}
/* Hero header */
.discog-modal-hero {
position: relative;
padding: 28px 24px 20px;
background-size: cover;
background-position: center;
min-height: 80px;
}
.discog-modal-hero-overlay {
position: absolute; inset: 0;
background: linear-gradient(180deg, rgba(14,14,14,0.6) 0%, rgba(14,14,14,0.95) 100%);
backdrop-filter: blur(20px);
}
.discog-modal-hero-content { position: relative; z-index: 1; }
.discog-modal-title {
font-size: 20px; font-weight: 800; color: #fff;
letter-spacing: -0.3px; margin: 0 0 4px;
}
.discog-modal-artist {
font-size: 14px; color: rgba(var(--accent-light-rgb), 0.8);
margin: 0; font-weight: 600;
}
.discog-modal-close {
position: absolute; top: 14px; right: 14px; z-index: 2;
background: rgba(255,255,255,0.1); border: none; border-radius: 50%;
width: 32px; height: 32px; display: flex; align-items: center; justify-content: center;
color: rgba(255,255,255,0.5); font-size: 18px; cursor: pointer;
transition: all 0.15s ease;
}
.discog-modal-close:hover { background: rgba(255,255,255,0.2); color: #fff; }
/* Filter bar */
.discog-filter-bar {
display: flex; justify-content: space-between; align-items: center;
padding: 10px 20px; border-bottom: 1px solid rgba(255,255,255,0.06);
flex-shrink: 0;
}
.discog-filters { display: flex; gap: 6px; }
.discog-filter {
padding: 5px 14px; border-radius: 20px; font-size: 12px; font-weight: 600;
background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08);
color: rgba(255,255,255,0.4); cursor: pointer; transition: all 0.15s ease;
font-family: inherit;
}
.discog-filter.active {
background: rgba(var(--accent-rgb), 0.12);
border-color: rgba(var(--accent-rgb), 0.25);
color: rgb(var(--accent-light-rgb));
}
.discog-select-actions { display: flex; gap: 6px; }
.discog-select-btn {
padding: 4px 10px; border-radius: 6px; font-size: 11px; font-weight: 600;
background: transparent; border: 1px solid rgba(255,255,255,0.08);
color: rgba(255,255,255,0.4); cursor: pointer; transition: all 0.15s ease;
font-family: inherit;
}
.discog-select-btn:hover { color: rgba(255,255,255,0.7); border-color: rgba(255,255,255,0.15); }
/* Album grid */
.discog-section-header {
grid-column: 1 / -1;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.35);
padding: 10px 4px 4px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.discog-section-header:first-child {
padding-top: 0;
}
.discog-grid {
display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 8px; padding: 14px 20px; overflow-y: auto; flex: 1; min-height: 0;
}
.discog-card {
display: flex; align-items: center; gap: 10px;
padding: 8px 10px; border-radius: 10px;
background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.04);
cursor: pointer; transition: all 0.15s ease;
animation: discogCardIn 0.3s ease backwards;
}
@keyframes discogCardIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.discog-card:hover { background: rgba(var(--accent-rgb), 0.05); border-color: rgba(var(--accent-rgb), 0.12); }
.discog-card.owned { opacity: 0.5; }
.discog-card.partial { border-left: 3px solid rgba(255, 193, 7, 0.5); }
.discog-card-cb { display: none; }
.discog-card-art {
position: relative; width: 44px; height: 44px; border-radius: 6px;
overflow: hidden; flex-shrink: 0; background: rgba(255,255,255,0.04);
}
.discog-card-art img { width: 100%; height: 100%; object-fit: cover; }
.discog-card-art-placeholder { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 18px; }
.discog-card-status {
position: absolute; bottom: 2px; right: 2px;
background: rgba(0,0,0,0.7); border-radius: 4px;
font-size: 10px; padding: 1px 4px; color: #4caf50;
}
.discog-card-info { flex: 1; min-width: 0; }
.discog-card-title {
font-size: 13px; font-weight: 600; color: #fff;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.discog-card-meta { font-size: 11px; color: rgba(255,255,255,0.35); margin-top: 2px; }
.discog-card-check {
width: 20px; height: 20px; border-radius: 6px; flex-shrink: 0;
border: 2px solid rgba(255,255,255,0.15); transition: all 0.15s ease;
display: flex; align-items: center; justify-content: center;
}
.discog-card-cb:checked ~ .discog-card-check {
background: rgb(var(--accent-rgb));
border-color: rgb(var(--accent-rgb));
}
.discog-card-cb:checked ~ .discog-card-check::after {
content: '✓'; color: #fff; font-size: 12px; font-weight: 700;
}
/* Footer */
.discog-footer {
display: flex; justify-content: space-between; align-items: center;
padding: 14px 20px; border-top: 1px solid rgba(255,255,255,0.06);
flex-shrink: 0;
}
.discog-footer-info { font-size: 13px; color: rgba(255,255,255,0.45); font-weight: 600; }
.discog-footer-actions { display: flex; gap: 10px; }
.discog-cancel-btn {
padding: 8px 18px; border-radius: 8px; font-size: 13px; font-weight: 600;
background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08);
color: rgba(255,255,255,0.6); cursor: pointer; transition: all 0.15s ease;
font-family: inherit;
}
.discog-cancel-btn:hover { background: rgba(255,255,255,0.1); color: #fff; }
.discog-submit-btn {
display: flex; align-items: center; gap: 6px;
padding: 8px 20px; border-radius: 8px; font-size: 13px; font-weight: 700;
background: linear-gradient(135deg, rgb(var(--accent-rgb)), rgba(var(--accent-rgb), 0.7));
border: none; color: #fff; cursor: pointer;
transition: all 0.2s ease; font-family: inherit;
}
.discog-submit-btn:hover { filter: brightness(1.15); box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3); }
.discog-submit-btn:disabled { opacity: 0.4; cursor: not-allowed; filter: none; }
.discog-submit-icon { font-size: 14px; }
/* Progress view */
.discog-progress { padding: 14px 20px; overflow-y: auto; flex: 1; min-height: 0; }
.discog-progress-item {
display: flex; align-items: center; gap: 12px;
padding: 10px 12px; border-radius: 8px; margin-bottom: 6px;
background: rgba(255,255,255,0.02); transition: all 0.3s ease;
}
.discog-progress-item.active { background: rgba(var(--accent-rgb), 0.06); }
.discog-progress-item.done { background: rgba(76, 175, 80, 0.05); }
.discog-progress-item.skipped { opacity: 0.5; }
.discog-progress-item.error { background: rgba(255, 82, 82, 0.05); }
.discog-prog-art {
width: 36px; height: 36px; border-radius: 6px; overflow: hidden; flex-shrink: 0;
background: rgba(255,255,255,0.04); display: flex; align-items: center; justify-content: center;
font-size: 16px;
}
.discog-prog-art img { width: 100%; height: 100%; object-fit: cover; }
.discog-prog-info { flex: 1; min-width: 0; }
.discog-prog-title {
font-size: 13px; font-weight: 600; color: #fff;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.discog-prog-status { font-size: 11px; color: rgba(255,255,255,0.4); margin-top: 2px; }
.discog-prog-icon { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.discog-spinner {
width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.1);
border-top-color: rgb(var(--accent-rgb)); border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.discog-check { color: #4caf50; font-size: 16px; font-weight: 700; animation: discogPop 0.3s ease; }
.discog-skip { color: rgba(255,255,255,0.3); font-size: 16px; }
.discog-error { color: #ff5252; font-size: 16px; }
@keyframes discogPop {
0% { transform: scale(0); }
70% { transform: scale(1.2); }
100% { transform: scale(1); }
}
/* Mobile */
@media (max-width: 768px) {
.discog-modal { max-width: 100vw; max-height: 100vh; border-radius: 0; }
.discog-grid { grid-template-columns: 1fr; }
.discog-filter-bar { flex-wrap: wrap; gap: 8px; }
}
.enhanced-enrich-btn.small {
padding: 5px 12px;
font-size: 11px;
}
.enhanced-enrich-menu {
display: none;
position: absolute;
top: calc(100% + 4px);
right: 0;
background: rgba(20, 20, 20, 0.98);
border: 1px solid rgba(255,255,255,0.12);
border-radius: 10px;
padding: 6px;
min-width: 180px;
z-index: 100;
backdrop-filter: blur(20px);
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
}
.enhanced-enrich-menu.visible {
display: block;
}
.enhanced-enrich-menu-item {
padding: 8px 14px;
font-size: 13px;
color: rgba(255,255,255,0.8);
cursor: pointer;
border-radius: 6px;
transition: background 0.15s ease;
white-space: nowrap;
}
.enhanced-enrich-menu-item:hover {
background: rgba(var(--accent-rgb), 0.12);
color: #fff;
}
/* Match Status Chips */
.enhanced-match-status-row {
display: flex;
flex-wrap: wrap;
gap: 6px;
padding: 10px 20px;
border-top: 1px solid rgba(255,255,255,0.04);
}
.enhanced-match-status-row.compact {
padding: 8px 0;
border-top: none;
}
.enhanced-match-chip {
display: inline-block;
padding: 3px 10px;
border-radius: 12px;
font-size: 11px;
font-weight: 500;
border: 1px solid rgba(255,255,255,0.08);
background: rgba(255,255,255,0.03);
color: rgba(255,255,255,0.45);
}
.enhanced-match-chip.matched {
color: rgb(var(--accent-rgb));
border-color: rgba(var(--accent-rgb), 0.25);
background: rgba(var(--accent-rgb), 0.06);
}
.enhanced-match-chip.not-found {
color: rgba(255, 100, 100, 0.7);
border-color: rgba(255, 100, 100, 0.15);
background: rgba(255, 100, 100, 0.04);
}
.enhanced-match-chip.clickable {
cursor: pointer;
transition: all 0.15s ease;
}
.enhanced-match-chip.clickable:hover {
filter: brightness(1.3);
transform: translateY(-1px);
border-color: rgba(var(--accent-rgb), 0.4);
}
.enhanced-match-chip.loading {
opacity: 0.6;
pointer-events: none;
animation: chipPulse 1.2s ease-in-out infinite;
}
@keyframes chipPulse {
0%, 100% { opacity: 0.4; }
50% { opacity: 0.8; }
}
/* Expanded Album Actions */
.enhanced-expanded-actions {
display: flex;
gap: 8px;
margin-top: 8px;
}
/* iTunes ID badge */
.enhanced-id-badge.itunes {
background: rgba(255, 45, 85, 0.12);
color: rgba(255, 45, 85, 0.9);
border-color: rgba(255, 45, 85, 0.2);
}
/* ===== Manual Match Modal ===== */
.enhanced-manual-match-modal {
background: linear-gradient(165deg, rgba(28,28,28,0.98), rgba(14,14,14,0.99));
border: 1px solid rgba(255,255,255,0.08);
border-radius: 16px;
width: 560px;
max-width: 95vw;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 24px 80px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.04);
overflow: hidden;
}
.enhanced-match-search-row {
display: flex;
gap: 8px;
padding: 16px 20px;
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.enhanced-match-search-input {
flex: 1;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 8px;
padding: 10px 14px;
color: #fff;
font-size: 14px;
outline: none;
transition: border-color 0.2s;
}
.enhanced-match-search-input:focus {
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.08);
}
.enhanced-match-results {
flex: 1;
overflow-y: auto;
padding: 12px 20px;
min-height: 200px;
max-height: 50vh;
}
.enhanced-match-results-hint {
text-align: center;
color: rgba(255,255,255,0.35);
font-size: 13px;
padding: 40px 20px;
}
.enhanced-match-result-row {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border-radius: 10px;
border: 1px solid rgba(255,255,255,0.04);
margin-bottom: 8px;
background: rgba(255,255,255,0.02);
transition: background 0.15s, border-color 0.15s;
}
.enhanced-match-result-row:hover {
background: rgba(var(--accent-rgb), 0.04);
border-color: rgba(var(--accent-rgb), 0.15);
}
.enhanced-match-result-img {
width: 48px;
height: 48px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: rgba(255,255,255,0.05);
}
.enhanced-match-result-img-placeholder {
width: 48px;
height: 48px;
border-radius: 6px;
flex-shrink: 0;
background: rgba(255,255,255,0.05);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
color: rgba(255,255,255,0.2);
}
.enhanced-match-result-info {
flex: 1;
min-width: 0;
}
.enhanced-match-result-name {
font-size: 14px;
font-weight: 500;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.enhanced-match-result-extra {
font-size: 12px;
color: rgba(255,255,255,0.45);
margin-top: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.enhanced-match-result-id {
font-size: 11px;
color: rgba(255,255,255,0.25);
margin-top: 2px;
font-family: monospace;
}
/* Track-level match status */
.enhanced-track-match-cell {
display: flex;
flex-wrap: wrap;
gap: 3px;
}
.enhanced-track-match-chip {
display: inline-block;
padding: 1px 6px;
border-radius: 8px;
font-size: 9px;
font-weight: 500;
border: 1px solid rgba(255,255,255,0.06);
background: rgba(255,255,255,0.02);
color: rgba(255,255,255,0.35);
cursor: pointer;
transition: all 0.15s ease;
white-space: nowrap;
}
.enhanced-track-match-chip.matched {
color: rgb(var(--accent-rgb));
border-color: rgba(var(--accent-rgb), 0.2);
background: rgba(var(--accent-rgb), 0.05);
}
.enhanced-track-match-chip.not-found {
color: rgba(255, 100, 100, 0.6);
border-color: rgba(255, 100, 100, 0.12);
background: rgba(255, 100, 100, 0.03);
}
.enhanced-track-match-chip:hover {
filter: brightness(1.3);
transform: translateY(-1px);
border-color: rgba(var(--accent-rgb), 0.3);
}
.enhanced-track-table .col-match {
min-width: 120px;
white-space: nowrap;
}
.enhanced-track-table .col-disc {
width: 40px;
text-align: center;
color: rgba(255,255,255,0.4);
font-size: 12px;
}
.enhanced-track-table .col-track-actions {
width: auto;
text-align: right;
}
.enhanced-delete-btn {
background: none;
border: 1px solid rgba(255, 80, 80, 0.15);
color: rgba(255, 80, 80, 0.4);
border-radius: 50%;
width: 24px;
height: 24px;
font-size: 12px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s ease;
padding: 0;
}
.enhanced-delete-btn:hover {
background: rgba(255, 60, 60, 0.12);
color: rgba(255, 80, 80, 0.9);
border-color: rgba(255, 80, 80, 0.35);
transform: scale(1.1);
}
.enhanced-delete-album-btn {
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
background: rgba(255, 60, 60, 0.06);
border: 1px solid rgba(255, 60, 60, 0.15);
color: rgba(255, 80, 80, 0.6);
transition: all 0.15s ease;
}
.enhanced-delete-album-btn:hover {
background: rgba(255, 60, 60, 0.12);
color: rgba(255, 80, 80, 0.9);
border-color: rgba(255, 60, 60, 0.35);
}
/* Sortable column headers */
.enhanced-track-table th[style*="cursor: pointer"]:hover {
color: rgb(var(--accent-rgb));
}
/* ========== Expanded Now Playing Modal ========== */
.np-modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(4, 4, 4, 0.92);
backdrop-filter: blur(32px);
-webkit-backdrop-filter: blur(32px);
z-index: 10001;
display: flex;
align-items: center;
justify-content: center;
opacity: 1;
transition: opacity 0.3s ease;
}
.np-modal-overlay.hidden {
opacity: 0;
pointer-events: none;
}
.np-modal {
--np-ambient-r: 29;
--np-ambient-g: 185;
--np-ambient-b: 84;
width: 90vw;
max-width: 880px;
max-height: 85vh;
background: linear-gradient(180deg, rgba(24, 24, 24, 0.97) 0%, rgba(10, 10, 10, 1) 100%);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 20px;
box-shadow: 0 32px 100px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.03);
position: relative;
overflow: hidden;
transform: scale(1);
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
.np-modal::before {
content: '';
position: absolute;
top: -40%;
left: -20%;
width: 140%;
height: 100%;
background: radial-gradient(ellipse at 30% 20%,
rgba(var(--np-ambient-r), var(--np-ambient-g), var(--np-ambient-b), 0.35) 0%,
rgba(var(--np-ambient-r), var(--np-ambient-g), var(--np-ambient-b), 0.08) 40%,
transparent 70%);
pointer-events: none;
z-index: 0;
transition: background 1.2s ease;
filter: blur(40px);
}
.np-modal > * {
position: relative;
z-index: 1;
}
.np-modal-overlay.hidden .np-modal {
transform: scale(0.92);
}
.np-close-btn {
position: absolute;
top: 16px;
right: 20px;
background: none;
border: none;
color: rgba(255, 255, 255, 0.3);
font-size: 28px;
cursor: pointer;
z-index: 2;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.15s ease;
}
.np-close-btn:hover {
color: rgba(255, 255, 255, 0.7);
background: rgba(255, 255, 255, 0.06);
}
/* Layout */
.np-body {
display: flex;
flex-direction: row;
padding: 48px 40px 36px;
gap: 48px;
align-items: flex-start;
}
.np-left {
flex: 0 0 auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
}
.np-right {
flex: 1;
display: flex;
flex-direction: column;
gap: 24px;
min-width: 0;
justify-content: center;
}
/* Album Art */
.np-album-art-container {
width: 300px;
height: 300px;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5), 0 2px 12px rgba(0, 0, 0, 0.3);
position: relative;
background: rgba(255, 255, 255, 0.03);
flex-shrink: 0;
}
.np-album-art {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.np-album-art.hidden {
display: none;
}
.np-album-art-placeholder {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, rgba(30, 30, 30, 1) 0%, rgba(18, 18, 18, 1) 100%);
color: rgba(255, 255, 255, 0.12);
}
.np-album-art:not(.hidden) + .np-album-art-placeholder {
display: none;
}
/* Track Info */
.np-track-info {
text-align: center;
width: 300px;
}
.np-track-title {
font-size: 22px;
font-weight: 700;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
letter-spacing: -0.3px;
}
.np-artist-name {
font-size: 15px;
font-weight: 500;
color: rgba(255, 255, 255, 0.55);
margin-top: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.np-album-name {
font-size: 13px;
color: rgba(255, 255, 255, 0.35);
font-style: italic;
margin-top: 3px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.np-format-badges {
display: flex;
gap: 6px;
justify-content: center;
margin-top: 10px;
flex-wrap: wrap;
}
.np-format-badge {
padding: 2px 8px;
border-radius: 4px;
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.45);
border: 1px solid rgba(255, 255, 255, 0.06);
}
.np-format-badge.flac {
color: rgba(var(--accent-rgb), 0.9);
background: rgba(var(--accent-rgb), 0.08);
border-color: rgba(var(--accent-rgb), 0.15);
}
/* Progress Section */
.np-progress-section {
width: 100%;
}
.np-progress-bar-container {
position: relative;
height: 20px;
display: flex;
align-items: center;
cursor: pointer;
}
.np-progress-track {
position: absolute;
width: 100%;
height: 4px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
overflow: hidden;
}
.np-progress-bar-container:hover .np-progress-track {
height: 6px;
}
.np-progress-fill {
height: 100%;
background: rgb(var(--accent-rgb));
border-radius: 2px;
width: 0%;
transition: width 0.1s linear;
}
.np-progress-bar {
position: absolute;
width: 100%;
height: 20px;
-webkit-appearance: none;
appearance: none;
background: transparent;
cursor: pointer;
margin: 0;
z-index: 1;
}
.np-progress-bar::-webkit-slider-thumb {
-webkit-appearance: none;
width: 14px;
height: 14px;
border-radius: 50%;
background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
cursor: pointer;
opacity: 0;
transition: opacity 0.15s;
}
.np-progress-bar-container:hover .np-progress-bar::-webkit-slider-thumb {
opacity: 1;
}
.np-progress-bar::-moz-range-thumb {
width: 14px;
height: 14px;
border-radius: 50%;
background: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
cursor: pointer;
border: none;
}
.np-progress-bar::-moz-range-track {
background: transparent;
border: none;
height: 4px;
}
.np-time-display {
display: flex;
justify-content: space-between;
margin-top: 6px;
}
.np-current-time,
.np-total-time {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
font-variant-numeric: tabular-nums;
min-width: 36px;
}
.np-total-time {
text-align: right;
}
/* Controls Row */
.np-controls-row {
display: flex;
align-items: center;
justify-content: center;
gap: 20px;
}
.np-btn {
background: none;
border: none;
color: rgba(255, 255, 255, 0.6);
cursor: pointer;
padding: 8px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s ease;
}
.np-btn:hover {
color: #fff;
transform: scale(1.08);
}
.np-btn:active {
transform: scale(0.95);
}
.np-btn:disabled {
color: rgba(255, 255, 255, 0.15);
cursor: default;
transform: none;
}
.np-btn-play {
width: 60px;
height: 60px;
border-radius: 50%;
background: rgb(var(--accent-rgb));
color: #000;
box-shadow: 0 4px 20px rgba(var(--accent-rgb), 0.3);
position: relative;
}
.np-btn-play:hover {
filter: brightness(1.15);
transform: scale(1.05);
box-shadow: 0 6px 28px rgba(var(--accent-rgb), 0.4);
}
.np-btn-play:active {
filter: brightness(0.9);
transform: scale(0.97);
}
.np-btn-shuffle.active,
.np-btn-repeat.active {
color: rgb(var(--accent-rgb));
}
.np-btn-shuffle.active::after,
.np-btn-repeat.active::after {
content: '';
position: absolute;
bottom: 2px;
left: 50%;
transform: translateX(-50%);
width: 4px;
height: 4px;
border-radius: 50%;
background: rgb(var(--accent-rgb));
}
.np-btn-shuffle,
.np-btn-repeat {
position: relative;
}
/* Volume Row */
.np-volume-row {
display: flex;
align-items: center;
gap: 10px;
justify-content: center;
}
.np-mute-btn {
background: none;
border: none;
color: rgba(255, 255, 255, 0.5);
cursor: pointer;
padding: 4px;
display: flex;
align-items: center;
justify-content: center;
transition: color 0.15s;
}
.np-mute-btn:hover {
color: #fff;
}
.np-mute-btn.muted {
color: rgba(255, 80, 80, 0.7);
}
.np-volume-slider-container {
position: relative;
width: 160px;
height: 20px;
display: flex;
align-items: center;
}
.np-volume-track {
position: absolute;
width: 100%;
height: 4px;
background: rgba(255, 255, 255, 0.08);
border-radius: 2px;
overflow: hidden;
}
.np-volume-fill {
height: 100%;
background: rgb(var(--accent-rgb));
border-radius: 2px;
width: 70%;
transition: width 0.05s linear;
}
.np-volume-slider {
position: absolute;
width: 100%;
height: 20px;
-webkit-appearance: none;
appearance: none;
background: transparent;
cursor: pointer;
margin: 0;
z-index: 1;
}
.np-volume-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 12px;
height: 12px;
border-radius: 50%;
background: #fff;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
cursor: pointer;
}
.np-volume-slider::-moz-range-thumb {
width: 12px;
height: 12px;
border-radius: 50%;
background: #fff;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
cursor: pointer;
border: none;
}
.np-volume-slider::-moz-range-track {
background: transparent;
border: none;
height: 4px;
}
/* Stop Row */
.np-stop-row {
display: flex;
justify-content: center;
}
.np-btn-stop {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 20px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
cursor: pointer;
transition: all 0.15s ease;
}
.np-btn-stop:hover {
background: rgba(255, 60, 60, 0.08);
border-color: rgba(255, 60, 60, 0.2);
color: rgba(255, 80, 80, 0.8);
}
/* Visualizer */
.np-visualizer {
display: flex;
align-items: flex-end;
justify-content: center;
gap: 3px;
height: 24px;
margin-top: 8px;
opacity: 0.5;
}
.np-viz-bar {
width: 3px;
background: rgb(var(--accent-rgb));
border-radius: 1.5px;
height: 24px;
transform-origin: bottom;
transform: scaleY(0.125);
will-change: transform;
transition: transform 0.06s ease-out;
}
/* CSS fallback animation when Web Audio is not available */
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar {
animation: npVizPulse 0.8s ease-in-out infinite alternate;
}
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(1) { animation-delay: 0s; }
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(2) { animation-delay: 0.1s; }
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(3) { animation-delay: 0.2s; }
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(4) { animation-delay: 0.15s; }
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(5) { animation-delay: 0.25s; }
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(6) { animation-delay: 0.05s; }
.np-visualizer.playing.np-viz-css-fallback .np-viz-bar:nth-child(7) { animation-delay: 0.18s; }
@keyframes npVizPulse {
0% { transform: scaleY(0.125); }
100% { transform: scaleY(0.83); }
}
/* Track text transition animation */
.np-text-transition {
animation: npTextFade 0.35s ease;
}
@keyframes npTextFade {
0% { opacity: 0; transform: translateY(6px); }
100% { opacity: 1; transform: translateY(0); }
}
/* Repeat-one badge */
.np-repeat-one-badge {
position: absolute;
top: 2px;
right: 0px;
font-size: 9px;
font-weight: 700;
color: rgb(var(--accent-rgb));
line-height: 1;
pointer-events: none;
}
.np-repeat-one-badge.hidden {
display: none;
}
/* Action buttons row */
.np-action-buttons {
display: flex;
gap: 8px;
justify-content: center;
margin-top: 12px;
}
.np-action-btn {
display: flex;
align-items: center;
gap: 5px;
padding: 5px 12px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.35);
font-size: 11px;
cursor: pointer;
transition: all 0.15s ease;
}
.np-action-btn:hover {
color: rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.12);
}
.np-action-buttons.hidden {
display: none;
}
/* Buffering ring on play button */
.np-buffering-ring {
position: absolute;
top: -4px;
left: -4px;
right: -4px;
bottom: -4px;
border-radius: 50%;
border: 2.5px solid transparent;
border-top-color: rgb(var(--accent-rgb));
animation: npBufferSpin 0.9s linear infinite;
pointer-events: none;
}
.np-buffering-ring.hidden {
display: none;
}
@keyframes npBufferSpin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Radio mode button */
.np-radio-btn {
background: none;
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.35);
font-size: 11px;
padding: 3px 8px;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
gap: 4px;
transition: all 0.15s ease;
}
.np-radio-btn:hover {
color: rgba(255, 255, 255, 0.7);
border-color: rgba(255, 255, 255, 0.2);
}
.np-radio-btn.active {
color: rgb(var(--accent-rgb));
border-color: rgba(var(--accent-rgb), 0.3);
background: rgba(var(--accent-rgb), 0.08);
}
.np-queue-header-actions {
display: flex;
align-items: center;
gap: 8px;
}
/* Queue panel scrollbar */
.np-queue-body::-webkit-scrollbar {
width: 6px;
}
.np-queue-body::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.03);
border-radius: 3px;
}
.np-queue-body::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.1);
border-radius: 3px;
}
.np-queue-body::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.18);
}
/* Queue Panel */
.np-queue-panel {
border-top: 1px solid rgba(255, 255, 255, 0.06);
padding: 0 40px 20px;
}
.np-queue-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 0 8px;
}
.np-queue-toggle {
background: none;
border: none;
color: rgba(255, 255, 255, 0.5);
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
font-weight: 500;
padding: 4px 0;
transition: color 0.15s ease;
}
.np-queue-toggle:hover,
.np-queue-toggle.active {
color: rgba(255, 255, 255, 0.85);
}
.np-queue-count {
color: rgba(255, 255, 255, 0.3);
font-size: 12px;
}
.np-queue-clear-btn {
background: none;
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.35);
font-size: 11px;
padding: 3px 10px;
border-radius: 6px;
cursor: pointer;
transition: all 0.15s ease;
}
.np-queue-clear-btn:hover {
color: rgba(255, 255, 255, 0.7);
border-color: rgba(255, 255, 255, 0.2);
}
.np-queue-body {
max-height: 200px;
overflow-y: auto;
}
.np-queue-body.hidden {
display: none;
}
.np-queue-empty {
color: rgba(255, 255, 255, 0.25);
font-size: 13px;
text-align: center;
padding: 16px 0;
}
.np-queue-list {
display: flex;
flex-direction: column;
gap: 2px;
}
.np-queue-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
border-radius: 8px;
cursor: pointer;
transition: background 0.15s ease;
}
.np-queue-item:hover {
background: rgba(255, 255, 255, 0.05);
}
.np-queue-item.active {
background: rgba(var(--accent-rgb), 0.12);
border-left: 3px solid rgb(var(--accent-rgb));
}
.np-queue-item-info {
min-width: 0;
flex: 1;
}
.np-queue-item-title {
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.np-queue-item.active .np-queue-item-title {
color: rgb(var(--accent-light-rgb));
}
.np-queue-item-artist {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.np-queue-item-remove {
background: none;
border: none;
color: rgba(255, 255, 255, 0.2);
cursor: pointer;
font-size: 12px;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
flex-shrink: 0;
transition: all 0.15s ease;
}
.np-queue-item-remove:hover {
color: rgba(255, 80, 80, 0.8);
background: rgba(255, 80, 80, 0.1);
}
/* Queue button in enhanced track table */
.col-queue {
width: 36px;
text-align: center;
}
.enhanced-queue-btn {
background: none;
border: 1px solid rgba(29, 185, 84, 0.2);
color: rgba(29, 185, 84, 0.5);
border-radius: 50%;
width: 24px;
height: 24px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s ease;
padding: 0;
}
.enhanced-queue-btn:hover {
background: rgba(29, 185, 84, 0.12);
color: rgba(29, 185, 84, 0.9);
border-color: rgba(29, 185, 84, 0.4);
transform: scale(1.1);
}
/* ── Write Tags to File ── */
.enhanced-write-tag-btn {
width: 26px;
height: 26px;
border-radius: 6px;
border: 1px solid rgba(29, 185, 84, 0.15);
background: rgba(29, 185, 84, 0.04);
color: rgba(29, 185, 84, 0.5);
cursor: pointer;
font-size: 13px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.15s ease;
padding: 0;
}
.enhanced-write-tag-btn:hover {
background: rgba(29, 185, 84, 0.12);
color: rgba(29, 185, 84, 0.9);
border-color: rgba(29, 185, 84, 0.4);
transform: scale(1.1);
}
.enhanced-write-tags-album-btn {
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
background: rgba(29, 185, 84, 0.06);
border: 1px solid rgba(29, 185, 84, 0.15);
color: rgba(29, 185, 84, 0.6);
transition: all 0.15s ease;
}
.enhanced-write-tags-album-btn:hover {
background: rgba(29, 185, 84, 0.12);
color: rgba(29, 185, 84, 0.9);
border-color: rgba(29, 185, 84, 0.35);
}
.enhanced-reorganize-album-btn {
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
background: rgba(100, 149, 237, 0.06);
border: 1px solid rgba(100, 149, 237, 0.15);
color: rgba(100, 149, 237, 0.6);
transition: all 0.15s ease;
}
.enhanced-reorganize-album-btn:hover {
background: rgba(100, 149, 237, 0.12);
color: rgba(100, 149, 237, 0.9);
border-color: rgba(100, 149, 237, 0.35);
}
.enhanced-redownload-album-btn {
padding: 6px 14px;
border-radius: 8px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
background: rgba(34, 197, 94, 0.06);
border: 1px solid rgba(34, 197, 94, 0.15);
color: rgba(34, 197, 94, 0.6);
transition: all 0.15s ease;
}
.enhanced-redownload-album-btn:hover {
background: rgba(34, 197, 94, 0.12);
color: rgba(34, 197, 94, 0.9);
border-color: rgba(34, 197, 94, 0.35);
}
.enhanced-redownload-album-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* ── Reorganize Modal ── */
.reorganize-modal {
max-width: 900px;
width: 95vw;
}
.reorganize-content {
display: flex;
flex-direction: column;
gap: 16px;
}
.reorganize-label {
display: block;
font-size: 13px;
font-weight: 600;
color: rgba(255,255,255,0.8);
margin-bottom: 6px;
}
.reorganize-template-section {
padding-bottom: 12px;
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.reorganize-template-hint {
font-size: 11px;
color: rgba(255,255,255,0.35);
margin-bottom: 8px;
}
.reorganize-template-hint code {
background: rgba(255,255,255,0.06);
padding: 1px 4px;
border-radius: 3px;
font-size: 11px;
}
.reorganize-template-input {
width: 100%;
padding: 10px 14px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.12);
border-radius: 8px;
color: #e0e0e0;
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 13px;
outline: none;
transition: border-color 0.15s;
box-sizing: border-box;
}
.reorganize-template-input:focus {
border-color: rgba(100, 149, 237, 0.5);
}
.reorganize-variables {
padding-bottom: 12px;
border-bottom: 1px solid rgba(255,255,255,0.06);
}
.reorganize-var-grid {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.reorganize-var-chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 4px 10px;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 6px;
cursor: pointer;
transition: all 0.15s;
font-size: 12px;
}
.reorganize-var-chip:hover {
background: rgba(100, 149, 237, 0.1);
border-color: rgba(100, 149, 237, 0.3);
}
.reorganize-var-chip code {
color: rgba(100, 149, 237, 0.9);
font-size: 12px;
font-weight: 600;
}
.reorganize-var-desc {
color: rgba(255,255,255,0.4);
font-size: 11px;
}
.reorganize-preview-section {
flex: 1;
}
.reorganize-preview-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
}
.reorganize-preview-header .reorganize-label {
margin-bottom: 0;
}
.reorganize-preview-btn {
padding: 5px 12px;
border-radius: 6px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
background: rgba(100, 149, 237, 0.1);
border: 1px solid rgba(100, 149, 237, 0.25);
color: rgba(100, 149, 237, 0.9);
transition: all 0.15s;
}
.reorganize-preview-btn:hover {
background: rgba(100, 149, 237, 0.2);
border-color: rgba(100, 149, 237, 0.4);
}
.reorganize-preview-body {
max-height: 350px;
overflow-y: auto;
background: rgba(0,0,0,0.15);
border-radius: 8px;
padding: 10px;
}
.reorganize-preview-hint,
.reorganize-preview-loading {
text-align: center;
color: rgba(255,255,255,0.3);
font-size: 12px;
padding: 24px;
}
.reorganize-preview-error {
text-align: center;
color: rgba(255, 80, 80, 0.8);
font-size: 12px;
padding: 24px;
}
.reorganize-preview-summary {
display: flex;
gap: 12px;
margin-bottom: 10px;
font-size: 12px;
}
.reorganize-stat {
padding: 3px 10px;
border-radius: 12px;
font-weight: 500;
}
.reorganize-stat.changed {
background: rgba(100, 149, 237, 0.12);
color: rgba(100, 149, 237, 0.9);
}
.reorganize-stat.unchanged {
background: rgba(255,255,255,0.06);
color: rgba(255,255,255,0.4);
}
.reorganize-stat.missing {
background: rgba(255, 170, 50, 0.1);
color: rgba(255, 170, 50, 0.8);
}
.reorganize-preview-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.reorganize-preview-table th {
text-align: left;
padding: 6px 8px;
color: rgba(255,255,255,0.4);
font-weight: 500;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 1px solid rgba(255,255,255,0.08);
}
.reorganize-preview-table td {
padding: 6px 8px;
border-bottom: 1px solid rgba(255,255,255,0.04);
color: rgba(255,255,255,0.7);
vertical-align: top;
}
.reorganize-path {
font-family: 'JetBrains Mono', 'Fira Code', monospace;
font-size: 11px;
word-break: break-all;
max-width: 300px;
}
.reorganize-arrow {
text-align: center;
color: rgba(100, 149, 237, 0.7);
font-weight: bold;
white-space: nowrap;
}
.reorganize-row-changed .reorganize-path:last-child {
color: rgba(100, 149, 237, 0.9);
}
.reorganize-row-unchanged td {
color: rgba(255,255,255,0.25);
}
.reorganize-row-missing td {
color: rgba(255, 170, 50, 0.5);
}
.reorganize-row-missing em {
font-style: italic;
}
.reorganize-row-collision td {
color: rgba(255, 60, 60, 0.8);
}
.reorganize-row-collision .reorganize-arrow {
color: rgba(255, 60, 60, 0.9);
font-weight: bold;
}
.reorganize-row-collision em {
font-style: italic;
color: rgba(255, 60, 60, 0.6);
}
.reorganize-stat.collision {
background: rgba(255, 60, 60, 0.1);
color: rgba(255, 60, 60, 0.9);
}
.enhanced-bulk-btn.tag-write {
background: rgba(29, 185, 84, 0.08);
border-color: rgba(29, 185, 84, 0.2);
color: rgb(var(--accent-rgb));
}
.enhanced-bulk-btn.tag-write:hover {
background: rgba(29, 185, 84, 0.15);
border-color: rgba(29, 185, 84, 0.4);
}
.col-writetag {
width: 36px;
text-align: center;
}
/* Tag Preview Modal */
.tag-preview-modal {
max-width: 700px;
width: 90vw;
}
.tag-preview-loading {
text-align: center;
padding: 30px;
color: rgba(255, 255, 255, 0.5);
font-size: 14px;
}
.tag-preview-error {
text-align: center;
padding: 20px;
color: rgba(255, 80, 80, 0.8);
font-size: 14px;
}
.tag-preview-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.tag-preview-table th {
text-align: left;
padding: 8px 10px;
color: rgba(255, 255, 255, 0.4);
font-weight: 500;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.tag-preview-table td {
padding: 7px 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
color: rgba(255, 255, 255, 0.7);
}
.tag-field-name {
color: rgba(255, 255, 255, 0.5);
font-weight: 500;
white-space: nowrap;
width: 90px;
}
.tag-file-value {
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tag-db-value {
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tag-diff-indicator {
width: 30px;
text-align: center;
}
.tag-diff-arrow {
color: rgb(var(--accent-rgb));
font-size: 16px;
font-weight: bold;
}
.tag-diff-check {
color: rgba(255, 255, 255, 0.15);
font-size: 14px;
}
tr.tag-diff-changed .tag-file-value {
color: rgba(255, 80, 80, 0.6);
text-decoration: line-through;
}
tr.tag-diff-changed .tag-db-value {
color: rgb(var(--accent-rgb));
font-weight: 500;
}
tr.tag-diff-same {
opacity: 0.5;
}
.tag-empty {
color: rgba(255, 255, 255, 0.15);
font-style: italic;
}
.tag-preview-no-changes {
text-align: center;
padding: 16px;
color: rgba(29, 185, 84, 0.6);
font-size: 13px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
margin-top: 8px;
}
.tag-preview-cover-label {
display: flex;
align-items: center;
gap: 8px;
color: rgba(255, 255, 255, 0.6);
font-size: 13px;
cursor: pointer;
}
.tag-preview-cover-label input[type="checkbox"] {
accent-color: rgb(var(--accent-rgb));
}
.tag-preview-footer-actions {
display: flex;
gap: 8px;
}
.tag-preview-modal .enhanced-bulk-modal-footer {
justify-content: space-between;
}
/* Batch Tag Preview Modal */
.batch-tag-preview-modal {
width: 850px;
max-width: 92vw;
max-height: 85vh;
display: flex;
flex-direction: column;
}
.batch-tag-preview-modal .enhanced-bulk-modal-footer {
justify-content: space-between;
}
.batch-tag-preview-body {
overflow-y: auto;
max-height: 55vh;
padding: 8px 16px 16px !important;
}
.batch-tag-summary {
display: flex;
gap: 12px;
padding: 10px 20px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.batch-tag-stat {
font-size: 12px;
font-weight: 500;
padding: 3px 10px;
border-radius: 10px;
}
.batch-tag-stat.changed {
background: rgba(var(--accent-rgb), 0.1);
color: rgb(var(--accent-rgb));
}
.batch-tag-stat.unchanged {
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.4);
}
.batch-tag-stat.errored {
background: rgba(255, 80, 80, 0.1);
color: rgba(255, 80, 80, 0.7);
}
.batch-tag-track {
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
margin-bottom: 6px;
}
.batch-tag-track.error {
border-color: rgba(255, 80, 80, 0.15);
}
.batch-tag-track-header {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 14px;
cursor: pointer;
transition: background 0.15s ease;
}
.batch-tag-track-header:hover {
background: rgba(255, 255, 255, 0.03);
}
.batch-tag-track-number {
color: rgba(255, 255, 255, 0.3);
font-size: 12px;
font-weight: 500;
min-width: 20px;
text-align: right;
}
.batch-tag-track-title {
flex: 1;
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.batch-tag-track-status {
font-size: 11px;
font-weight: 500;
padding: 2px 8px;
border-radius: 8px;
}
.batch-tag-track-status.changed {
background: rgba(var(--accent-rgb), 0.1);
color: rgb(var(--accent-rgb));
}
.batch-tag-track-status.error {
background: rgba(255, 80, 80, 0.1);
color: rgba(255, 80, 80, 0.7);
}
.batch-tag-track-status.ok {
color: rgba(255, 255, 255, 0.3);
}
.batch-tag-chevron {
color: rgba(255, 255, 255, 0.2);
font-size: 11px;
transition: transform 0.2s ease;
}
.batch-tag-track.expanded .batch-tag-chevron {
transform: rotate(180deg);
}
.batch-tag-track-diff {
display: none;
padding: 0 14px 12px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.batch-tag-track.expanded .batch-tag-track-diff {
display: block;
}
.batch-tag-track-diff .tag-preview-table {
font-size: 12px;
}
.batch-tag-track-diff .tag-preview-table th {
font-size: 10px;
padding: 6px 8px;
}
.batch-tag-track-diff .tag-preview-table td {
padding: 5px 8px;
}
/* Unchanged tracks group */
.batch-tag-unchanged-group {
border: 1px solid rgba(255, 255, 255, 0.04);
border-radius: 10px;
margin-bottom: 6px;
overflow: hidden;
}
.batch-tag-unchanged-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 14px;
cursor: pointer;
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
transition: background 0.15s ease;
}
.batch-tag-unchanged-header:hover {
background: rgba(255, 255, 255, 0.02);
}
.batch-tag-unchanged-list {
display: none;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.batch-tag-unchanged-group.expanded .batch-tag-unchanged-list {
display: block;
}
.batch-tag-unchanged-group.expanded .batch-tag-chevron {
transform: rotate(180deg);
}
.batch-tag-track-row {
display: flex;
align-items: center;
gap: 10px;
padding: 7px 14px;
border-bottom: 1px solid rgba(255, 255, 255, 0.02);
}
.batch-tag-track-row:last-child {
border-bottom: none;
}
.batch-tag-track-row.unchanged {
opacity: 0.5;
}
/* ======================================================= */
/* == HELP & DOCS PAGE == */
/* ======================================================= */
.docs-layout {
display: flex;
height: 100%;
gap: 0;
overflow: hidden;
}
/* Sidebar */
.docs-sidebar {
width: 280px;
min-width: 280px;
height: 100%;
overflow-y: auto;
background: rgba(0, 0, 0, 0.3);
border-right: 1px solid rgba(255, 255, 255, 0.06);
display: flex;
flex-direction: column;
}
.docs-sidebar-header {
padding: 24px 20px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
position: sticky;
top: 0;
background: rgba(10, 10, 14, 0.95);
backdrop-filter: blur(12px);
z-index: 10;
}
.docs-sidebar-header h3 {
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 18px;
font-weight: 700;
margin: 0 0 14px 0;
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.docs-search {
width: 100%;
padding: 8px 12px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.05);
color: #fff;
font-size: 13px;
font-family: 'SF Pro Text', -apple-system, sans-serif;
outline: none;
transition: border-color 0.2s;
box-sizing: border-box;
}
.docs-search:focus {
border-color: rgba(var(--accent-rgb), 0.5);
}
.docs-search::placeholder {
color: rgba(255, 255, 255, 0.3);
}
.docs-nav {
padding: 12px 0;
flex: 1;
overflow-y: auto;
}
.docs-nav-section {
margin-bottom: 4px;
}
.docs-nav-section-title {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 20px;
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
cursor: pointer;
transition: all 0.15s ease;
user-select: none;
border-left: 3px solid transparent;
}
.docs-nav-section-title:hover {
background: rgba(255, 255, 255, 0.04);
color: #fff;
}
.docs-nav-section-title.active {
color: rgb(var(--accent-light-rgb));
border-left-color: rgb(var(--accent-rgb));
background: rgba(var(--accent-rgb), 0.06);
}
.docs-nav-section-title .docs-nav-icon {
width: 20px;
height: 20px;
object-fit: contain;
opacity: 0.7;
flex-shrink: 0;
}
.docs-nav-section-title.active .docs-nav-icon {
opacity: 1;
filter: drop-shadow(0 0 4px rgba(var(--accent-rgb), 0.4));
}
.docs-nav-section-title .docs-nav-arrow {
margin-left: auto;
font-size: 10px;
opacity: 0.4;
transition: transform 0.2s ease;
}
.docs-nav-section-title.expanded .docs-nav-arrow {
transform: rotate(90deg);
}
.docs-nav-children {
display: none;
padding: 2px 0;
}
.docs-nav-children.expanded {
display: block;
}
.docs-nav-child {
padding: 7px 20px 7px 53px;
font-size: 12.5px;
color: rgba(255, 255, 255, 0.5);
cursor: pointer;
transition: all 0.15s ease;
border-left: 3px solid transparent;
}
.docs-nav-child:hover {
color: rgba(255, 255, 255, 0.8);
background: rgba(255, 255, 255, 0.03);
}
.docs-nav-child.active {
color: rgb(var(--accent-light-rgb));
border-left-color: rgba(var(--accent-rgb), 0.5);
}
/* Main content */
.docs-content {
flex: 1;
position: relative;
overflow-y: auto;
padding: 40px 48px;
scroll-behavior: smooth;
}
.docs-section {
margin-bottom: 56px;
animation: docsFadeIn 0.3s ease;
}
@keyframes docsFadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.docs-section-title {
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
font-size: 28px;
font-weight: 700;
margin: 0 0 8px 0;
display: flex;
align-items: center;
gap: 14px;
padding-bottom: 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.docs-section-title > span {
background: linear-gradient(90deg, #ffffff 0%, rgb(var(--accent-light-rgb)) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.docs-section-title .docs-section-icon {
width: 36px;
height: 36px;
object-fit: contain;
filter: drop-shadow(0 2px 6px rgba(var(--accent-rgb), 0.3));
}
.docs-subsection {
margin: 32px 0;
}
.docs-subsection-title {
font-size: 20px;
font-weight: 600;
color: #fff;
margin: 0 0 12px 0;
padding-left: 14px;
border-left: 3px solid rgb(var(--accent-rgb));
}
.docs-text {
font-size: 14.5px;
line-height: 1.75;
color: rgba(255, 255, 255, 0.72);
margin: 0 0 16px 0;
}
.docs-text strong {
color: rgba(255, 255, 255, 0.92);
font-weight: 600;
}
/* Feature cards */
.docs-features {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 16px;
margin: 16px 0;
}
.docs-feature-card {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: 20px;
transition: all 0.2s ease;
}
.docs-feature-card:hover {
background: rgba(255, 255, 255, 0.05);
border-color: rgba(var(--accent-rgb), 0.15);
transform: translateY(-2px);
}
.docs-feature-card h4 {
font-size: 15px;
font-weight: 600;
color: #fff;
margin: 0 0 8px 0;
display: flex;
align-items: center;
gap: 8px;
}
.docs-feature-card p {
font-size: 13px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.6);
margin: 0;
}
/* Step lists */
.docs-steps {
counter-reset: docs-step;
list-style: none;
padding: 0;
margin: 16px 0;
}
.docs-steps li {
counter-increment: docs-step;
display: flex;
align-items: flex-start;
gap: 14px;
padding: 12px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
font-size: 14px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.72);
}
.docs-steps li::before {
content: counter(docs-step);
min-width: 28px;
height: 28px;
border-radius: 50%;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-light-rgb));
font-size: 13px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin-top: 1px;
}
/* Info/tip callouts */
.docs-callout {
padding: 16px 20px;
border-radius: 10px;
margin: 16px 0;
font-size: 13.5px;
line-height: 1.6;
display: flex;
gap: 12px;
align-items: flex-start;
}
.docs-callout-icon {
font-size: 18px;
flex-shrink: 0;
margin-top: 1px;
}
.docs-callout.tip {
background: rgba(var(--accent-rgb), 0.08);
border: 1px solid rgba(var(--accent-rgb), 0.15);
color: rgba(255, 255, 255, 0.8);
}
.docs-callout.warning {
background: rgba(255, 180, 0, 0.08);
border: 1px solid rgba(255, 180, 0, 0.15);
color: rgba(255, 255, 255, 0.8);
}
.docs-callout.info {
background: rgba(80, 160, 255, 0.08);
border: 1px solid rgba(80, 160, 255, 0.15);
color: rgba(255, 255, 255, 0.8);
}
/* Data tables */
.docs-table {
width: 100%;
border-collapse: collapse;
margin: 16px 0;
font-size: 13.5px;
}
.docs-table th {
text-align: left;
padding: 10px 14px;
font-weight: 600;
color: rgba(255, 255, 255, 0.7);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.03);
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.docs-table td {
padding: 10px 14px;
color: rgba(255, 255, 255, 0.65);
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
vertical-align: top;
line-height: 1.5;
}
.docs-table tr:hover td {
background: rgba(255, 255, 255, 0.02);
}
/* Keyboard shortcut badges */
.docs-kbd {
display: inline-block;
padding: 2px 8px;
border-radius: 5px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.15);
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 12px;
color: rgba(255, 255, 255, 0.85);
line-height: 1.6;
white-space: nowrap;
}
/* Screenshots */
.docs-screenshot-wrapper {
display: flex;
flex-direction: column;
align-items: center;
margin: 20px 0;
cursor: pointer;
}
.docs-screenshot-wrapper:hover .docs-screenshot {
border-color: rgba(var(--accent-light-rgb), 0.3);
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5), 0 0 20px rgba(var(--accent-light-rgb), 0.08);
transform: translateY(-2px);
}
.docs-screenshot-wrapper:hover .docs-screenshot-label {
color: rgba(255, 255, 255, 0.6);
}
.docs-screenshot {
width: 100%;
max-width: 800px;
aspect-ratio: 16 / 9;
object-fit: contain;
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
transition: all 0.25s ease;
opacity: 0;
animation: docImgFadeIn 0.4s ease forwards;
}
.docs-screenshot-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
margin-top: 8px;
letter-spacing: 0.3px;
transition: color 0.25s ease;
}
@keyframes docImgFadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
/* Lightbox overlay for full-size image viewing */
.docs-lightbox {
position: fixed;
inset: 0;
z-index: 10000;
background: rgba(0, 0, 0, 0.88);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.25s ease;
cursor: zoom-out;
}
.docs-lightbox.active {
opacity: 1;
}
.docs-lightbox img {
max-width: 92vw;
max-height: 90vh;
border-radius: 10px;
box-shadow: 0 16px 64px rgba(0, 0, 0, 0.6);
transform: scale(0.92);
transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
.docs-lightbox.active img {
transform: scale(1);
}
.docs-lightbox-close {
position: absolute;
top: 20px;
right: 24px;
width: 36px;
height: 36px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.7);
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s ease;
}
.docs-lightbox-close:hover {
background: rgba(255, 255, 255, 0.2);
color: #fff;
}
/* Bullet lists */
.docs-list {
list-style: none;
padding: 0;
margin: 12px 0;
}
.docs-list li {
padding: 6px 0 6px 20px;
position: relative;
font-size: 14px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.68);
}
.docs-list li::before {
content: '';
position: absolute;
left: 0;
top: 14px;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgb(var(--accent-rgb));
opacity: 0.6;
}
/* Back to top */
.docs-back-to-top {
position: fixed;
bottom: 32px;
right: 32px;
width: 40px;
height: 40px;
border-radius: 50%;
background: rgba(var(--accent-rgb), 0.2);
border: 1px solid rgba(var(--accent-rgb), 0.3);
color: rgb(var(--accent-light-rgb));
font-size: 18px;
cursor: pointer;
display: none;
align-items: center;
justify-content: center;
transition: all 0.2s;
z-index: 50;
backdrop-filter: blur(8px);
}
.docs-back-to-top:hover {
background: rgba(var(--accent-rgb), 0.35);
transform: translateY(-2px);
}
.docs-back-to-top.visible {
display: flex;
}
/* Workflow cards */
.docs-workflow-cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 16px;
margin: 20px 0;
}
.docs-workflow-card {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: 20px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
flex-direction: column;
gap: 10px;
}
.docs-workflow-card:hover {
background: rgba(var(--accent-rgb), 0.06);
border-color: rgba(var(--accent-rgb), 0.2);
transform: translateY(-2px);
}
.docs-workflow-card-header {
display: flex;
align-items: center;
gap: 12px;
}
.docs-workflow-card-icon {
font-size: 24px;
flex-shrink: 0;
}
.docs-workflow-card-title {
font-size: 15px;
font-weight: 600;
color: #fff;
flex: 1;
}
.docs-workflow-card-badge {
padding: 3px 10px;
border-radius: 20px;
background: rgba(var(--accent-rgb), 0.15);
color: rgb(var(--accent-light-rgb));
font-size: 11px;
font-weight: 600;
white-space: nowrap;
}
.docs-workflow-card-desc {
font-size: 13px;
line-height: 1.5;
color: rgba(255, 255, 255, 0.55);
margin: 0;
}
.docs-workflow-card-link {
font-size: 12.5px;
color: rgb(var(--accent-light-rgb));
font-weight: 500;
align-self: flex-start;
opacity: 0.7;
transition: opacity 0.15s;
}
.docs-workflow-card:hover .docs-workflow-card-link {
opacity: 1;
}
/* Debug info button */
.docs-debug-button {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
width: 100%;
padding: 10px 16px;
margin-top: 12px;
border-radius: 8px;
border: 1px solid rgba(var(--accent-rgb), 0.25);
background: rgba(var(--accent-rgb), 0.08);
color: rgb(var(--accent-light-rgb));
font-size: 12.5px;
font-weight: 600;
font-family: 'SF Pro Text', -apple-system, sans-serif;
cursor: pointer;
transition: all 0.2s ease;
box-sizing: border-box;
}
.docs-debug-button:hover {
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.4);
}
.docs-debug-button.copied {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgb(var(--accent-rgb));
}
.docs-debug-wrap {
margin-top: 12px;
}
.docs-debug-wrap .docs-debug-button {
margin-top: 0;
}
.docs-debug-options {
display: flex;
gap: 8px;
margin-top: 8px;
}
.docs-debug-row {
flex: 1;
display: flex;
flex-direction: column;
gap: 3px;
}
.docs-debug-row label {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 600;
}
.docs-debug-select {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
color: rgba(255, 255, 255, 0.7);
font-size: 11.5px;
padding: 5px 8px;
font-family: 'SF Pro Text', -apple-system, sans-serif;
cursor: pointer;
transition: border-color 0.2s ease;
appearance: none;
-webkit-appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='rgba(255,255,255,0.4)'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 8px center;
padding-right: 22px;
}
.docs-debug-select:hover {
border-color: rgba(255, 255, 255, 0.2);
}
.docs-debug-select:focus {
outline: none;
border-color: rgba(var(--accent-rgb), 0.4);
}
.docs-debug-select option {
background: #1a1a2e;
color: rgba(255, 255, 255, 0.8);
}
/* Toast help link */
/* Legacy toast-help-link — kept for backward compat, now handled by toast-compact-link */
.toast-help-link {
display: inline-block;
margin-left: 8px;
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
text-decoration: underline;
text-decoration-style: dotted;
cursor: pointer;
transition: color 0.15s;
}
.toast-help-link:hover {
color: rgba(255, 255, 255, 0.85);
}
/* API code examples */
.docs-code-block {
background: rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
padding: 16px;
margin: 12px 0;
overflow-x: auto;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 12.5px;
line-height: 1.6;
color: rgba(255, 255, 255, 0.8);
white-space: pre;
}
.docs-code-block .code-key {
color: rgb(var(--accent-light-rgb));
}
.docs-code-block .code-string {
color: rgba(152, 195, 121, 0.9);
}
.docs-code-block .code-number {
color: rgba(209, 154, 102, 0.9);
}
.docs-code-block .code-comment {
color: rgba(255, 255, 255, 0.3);
font-style: italic;
}
.docs-code-label {
font-size: 11.5px;
font-weight: 600;
color: rgba(255, 255, 255, 0.5);
text-transform: uppercase;
letter-spacing: 0.5px;
margin: 16px 0 4px;
}
/* ── API Tester ── */
.api-key-bar {
display: flex;
align-items: center;
gap: 10px;
background: rgba(0, 0, 0, 0.35);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
padding: 12px 16px;
margin-bottom: 20px;
}
.api-key-bar label {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.5);
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap;
}
.api-key-bar input {
flex: 1;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
padding: 7px 12px;
color: rgba(255, 255, 255, 0.8);
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 12px;
}
.api-key-bar input::placeholder {
color: rgba(255, 255, 255, 0.25);
}
.api-key-bar .api-key-status {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
white-space: nowrap;
}
.api-key-bar .api-key-status.connected {
color: rgba(var(--accent-rgb), 0.8);
}
.api-endpoint-group {
margin-bottom: 28px;
}
.api-endpoint-group-title {
font-size: 13px;
font-weight: 700;
color: rgba(255, 255, 255, 0.45);
text-transform: uppercase;
letter-spacing: 1px;
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.api-endpoint {
background: rgba(0, 0, 0, 0.25);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
margin-bottom: 8px;
overflow: hidden;
transition: border-color 0.2s ease;
}
.api-endpoint:hover {
border-color: rgba(255, 255, 255, 0.12);
}
.api-endpoint.expanded {
border-color: rgba(var(--accent-rgb), 0.25);
}
.api-endpoint-header {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 14px;
cursor: pointer;
user-select: none;
transition: background 0.15s ease;
}
.api-endpoint-header:hover {
background: rgba(255, 255, 255, 0.02);
}
.api-method {
font-size: 10px;
font-weight: 700;
letter-spacing: 0.5px;
padding: 3px 8px;
border-radius: 4px;
min-width: 52px;
text-align: center;
flex-shrink: 0;
}
.api-method.get { background: rgba(72, 199, 142, 0.15); color: #48c78e; }
.api-method.post { background: rgba(62, 142, 208, 0.15); color: #3e8ed0; }
.api-method.put { background: rgba(255, 183, 77, 0.15); color: #ffb74d; }
.api-method.patch { background: rgba(171, 130, 255, 0.15); color: #ab82ff; }
.api-method.delete { background: rgba(241, 70, 104, 0.15); color: #f14668; }
.api-endpoint-path {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 12.5px;
color: rgba(255, 255, 255, 0.85);
flex-shrink: 0;
}
.api-endpoint-desc {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
margin-left: auto;
text-align: right;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 40%;
}
.api-endpoint-arrow {
color: rgba(255, 255, 255, 0.2);
font-size: 10px;
transition: transform 0.2s ease;
flex-shrink: 0;
}
.api-endpoint.expanded .api-endpoint-arrow {
transform: rotate(90deg);
}
.api-endpoint-body {
display: none;
padding: 0 14px 14px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.api-endpoint.expanded .api-endpoint-body {
display: block;
}
.api-endpoint-detail {
margin-bottom: 14px;
}
.api-detail-label {
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.5px;
margin: 14px 0 6px;
}
.api-params-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.api-params-table th {
text-align: left;
font-size: 10.5px;
font-weight: 600;
color: rgba(255, 255, 255, 0.35);
text-transform: uppercase;
letter-spacing: 0.5px;
padding: 6px 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.api-params-table td {
padding: 6px 10px;
color: rgba(255, 255, 255, 0.7);
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
vertical-align: top;
}
.api-params-table td:first-child {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 11.5px;
color: rgb(var(--accent-light-rgb));
white-space: nowrap;
}
.api-params-table td:nth-child(2) {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
}
.api-param-required {
color: #f14668 !important;
font-size: 10px;
font-weight: 600;
}
.api-param-optional {
color: rgba(255, 255, 255, 0.25) !important;
font-size: 10px;
}
.api-try-bar {
display: flex;
align-items: stretch;
gap: 8px;
margin-top: 12px;
}
.api-try-params {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 8px;
}
.api-try-param {
display: flex;
align-items: center;
gap: 6px;
}
.api-try-param label {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
}
.api-try-param input,
.api-try-param select {
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 5px;
padding: 5px 8px;
color: rgba(255, 255, 255, 0.8);
font-size: 11.5px;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
min-width: 80px;
}
.api-try-body {
flex: 1;
background: rgba(0, 0, 0, 0.3);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
padding: 8px 10px;
color: rgba(255, 255, 255, 0.8);
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 11.5px;
resize: vertical;
min-height: 60px;
}
.api-try-btn {
background: rgba(var(--accent-rgb), 0.15);
border: 1px solid rgba(var(--accent-rgb), 0.3);
border-radius: 6px;
color: rgb(var(--accent-light-rgb));
font-size: 11.5px;
font-weight: 600;
padding: 0 16px;
cursor: pointer;
white-space: nowrap;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 5px;
}
.api-try-btn:hover {
background: rgba(var(--accent-rgb), 0.25);
border-color: rgba(var(--accent-rgb), 0.5);
}
.api-try-btn:active {
transform: scale(0.97);
}
.api-try-btn.loading {
opacity: 0.6;
pointer-events: none;
}
.api-response-panel {
margin-top: 10px;
border-radius: 8px;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.06);
}
.api-response-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 12px;
background: rgba(0, 0, 0, 0.3);
font-size: 11px;
font-weight: 600;
}
.api-response-status {
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
font-weight: 700;
}
.api-response-status.s2xx { background: rgba(72, 199, 142, 0.15); color: #48c78e; }
.api-response-status.s4xx { background: rgba(255, 183, 77, 0.15); color: #ffb74d; }
.api-response-status.s5xx { background: rgba(241, 70, 104, 0.15); color: #f14668; }
.api-response-time {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
}
.api-response-body {
background: rgba(0, 0, 0, 0.4);
padding: 12px;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 11.5px;
line-height: 1.5;
color: rgba(255, 255, 255, 0.8);
white-space: pre;
overflow-x: auto;
max-height: 400px;
overflow-y: auto;
}
.api-response-body .json-key { color: rgb(var(--accent-light-rgb)); }
.api-response-body .json-string { color: rgba(152, 195, 121, 0.9); }
.api-response-body .json-number { color: rgba(209, 154, 102, 0.9); }
.api-response-body .json-bool { color: rgba(86, 182, 194, 0.9); }
.api-response-body .json-null { color: rgba(255, 255, 255, 0.3); }
.api-example-json {
background: rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
padding: 12px;
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 11.5px;
line-height: 1.5;
color: rgba(255, 255, 255, 0.8);
white-space: pre;
overflow-x: auto;
margin: 6px 0 10px;
}
.api-base-url {
font-family: 'SF Mono', 'Fira Code', 'Consolas', monospace;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
background: rgba(0, 0, 0, 0.3);
padding: 4px 10px;
border-radius: 5px;
margin-left: 8px;
}
.api-note {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
padding: 8px 12px;
background: rgba(var(--accent-rgb), 0.05);
border-left: 3px solid rgba(var(--accent-rgb), 0.3);
border-radius: 0 6px 6px 0;
margin: 8px 0;
}
/* Screenshot responsive adjustments */
@media (max-width: 600px) {
.docs-screenshot {
max-width: 100%;
border-radius: 8px;
}
.docs-lightbox img {
max-width: 98vw;
border-radius: 6px;
}
}
/* Mobile */
@media (max-width: 900px) {
.docs-layout {
flex-direction: column;
}
.docs-sidebar {
width: 100%;
min-width: unset;
max-height: 50vh;
border-right: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.docs-content {
padding: 24px 20px;
}
.docs-features {
grid-template-columns: 1fr;
}
.docs-section-title {
font-size: 22px;
}
}
@media (max-width: 600px) {
.docs-content {
padding: 16px 14px;
}
.docs-subsection-title {
font-size: 17px;
}
}
/* ===== Enhanced Library — Read-only Meta Values ===== */
.enhanced-album-meta-value {
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
padding: 6px 8px;
background: rgba(255, 255, 255, 0.04);
border-radius: 6px;
border: 1px solid rgba(255, 255, 255, 0.06);
min-height: 28px;
display: flex;
align-items: center;
}
/* ===== Enhanced Library — Report Issue Button ===== */
.enhanced-report-issue-btn {
background: rgba(255, 165, 0, 0.15);
border: 1px solid rgba(255, 165, 0, 0.3);
color: rgba(255, 165, 0, 0.9);
padding: 4px 12px;
border-radius: 6px;
font-size: 12px;
cursor: pointer;
transition: all 0.2s ease;
white-space: nowrap;
}
.enhanced-report-issue-btn:hover {
background: rgba(255, 165, 0, 0.25);
border-color: rgba(255, 165, 0, 0.5);
color: #ffa500;
}
.enhanced-track-report-btn {
background: none;
border: 1px solid rgba(255, 165, 0, 0.25);
color: rgba(255, 165, 0, 0.7);
width: 26px;
height: 26px;
border-radius: 50%;
cursor: pointer;
font-size: 13px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
padding: 0;
}
.enhanced-track-report-btn:hover {
background: rgba(255, 165, 0, 0.15);
border-color: rgba(255, 165, 0, 0.5);
color: #ffa500;
}
/* ===== Issues Page ===== */
.issues-container {
max-width: 1000px;
margin: 0 auto;
padding: 24px 20px;
}
.issues-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
margin-bottom: 20px;
flex-wrap: wrap;
gap: 16px;
}
.issues-header-left {
flex: 1;
min-width: 200px;
}
.issues-title {
font-size: 24px;
font-weight: 600;
color: #fff;
margin: 0 0 4px 0;
}
.issues-subtitle {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
margin: 0;
}
.issues-header-right {
display: flex;
align-items: center;
gap: 10px;
}
.issues-filters {
display: flex;
gap: 8px;
}
.issues-filter-select {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #fff;
padding: 7px 12px;
border-radius: 8px;
font-size: 13px;
cursor: pointer;
outline: none;
transition: border-color 0.2s;
appearance: none;
-webkit-appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='%23888'%3E%3Cpath d='M0 0l5 6 5-6z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 10px center;
padding-right: 28px;
min-width: 130px;
}
.issues-filter-select:focus {
border-color: rgba(var(--accent-light-rgb), 0.5);
}
.issues-filter-select option {
background: #1a1a2e;
color: #fff;
}
/* Issues Stats */
.issues-stats {
display: flex;
gap: 10px;
margin-bottom: 20px;
flex-wrap: wrap;
}
.issues-stat-card {
flex: 1;
min-width: 100px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 14px 16px;
text-align: center;
transition: border-color 0.2s;
}
.issues-stat-number {
font-size: 22px;
font-weight: 700;
color: #fff;
line-height: 1.2;
}
.issues-stat-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.45);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-top: 4px;
}
.issues-stat-open { border-left: 3px solid #ffa500; }
.issues-stat-progress { border-left: 3px solid #4da6ff; }
.issues-stat-resolved { border-left: 3px solid #4ade80; }
.issues-stat-dismissed { border-left: 3px solid #888; }
.issues-stat-total { border-left: 3px solid rgba(var(--accent-light-rgb), 0.6); }
/* Issues List */
.issues-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.issues-loading {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
padding: 40px;
color: rgba(255, 255, 255, 0.5);
font-size: 14px;
}
.issues-spinner {
width: 20px;
height: 20px;
border: 2px solid rgba(255, 255, 255, 0.1);
border-top-color: rgba(var(--accent-light-rgb), 0.7);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.issues-empty {
text-align: center;
padding: 60px 20px;
color: rgba(255, 255, 255, 0.4);
}
.issues-empty-icon {
font-size: 40px;
margin-bottom: 12px;
opacity: 0.5;
}
.issues-empty-title {
font-size: 16px;
font-weight: 500;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 6px;
}
.issues-empty-text {
font-size: 13px;
color: rgba(255, 255, 255, 0.35);
}
/* Issue Card */
.issue-card {
display: flex;
align-items: stretch;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: 14px 16px;
cursor: pointer;
transition: all 0.2s ease;
gap: 14px;
}
.issue-card:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.12);
transform: translateY(-1px);
}
.issue-card-left {
flex-shrink: 0;
display: flex;
align-items: center;
}
.issue-card-thumb {
width: 52px;
height: 52px;
border-radius: 8px;
object-fit: cover;
}
.issue-card-thumb-placeholder {
width: 52px;
height: 52px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.05);
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
}
.issue-card-center {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
justify-content: center;
gap: 4px;
}
.issue-card-title-row {
display: flex;
align-items: center;
gap: 6px;
}
.issue-card-category-icon {
font-size: 14px;
flex-shrink: 0;
}
.issue-card-title {
font-size: 14px;
font-weight: 500;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.issue-card-responded {
font-size: 13px;
flex-shrink: 0;
opacity: 0.7;
}
.issue-card-entity {
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.issue-card-entity-type {
background: rgba(255, 255, 255, 0.08);
padding: 1px 6px;
border-radius: 4px;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
flex-shrink: 0;
}
.issue-card-entity-name {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.issue-card-meta-line {
color: rgba(255, 255, 255, 0.35);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.issue-card-description {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 500px;
}
.issue-card-footer {
display: flex;
align-items: center;
gap: 8px;
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
}
.issue-card-profile {
background: rgba(255, 255, 255, 0.06);
padding: 1px 6px;
border-radius: 4px;
}
.issue-card-date {
opacity: 0.8;
}
.issue-card-right {
flex-shrink: 0;
display: flex;
flex-direction: column;
align-items: flex-end;
justify-content: center;
gap: 8px;
}
/* Status Badges */
.issue-status-badge {
padding: 3px 10px;
border-radius: 20px;
font-size: 11px;
font-weight: 500;
letter-spacing: 0.3px;
white-space: nowrap;
}
.issue-status-open {
background: rgba(255, 165, 0, 0.15);
color: #ffa500;
border: 1px solid rgba(255, 165, 0, 0.25);
}
.issue-status-progress {
background: rgba(77, 166, 255, 0.15);
color: #4da6ff;
border: 1px solid rgba(77, 166, 255, 0.25);
}
.issue-status-resolved {
background: rgba(74, 222, 128, 0.15);
color: #4ade80;
border: 1px solid rgba(74, 222, 128, 0.25);
}
.issue-status-dismissed {
background: rgba(136, 136, 136, 0.15);
color: #888;
border: 1px solid rgba(136, 136, 136, 0.25);
}
/* Priority Dots */
.issue-priority-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
}
.issue-priority-low, .issue-priority-dot.issue-priority-low {
background: #666;
}
.issue-priority-normal, .issue-priority-dot.issue-priority-normal {
background: #4da6ff;
}
.issue-priority-high, .issue-priority-dot.issue-priority-high {
background: #ff4d4d;
box-shadow: 0 0 6px rgba(255, 77, 77, 0.4);
}
/* Nav Badge */
.issues-nav-badge {
position: absolute;
top: 4px;
right: 4px;
background: #ffa500;
color: #000;
font-size: 10px;
font-weight: 700;
min-width: 16px;
height: 16px;
line-height: 16px;
text-align: center;
border-radius: 8px;
padding: 0 4px;
}
/* ===== Report Issue Modal ===== */
.report-issue-modal {
max-width: 580px;
width: 95vw;
}
.report-issue-entity-info {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
padding: 14px 16px;
margin-bottom: 18px;
}
.report-issue-entity-name {
font-size: 15px;
font-weight: 500;
color: #fff;
}
.report-issue-entity-artist {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
margin-top: 3px;
}
.report-issue-section {
margin-bottom: 16px;
}
.report-issue-label {
display: block;
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.6);
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 10px;
}
.report-issue-optional {
font-weight: 400;
text-transform: none;
letter-spacing: 0;
color: rgba(255, 255, 255, 0.3);
}
.report-issue-category-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 8px;
}
.report-issue-category-card {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
padding: 12px 10px;
cursor: pointer;
transition: all 0.2s ease;
text-align: center;
}
.report-issue-category-card:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.15);
}
.report-issue-category-card.selected {
background: rgba(var(--accent-light-rgb), 0.1);
border-color: rgba(var(--accent-light-rgb), 0.4);
}
.report-issue-category-icon {
font-size: 22px;
margin-bottom: 6px;
}
.report-issue-category-label {
font-size: 12px;
font-weight: 500;
color: #fff;
margin-bottom: 3px;
}
.report-issue-category-desc {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
line-height: 1.4;
}
.report-issue-input {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #fff;
padding: 10px 12px;
border-radius: 8px;
font-size: 14px;
outline: none;
transition: border-color 0.2s;
box-sizing: border-box;
}
.report-issue-input:focus {
border-color: rgba(var(--accent-light-rgb), 0.5);
}
.report-issue-textarea {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #fff;
padding: 10px 12px;
border-radius: 8px;
font-size: 13px;
outline: none;
resize: vertical;
min-height: 80px;
font-family: inherit;
transition: border-color 0.2s;
box-sizing: border-box;
}
.report-issue-textarea:focus {
border-color: rgba(var(--accent-light-rgb), 0.5);
}
.report-issue-priority-row {
display: flex;
gap: 8px;
}
.report-issue-priority-btn {
flex: 1;
padding: 8px 12px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.1);
color: rgba(255, 255, 255, 0.6);
border-radius: 8px;
cursor: pointer;
font-size: 13px;
transition: all 0.2s ease;
}
.report-issue-priority-btn:hover {
background: rgba(255, 255, 255, 0.08);
}
.report-issue-priority-btn.selected {
background: rgba(var(--accent-light-rgb), 0.12);
border-color: rgba(var(--accent-light-rgb), 0.4);
color: rgb(var(--accent-light-rgb));
}
/* ===== Issue Detail Modal ===== */
.issue-detail-modal {
max-width: 750px;
width: 95vw;
max-height: 85vh;
}
.issue-detail-modal .enhanced-bulk-modal-body {
overflow-y: auto;
max-height: calc(85vh - 120px);
}
/* Issue Detail — Hero Section (Enhanced Library Style) */
.issue-hero {
display: flex;
gap: 16px;
padding-bottom: 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
margin-bottom: 14px;
}
.issue-hero-art-group {
position: relative;
flex-shrink: 0;
}
.issue-hero-artist-thumb {
width: 48px;
height: 48px;
border-radius: 50%;
object-fit: cover;
position: absolute;
top: -6px;
left: -10px;
border: 2px solid rgba(30, 30, 30, 0.9);
z-index: 1;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
}
.issue-hero-album-art {
width: 140px;
height: 140px;
border-radius: 10px;
object-fit: cover;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
}
.issue-hero-album-placeholder {
width: 140px;
height: 140px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
display: flex;
align-items: center;
justify-content: center;
font-size: 40px;
color: rgba(255, 255, 255, 0.15);
}
.issue-hero-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
justify-content: center;
gap: 4px;
}
.issue-hero-artist {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
text-transform: uppercase;
letter-spacing: 0.5px;
font-weight: 500;
}
.issue-hero-album {
font-size: 20px;
font-weight: 700;
color: #fff;
line-height: 1.2;
}
.issue-hero-track-name {
font-size: 14px;
color: rgba(255, 255, 255, 0.7);
font-weight: 500;
margin-top: 2px;
}
.issue-hero-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
}
.issue-hero-genres {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 4px;
}
.issue-hero-genre-tag {
font-size: 10px;
padding: 2px 8px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.55);
border: 1px solid rgba(255, 255, 255, 0.08);
}
/* Issue Detail — Info Bar */
.issue-detail-info-bar {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 8px;
padding: 10px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
margin-bottom: 14px;
}
.issue-detail-info-left {
display: flex;
align-items: center;
gap: 10px;
}
.issue-detail-info-right {
display: flex;
align-items: center;
gap: 10px;
font-size: 12px;
}
/* Issue Detail — Action Buttons */
.issue-action-buttons {
display: flex;
gap: 8px;
margin-bottom: 14px;
}
.issue-action-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 8px 16px;
border-radius: 8px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
border: 1px solid transparent;
transition: all 0.2s ease;
font-family: inherit;
}
.issue-action-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.issue-action-download {
background: rgba(var(--accent-light-rgb), 0.12);
color: rgb(var(--accent-light-rgb));
border-color: rgba(var(--accent-light-rgb), 0.25);
}
.issue-action-download:hover:not(:disabled) {
background: rgba(var(--accent-light-rgb), 0.22);
border-color: rgba(var(--accent-light-rgb), 0.4);
}
.issue-action-wishlist {
background: rgba(255, 165, 0, 0.1);
color: #ffa500;
border-color: rgba(255, 165, 0, 0.2);
}
.issue-action-wishlist:hover:not(:disabled) {
background: rgba(255, 165, 0, 0.2);
border-color: rgba(255, 165, 0, 0.35);
}
/* Issue Detail — Track Duration */
.issue-detail-tracklist-dur {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
flex-shrink: 0;
min-width: 36px;
text-align: right;
}
.issue-detail-section {
margin-bottom: 16px;
}
.issue-detail-section-title {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.6px;
color: rgba(255, 255, 255, 0.4);
margin-bottom: 8px;
font-weight: 500;
}
.issue-detail-meta-row {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 12px;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.issue-detail-category {
font-size: 13px;
color: rgba(255, 255, 255, 0.7);
}
.issue-detail-date {
color: rgba(255, 255, 255, 0.35);
}
.issue-detail-profile {
background: rgba(255, 255, 255, 0.06);
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
}
.issue-detail-title-text {
font-size: 15px;
font-weight: 500;
color: #fff;
margin-bottom: 8px;
}
.issue-detail-description {
font-size: 13px;
color: rgba(255, 255, 255, 0.65);
line-height: 1.6;
white-space: pre-wrap;
}
.issue-detail-no-desc {
font-size: 13px;
color: rgba(255, 255, 255, 0.25);
font-style: italic;
}
/* Issue Detail — Snapshot */
.issue-detail-snapshot {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 12px 14px;
}
.issue-detail-snapshot-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
}
.issue-detail-snapshot-row:last-child {
border-bottom: none;
}
.issue-detail-snapshot-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
flex-shrink: 0;
min-width: 70px;
}
.issue-detail-snapshot-value {
font-size: 12px;
color: rgba(255, 255, 255, 0.75);
text-align: right;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 350px;
}
.issue-detail-snapshot-tracklist-header {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.35);
margin-top: 10px;
margin-bottom: 6px;
padding-top: 8px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
}
.issue-detail-snapshot-track {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
padding: 2px 0;
}
.issue-detail-snapshot-track-meta {
color: rgba(255, 255, 255, 0.3);
font-size: 11px;
margin-left: 6px;
}
/* Issue Detail — Metadata Grid */
.issue-detail-meta-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 8px;
}
.issue-meta-item {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 10px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 8px;
}
.issue-meta-icon {
font-size: 14px;
opacity: 0.5;
flex-shrink: 0;
width: 18px;
text-align: center;
}
.issue-meta-label {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.4px;
color: rgba(255, 255, 255, 0.35);
flex-shrink: 0;
}
.issue-meta-value {
font-size: 13px;
color: rgba(255, 255, 255, 0.85);
margin-left: auto;
font-weight: 500;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 120px;
}
/* Issue Detail — Album Context (for track issues) */
.issue-detail-album-context {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
}
.issue-detail-album-context-thumb {
width: 44px;
height: 44px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
}
.issue-detail-album-context-info {
flex: 1;
min-width: 0;
}
.issue-detail-album-context-title {
font-size: 13px;
font-weight: 500;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.issue-detail-album-context-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
margin-top: 2px;
}
/* Issue Detail — File Path */
.issue-detail-filepath {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
background: rgba(0, 0, 0, 0.2);
padding: 8px 10px;
border-radius: 6px;
font-family: monospace;
word-break: break-all;
border: 1px solid rgba(255, 255, 255, 0.04);
}
/* Issue Detail — Track Listing (redesigned) */
.issue-detail-tracklist {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 10px;
padding: 6px 0;
max-height: 240px;
overflow-y: auto;
}
.issue-detail-tracklist-disc {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.35);
padding: 8px 14px 4px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.issue-detail-tracklist-disc:first-child {
border-top: none;
padding-top: 4px;
}
.issue-detail-tracklist-row {
display: flex;
align-items: center;
padding: 4px 14px;
gap: 10px;
transition: background 0.15s;
}
.issue-detail-tracklist-row:hover {
background: rgba(255, 255, 255, 0.03);
}
.issue-detail-tracklist-num {
font-size: 12px;
color: rgba(255, 255, 255, 0.3);
min-width: 22px;
text-align: right;
flex-shrink: 0;
}
.issue-detail-tracklist-title {
font-size: 13px;
color: rgba(255, 255, 255, 0.75);
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.issue-detail-tracklist-meta {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
.issue-detail-section-count {
font-weight: 400;
color: rgba(255, 255, 255, 0.3);
font-size: 10px;
text-transform: none;
letter-spacing: 0;
margin-left: 6px;
}
/* Issue Detail — External Links */
.issue-ext-chips {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.issue-ext-chip {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 4px 10px;
border-radius: 6px;
font-size: 12px;
font-weight: 500;
text-decoration: none;
cursor: pointer;
transition: all 0.2s ease;
border: 1px solid transparent;
}
.issue-ext-chip-type {
font-weight: 400;
font-size: 10px;
opacity: 0.7;
}
.issue-ext-chip.ext-spotify {
background: rgba(30, 215, 96, 0.1);
color: #1ed760;
border-color: rgba(30, 215, 96, 0.2);
}
.issue-ext-chip.ext-spotify:hover {
background: rgba(30, 215, 96, 0.2);
}
.issue-ext-chip.ext-mb {
background: rgba(186, 81, 163, 0.1);
color: #d4a0cb;
border-color: rgba(186, 81, 163, 0.2);
}
.issue-ext-chip.ext-mb:hover {
background: rgba(186, 81, 163, 0.2);
}
.issue-ext-chip.ext-deezer {
background: rgba(160, 54, 255, 0.1);
color: #c88eff;
border-color: rgba(160, 54, 255, 0.2);
}
.issue-ext-chip.ext-deezer:hover {
background: rgba(160, 54, 255, 0.2);
}
.issue-ext-chip.ext-tidal {
background: rgba(0, 255, 255, 0.08);
color: #66ffff;
border-color: rgba(0, 255, 255, 0.15);
}
.issue-ext-chip.ext-tidal:hover {
background: rgba(0, 255, 255, 0.15);
}
.issue-ext-chip.ext-qobuz {
background: rgba(0, 130, 200, 0.1);
color: #5bb8e8;
border-color: rgba(0, 130, 200, 0.2);
}
.issue-ext-chip.ext-qobuz:hover {
background: rgba(0, 130, 200, 0.2);
}
/* Issue Detail — Responsive */
@media (max-width: 768px) {
.issue-hero {
flex-direction: column;
align-items: center;
text-align: center;
}
.issue-hero-album-art,
.issue-hero-album-placeholder {
width: 120px;
height: 120px;
}
.issue-hero-artist-thumb {
width: 40px;
height: 40px;
}
.issue-hero-info {
align-items: center;
}
.issue-hero-genres {
justify-content: center;
}
.issue-hero-album {
font-size: 17px;
}
.issue-detail-info-bar {
flex-direction: column;
align-items: flex-start;
}
.issue-action-buttons {
flex-direction: column;
}
.issue-action-btn {
justify-content: center;
}
.issue-detail-meta-grid {
grid-template-columns: repeat(2, 1fr);
}
.issue-meta-value {
max-width: 80px;
}
.issue-ext-chips {
gap: 4px;
justify-content: center;
}
.issue-ext-chip {
font-size: 11px;
padding: 3px 8px;
}
}
/* Issue Detail — Admin Response */
.issue-detail-response-textarea {
width: 100%;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.1);
color: #fff;
padding: 10px 12px;
border-radius: 8px;
font-size: 13px;
outline: none;
resize: vertical;
min-height: 70px;
font-family: inherit;
transition: border-color 0.2s;
box-sizing: border-box;
}
.issue-detail-response-textarea:focus {
border-color: rgba(var(--accent-light-rgb), 0.5);
}
.issue-detail-admin-response {
background: rgba(74, 222, 128, 0.06);
border: 1px solid rgba(74, 222, 128, 0.15);
border-radius: 10px;
padding: 12px 14px;
font-size: 13px;
color: rgba(255, 255, 255, 0.75);
line-height: 1.6;
white-space: pre-wrap;
}
/* Issue Detail — Footer Action Buttons */
.issue-btn-progress {
background: rgba(77, 166, 255, 0.15) !important;
border-color: rgba(77, 166, 255, 0.3) !important;
color: #4da6ff !important;
}
.issue-btn-progress:hover {
background: rgba(77, 166, 255, 0.25) !important;
}
.issue-btn-resolve {
background: rgba(74, 222, 128, 0.15) !important;
border-color: rgba(74, 222, 128, 0.3) !important;
color: #4ade80 !important;
}
.issue-btn-resolve:hover {
background: rgba(74, 222, 128, 0.25) !important;
}
.issue-btn-dismiss {
background: rgba(136, 136, 136, 0.15) !important;
border-color: rgba(136, 136, 136, 0.3) !important;
color: #aaa !important;
}
.issue-btn-dismiss:hover {
background: rgba(136, 136, 136, 0.25) !important;
}
.issue-btn-reopen {
background: rgba(255, 165, 0, 0.15) !important;
border-color: rgba(255, 165, 0, 0.3) !important;
color: #ffa500 !important;
}
.issue-btn-reopen:hover {
background: rgba(255, 165, 0, 0.25) !important;
}
.issue-btn-delete {
background: rgba(255, 77, 77, 0.1) !important;
border-color: rgba(255, 77, 77, 0.2) !important;
color: #ff6b6b !important;
}
.issue-btn-delete:hover {
background: rgba(255, 77, 77, 0.2) !important;
}
/* ===== Issues Page — Responsive ===== */
@media (max-width: 768px) {
.issues-header {
flex-direction: column;
}
.issues-stats {
flex-wrap: wrap;
}
.issues-stat-card {
min-width: 80px;
}
.issue-card {
flex-wrap: wrap;
padding: 12px;
}
.issue-card-left {
display: none;
}
.issue-card-description {
max-width: 100%;
}
.report-issue-category-grid {
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
}
.issue-detail-header-info {
flex-direction: column;
}
.issue-detail-snapshot-value {
max-width: 200px;
}
}
/* ============================================ */
/* == METADATA CACHE BROWSER == */
/* ============================================ */
.mcache-modal-overlay {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.85);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
animation: mcache-fadeIn 0.2s ease;
}
@keyframes mcache-fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.mcache-modal {
width: 95vw;
max-width: 1400px;
height: 95vh;
max-height: 95vh;
background: rgba(14, 14, 14, 0.98);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 25px 80px rgba(0, 0, 0, 0.6);
}
.mcache-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
}
.mcache-modal-title {
margin: 0;
font-size: 17px;
font-weight: 600;
color: #fff;
}
.mcache-modal-header-actions {
display: flex;
align-items: center;
gap: 10px;
}
.mcache-btn-clear {
background: rgba(239, 68, 68, 0.12);
color: #ef4444;
border: 1px solid rgba(239, 68, 68, 0.2);
border-radius: 8px;
padding: 6px 14px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.mcache-btn-clear:hover {
background: rgba(239, 68, 68, 0.2);
border-color: rgba(239, 68, 68, 0.35);
}
.mcache-clear-dropdown {
position: relative;
display: inline-block;
}
.mcache-clear-dropdown-menu {
display: none;
position: absolute;
top: 100%;
right: 0;
margin-top: 4px;
background: #1e1e2e;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 10px;
padding: 4px;
min-width: 180px;
z-index: 1000;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
}
.mcache-clear-dropdown-menu button {
display: flex;
align-items: center;
width: 100%;
padding: 8px 12px;
background: none;
border: none;
color: rgba(255, 255, 255, 0.7);
font-size: 12px;
cursor: pointer;
border-radius: 6px;
transition: background 0.15s;
white-space: nowrap;
}
.mcache-clear-dropdown-menu button:hover {
background: rgba(255, 255, 255, 0.06);
color: #fff;
}
.mcache-modal-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.4);
font-size: 24px;
cursor: pointer;
padding: 0 4px;
line-height: 1;
transition: color 0.2s;
}
.mcache-modal-close:hover {
color: #fff;
}
/* Stats Bar */
.mcache-stats-bar {
display: flex;
gap: 10px;
padding: 14px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
flex-wrap: wrap;
}
.mcache-stat-pill {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 8px 16px;
display: flex;
flex-direction: column;
align-items: center;
gap: 2px;
min-width: 100px;
}
.mcache-stat-pill-label {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.4);
}
.mcache-stat-pill-value {
font-size: 18px;
font-weight: 600;
color: var(--accent, #6d5dfc);
}
/* Tabs */
.mcache-tabs {
display: flex;
gap: 0;
padding: 0 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
}
.mcache-tab {
background: none;
border: none;
border-bottom: 2px solid transparent;
color: rgba(255, 255, 255, 0.45);
font-size: 13px;
font-weight: 500;
padding: 12px 20px;
cursor: pointer;
transition: all 0.2s ease;
}
.mcache-tab:hover {
color: rgba(255, 255, 255, 0.7);
}
.mcache-tab.active {
color: var(--accent, #6d5dfc);
border-bottom-color: var(--accent, #6d5dfc);
}
/* Filters */
.mcache-filters {
display: flex;
gap: 10px;
padding: 14px 24px;
flex-shrink: 0;
flex-wrap: wrap;
}
.mcache-search-input {
flex: 1;
min-width: 200px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 9px 14px;
color: #fff;
font-size: 13px;
outline: none;
transition: border-color 0.2s;
}
.mcache-search-input:focus {
border-color: rgba(var(--accent-rgb, 109, 93, 252), 0.4);
}
.mcache-search-input::placeholder {
color: rgba(255, 255, 255, 0.25);
}
.mcache-source-filter,
.mcache-sort-filter {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 9px 12px;
color: #fff;
font-size: 12px;
cursor: pointer;
outline: none;
}
.mcache-source-filter option,
.mcache-sort-filter option {
background: #1a1a1a;
color: #fff;
}
/* Grid */
.mcache-grid {
flex: 1;
overflow-y: auto;
padding: 16px 24px;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 12px;
align-content: start;
}
.mcache-grid::-webkit-scrollbar {
width: 6px;
}
.mcache-grid::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.12);
border-radius: 3px;
}
/* Cards */
.mcache-card {
background: rgba(22, 22, 22, 0.95);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 14px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
flex-direction: column;
gap: 8px;
}
.mcache-card:hover {
border-color: rgba(var(--accent-rgb, 109, 93, 252), 0.25);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
}
.mcache-card-top {
display: flex;
gap: 12px;
align-items: flex-start;
}
.mcache-card-image {
width: 56px;
height: 56px;
border-radius: 6px;
object-fit: cover;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.05);
}
.mcache-card-image.artist {
border-radius: 50%;
}
.mcache-card-image-placeholder {
width: 56px;
height: 56px;
border-radius: 6px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
font-weight: 700;
color: rgba(255, 255, 255, 0.5);
background: linear-gradient(135deg, rgba(var(--accent-rgb, 109, 93, 252), 0.2), rgba(var(--accent-rgb, 109, 93, 252), 0.05));
}
.mcache-card-image-placeholder.artist {
border-radius: 50%;
}
.mcache-card-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.mcache-card-name {
font-size: 13px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mcache-card-sub {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mcache-card-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
}
.mcache-card-bottom {
display: flex;
align-items: center;
justify-content: space-between;
gap: 6px;
padding-top: 6px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.mcache-source-badge {
font-size: 9px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.3px;
padding: 2px 7px;
border-radius: 8px;
}
.mcache-source-badge.spotify {
background: rgba(30, 215, 96, 0.15);
color: #1ed760;
}
.mcache-source-badge.itunes {
background: rgba(252, 60, 68, 0.15);
color: #fc3c44;
}
.mcache-source-badge.deezer {
background: rgba(160, 55, 255, 0.15);
color: #a037ff;
}
.mcache-source-badge.beatport {
background: rgba(0, 210, 120, 0.15);
color: #00d278;
}
.mcache-source-badge.musicbrainz {
background: rgba(186, 71, 143, 0.15);
color: #BA478F;
}
.mcache-card.mb-matched {
border-left: 2px solid rgba(76, 175, 80, 0.5);
}
.mcache-card.mb-failed {
border-left: 2px solid rgba(255, 152, 0, 0.5);
cursor: default;
}
.mcache-card-cache-info {
font-size: 10px;
color: rgba(255, 255, 255, 0.25);
}
/* Type badges */
.mcache-type-badge {
font-size: 9px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.3px;
padding: 1px 6px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.4);
}
/* Empty state */
.mcache-empty {
grid-column: 1 / -1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60px 20px;
text-align: center;
}
.mcache-empty-icon {
font-size: 48px;
margin-bottom: 16px;
opacity: 0.3;
}
.mcache-empty-title {
font-size: 18px;
font-weight: 600;
background: linear-gradient(135deg, var(--accent, #6d5dfc), rgba(var(--accent-rgb, 109, 93, 252), 0.5));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 8px;
}
.mcache-empty-sub {
font-size: 13px;
color: rgba(255, 255, 255, 0.35);
max-width: 340px;
}
/* Pagination */
.mcache-pagination {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 14px 24px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
flex-shrink: 0;
}
.mcache-page-btn {
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px;
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
padding: 6px 10px;
cursor: pointer;
transition: all 0.2s;
min-width: 32px;
text-align: center;
}
.mcache-page-btn:hover {
background: rgba(255, 255, 255, 0.08);
color: #fff;
}
.mcache-page-btn.active {
background: rgba(var(--accent-rgb, 109, 93, 252), 0.2);
border-color: rgba(var(--accent-rgb, 109, 93, 252), 0.3);
color: var(--accent, #6d5dfc);
}
.mcache-page-btn:disabled {
opacity: 0.3;
cursor: not-allowed;
}
/* Detail Modal */
.mcache-detail-overlay {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0, 0, 0, 0.6);
z-index: 10001;
display: flex;
align-items: center;
justify-content: center;
animation: mcache-fadeIn 0.15s ease;
}
.mcache-detail-modal {
width: 90vw;
max-width: 700px;
max-height: 85vh;
background: rgba(18, 18, 18, 0.99);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 14px;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.mcache-detail-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
}
.mcache-detail-title {
margin: 0;
font-size: 15px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.mcache-detail-body {
flex: 1;
overflow-y: auto;
padding: 20px;
}
.mcache-detail-body::-webkit-scrollbar {
width: 6px;
}
.mcache-detail-body::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.12);
border-radius: 3px;
}
.mcache-detail-hero {
display: flex;
gap: 20px;
align-items: flex-start;
margin-bottom: 20px;
}
.mcache-detail-image {
width: 160px;
height: 160px;
border-radius: 10px;
object-fit: cover;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.05);
}
.mcache-detail-image.artist {
border-radius: 50%;
}
.mcache-detail-image-placeholder {
width: 160px;
height: 160px;
border-radius: 10px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
font-weight: 700;
color: rgba(255, 255, 255, 0.4);
background: linear-gradient(135deg, rgba(var(--accent-rgb, 109, 93, 252), 0.25), rgba(var(--accent-rgb, 109, 93, 252), 0.05));
}
.mcache-detail-image-placeholder.artist {
border-radius: 50%;
}
.mcache-detail-hero-info {
flex: 1;
min-width: 0;
}
.mcache-detail-hero-name {
font-size: 22px;
font-weight: 700;
color: #fff;
margin-bottom: 6px;
word-wrap: break-word;
}
.mcache-detail-hero-sub {
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
margin-bottom: 10px;
}
.mcache-detail-badges {
display: flex;
gap: 6px;
flex-wrap: wrap;
margin-bottom: 10px;
}
.mcache-detail-table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
.mcache-detail-table tr {
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.mcache-detail-table td {
padding: 8px 0;
font-size: 12px;
vertical-align: top;
}
.mcache-detail-table td:first-child {
color: rgba(255, 255, 255, 0.4);
width: 130px;
font-weight: 500;
padding-right: 12px;
}
.mcache-detail-table td:last-child {
color: rgba(255, 255, 255, 0.8);
word-break: break-word;
}
.mcache-detail-section-title {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.5);
text-transform: uppercase;
letter-spacing: 0.5px;
margin: 20px 0 10px;
padding-bottom: 6px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.mcache-raw-json-toggle {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
padding: 8px 14px;
cursor: pointer;
width: 100%;
text-align: left;
transition: all 0.2s;
margin-bottom: 8px;
}
.mcache-raw-json-toggle:hover {
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.7);
}
.mcache-raw-json {
background: rgba(0, 0, 0, 0.4);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
padding: 14px;
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
font-size: 11px;
color: rgba(255, 255, 255, 0.65);
overflow-x: auto;
white-space: pre-wrap;
word-break: break-all;
max-height: 400px;
overflow-y: auto;
line-height: 1.5;
}
/* Responsive */
@media (max-width: 768px) {
.mcache-modal {
width: 100vw;
height: 100vh;
border-radius: 0;
}
.mcache-grid {
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
}
.mcache-detail-hero {
flex-direction: column;
align-items: center;
text-align: center;
}
.mcache-detail-image,
.mcache-detail-image-placeholder {
width: 120px;
height: 120px;
}
.mcache-filters {
flex-direction: column;
}
}
/* ================================================================
LIBRARY MAINTENANCE MODAL
================================================================ */
/* Findings badge on header button */
.repair-badge {
position: absolute;
top: -4px;
right: -4px;
background: #ef4444;
color: #fff;
font-size: 10px;
font-weight: 700;
min-width: 16px;
height: 16px;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 4px;
line-height: 1;
z-index: 10;
}
/* Modal overlay */
.repair-modal-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(4px);
}
.repair-modal {
background: rgba(14, 14, 14, 0.98);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
width: 94vw;
max-width: 1100px;
max-height: 90vh;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);
}
.repair-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
background: linear-gradient(135deg, rgba(255, 255, 255, 0.02) 0%, rgba(var(--accent-rgb, 99, 102, 241), 0.04) 100%);
}
.repair-modal-header-left {
display: flex;
align-items: center;
gap: 16px;
min-width: 0;
}
.repair-modal-logo {
width: 56px;
height: 56px;
object-fit: contain;
flex-shrink: 0;
filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.3));
}
.repair-modal-header-text {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.repair-modal-title {
font-size: 20px;
font-weight: 600;
color: #fff;
margin: 0;
line-height: 1.2;
}
.repair-modal-subtitle {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
margin: 0;
line-height: 1.3;
}
.repair-modal-header-actions {
display: flex;
align-items: center;
gap: 16px;
flex-shrink: 0;
}
.repair-modal-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.5);
font-size: 24px;
cursor: pointer;
padding: 4px 8px;
border-radius: 6px;
transition: all 0.2s ease;
}
.repair-modal-close:hover {
color: #fff;
background: rgba(255, 255, 255, 0.1);
}
/* Master toggle */
.repair-master-toggle {
display: flex;
align-items: center;
gap: 10px;
cursor: pointer;
}
.repair-toggle-label {
font-size: 13px;
color: rgba(255, 255, 255, 0.6);
font-weight: 500;
}
.repair-toggle-slider {
position: relative;
width: 44px;
height: 24px;
background: rgba(255, 255, 255, 0.12);
border-radius: 12px;
transition: background 0.2s ease;
display: inline-block;
}
.repair-toggle-slider::after {
content: '';
position: absolute;
top: 3px;
left: 3px;
width: 18px;
height: 18px;
background: #fff;
border-radius: 50%;
transition: transform 0.2s ease;
}
.repair-master-toggle input {
display: none;
}
.repair-master-toggle input:checked + .repair-toggle-slider {
background: var(--accent-color, #6366f1);
}
.repair-master-toggle input:checked + .repair-toggle-slider::after {
transform: translateX(20px);
}
/* Job toggle sizing moved to .repair-job-toggle block in Jobs Tab section */
/* Tabs */
.repair-tabs {
display: flex;
gap: 0;
padding: 0 24px;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.repair-tab {
background: none;
border: none;
color: rgba(255, 255, 255, 0.5);
font-size: 14px;
font-weight: 500;
padding: 12px 20px;
cursor: pointer;
border-bottom: 2px solid transparent;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 6px;
}
.repair-tab:hover {
color: rgba(255, 255, 255, 0.8);
}
.repair-tab.active {
color: var(--accent-color, #6366f1);
border-bottom-color: var(--accent-color, #6366f1);
}
.repair-tab-badge {
background: #ef4444;
color: #fff;
font-size: 10px;
font-weight: 700;
min-width: 18px;
height: 18px;
border-radius: 9px;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 5px;
}
/* Tab content */
.repair-tab-content {
flex: 1;
overflow-y: auto;
padding: 16px 24px;
}
.repair-loading, .repair-empty {
text-align: center;
color: rgba(255, 255, 255, 0.4);
padding: 48px 20px;
font-size: 14px;
}
/* Gradient empty state — matches automations-empty */
.repair-empty-state {
text-align: center;
padding: 80px 24px;
background: linear-gradient(135deg, rgba(var(--accent-rgb, 99, 102, 241), 0.03) 0%, transparent 60%);
border-radius: 20px;
border: 1px dashed rgba(255, 255, 255, 0.08);
}
.repair-empty-icon { font-size: 56px; margin-bottom: 20px; filter: grayscale(0.3); }
.repair-empty-title {
font-size: 22px; font-weight: 700; margin-bottom: 10px;
background: linear-gradient(135deg, #fff 0%, rgb(var(--accent-light-rgb, 129, 140, 248)) 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}
.repair-empty-text {
font-size: 14px; color: rgba(255, 255, 255, 0.4); margin-bottom: 0;
max-width: 420px; margin-left: auto; margin-right: auto; line-height: 1.6;
}
/* ── Jobs Tab ── */
.repair-jobs-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.repair-job-card {
background: rgba(22, 22, 22, 0.95);
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 10px;
overflow: hidden;
transition: all 0.2s ease;
}
.repair-job-card:hover {
background: rgba(28, 28, 28, 0.98);
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.2);
}
.repair-job-card.running {
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.35);
box-shadow: 0 0 12px rgba(var(--accent-rgb, 99, 102, 241), 0.08),
inset 0 0 20px rgba(var(--accent-rgb, 99, 102, 241), 0.03);
}
.repair-job-card.disabled {
opacity: 0.55;
}
.repair-job-card.disabled:hover {
opacity: 0.75;
}
.repair-job-main {
display: flex;
align-items: center;
padding: 10px 14px;
gap: 10px;
}
/* Status dot — matches automation-status */
.repair-job-status {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.repair-job-status.enabled {
background: #4ade80;
box-shadow: 0 0 6px rgba(74, 222, 128, 0.4);
}
.repair-job-status.disabled {
background: #555;
}
.repair-job-status.running {
background: rgb(var(--accent-rgb, 99, 102, 241));
box-shadow: 0 0 6px rgba(var(--accent-rgb, 99, 102, 241), 0.4);
animation: repair-status-pulse 1.5s ease-in-out infinite;
}
@keyframes repair-status-pulse {
0%, 100% { opacity: 1; box-shadow: 0 0 6px rgba(var(--accent-rgb, 99, 102, 241), 0.4); }
50% { opacity: 0.4; box-shadow: 0 0 2px rgba(var(--accent-rgb, 99, 102, 241), 0.2); }
}
.repair-job-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.repair-job-name {
font-size: 13px;
font-weight: 600;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Flow visualization — job type badges */
.repair-job-flow {
display: flex;
gap: 6px;
flex-wrap: wrap;
align-items: center;
}
.repair-flow-badge {
font-size: 11px;
padding: 2px 8px;
border-radius: 10px;
font-weight: 500;
white-space: nowrap;
}
.repair-flow-badge.scan {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.12);
color: rgb(var(--accent-light-rgb, 129, 140, 248));
}
.repair-flow-badge.autofix {
background: rgba(59, 130, 246, 0.12);
color: #60a5fa;
}
.repair-flow-badge.dryrun {
background: rgba(250, 204, 21, 0.10);
color: #fbbf24;
}
.repair-flow-badge.findings {
background: rgba(239, 68, 68, 0.10);
color: #f87171;
}
.repair-flow-arrow {
color: rgba(255, 255, 255, 0.25);
font-size: 12px;
}
.repair-job-meta {
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
line-height: 1.3;
}
.repair-job-actions {
display: flex;
align-items: center;
gap: 4px;
flex-shrink: 0;
}
/* Toggle — matches automation-toggle (32x18) */
.repair-job-toggle {
position: relative;
width: 32px;
height: 18px;
flex-shrink: 0;
}
.repair-job-toggle input { display: none; }
.repair-job-toggle .repair-toggle-slider.small {
width: 32px;
height: 18px;
border-radius: 9px;
}
.repair-job-toggle .repair-toggle-slider.small::after {
top: 3px;
left: 3px;
width: 12px;
height: 12px;
}
.repair-job-toggle input:checked + .repair-toggle-slider.small {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.5);
}
.repair-job-toggle input:checked + .repair-toggle-slider.small::after {
transform: translateX(14px);
background: rgb(var(--accent-light-rgb, 129, 140, 248));
}
/* Action buttons — compact 26x26 */
.repair-run-btn, .repair-settings-btn {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.4);
width: 26px;
height: 26px;
border-radius: 6px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 11px;
transition: all 0.2s ease;
}
.repair-run-btn:hover {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.15);
color: rgb(var(--accent-light-rgb, 129, 140, 248));
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.3);
}
.repair-settings-btn:hover {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.7);
}
/* Job settings panel */
.repair-job-settings {
padding: 12px 16px 16px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
background: rgba(0, 0, 0, 0.2);
}
.repair-setting-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 6px 0;
gap: 12px;
}
.repair-setting-row label {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.repair-setting-input {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
color: #fff;
padding: 5px 10px;
font-size: 12px;
width: 100px;
text-align: right;
}
.repair-setting-input[type="checkbox"] {
width: auto;
accent-color: var(--accent-color, #6366f1);
}
.repair-save-settings-btn {
margin-top: 10px;
background: var(--accent-color, #6366f1);
color: #fff;
border: none;
border-radius: 6px;
padding: 6px 16px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: opacity 0.2s ease;
}
.repair-save-settings-btn:hover {
opacity: 0.85;
}
/* ── Findings Dashboard ── */
.repair-findings-dashboard {
margin-bottom: 16px;
}
.repair-dashboard-summary {
display: flex;
gap: 10px;
margin-bottom: 14px;
flex-wrap: wrap;
}
.repair-dashboard-stat {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.repair-dashboard-stat .stat-count {
font-size: 18px;
font-weight: 700;
color: #fff;
line-height: 1;
}
.repair-dashboard-stat.pending .stat-count {
color: #f59e0b;
}
.repair-dashboard-stat.resolved .stat-count {
color: #22c55e;
}
.repair-dashboard-stat.dismissed .stat-count {
color: rgba(255, 255, 255, 0.35);
}
.repair-dashboard-stat.auto-fixed .stat-count {
color: #3b82f6;
}
.repair-dashboard-jobs {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.repair-dashboard-chip {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 10px;
cursor: pointer;
transition: all 0.2s ease;
min-width: 0;
}
.repair-dashboard-chip:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.14);
}
.repair-dashboard-chip.active {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.12);
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.3);
}
.repair-dashboard-chip-name {
font-size: 12px;
font-weight: 500;
color: rgba(255, 255, 255, 0.75);
white-space: nowrap;
}
.repair-dashboard-chip-count {
font-size: 14px;
font-weight: 700;
color: #fff;
min-width: 20px;
text-align: center;
}
.repair-dashboard-chip-bar {
display: flex;
gap: 3px;
align-items: center;
}
.repair-dashboard-chip-severity {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
}
.repair-dashboard-chip-severity.warning {
background: #f59e0b;
box-shadow: 0 0 4px rgba(245, 158, 11, 0.4);
}
.repair-dashboard-chip-severity.info {
background: #3b82f6;
box-shadow: 0 0 4px rgba(59, 130, 246, 0.3);
}
/* ── Cache Health Bar (Repair Dashboard) ── */
.repair-cache-health { margin-top: 12px; }
.repair-cache-health-bar {
display: flex; align-items: center; gap: 10px;
padding: 10px 16px; border-radius: 10px; cursor: pointer;
background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
transition: all 0.2s;
}
.repair-cache-health-bar:hover { background: rgba(255,255,255,0.05); border-color: rgba(var(--accent-rgb), 0.15); }
.repair-cache-health-dot {
width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
}
.repair-cache-health-dot.healthy { background: #22c55e; box-shadow: 0 0 6px rgba(34,197,94,0.4); }
.repair-cache-health-dot.fair { background: #f59e0b; box-shadow: 0 0 6px rgba(245,158,11,0.4); }
.repair-cache-health-dot.poor { background: #ef4444; box-shadow: 0 0 6px rgba(239,68,68,0.4); }
.repair-cache-health-title { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.7); }
.repair-cache-health-summary { flex: 1; font-size: 12px; color: rgba(255,255,255,0.3); }
.repair-cache-health-action { font-size: 12px; color: rgb(var(--accent-rgb)); white-space: nowrap; }
/* ── Cache Health Modal ── */
.cache-health-modal {
width: 680px; max-width: 95vw; max-height: 85vh;
background: linear-gradient(135deg, rgba(20,20,20,0.97) 0%, rgba(12,12,12,0.99) 100%);
backdrop-filter: blur(20px) saturate(1.2);
border-radius: 20px;
border: 1px solid rgba(255,255,255,0.1);
border-top: 1px solid rgba(255,255,255,0.15);
box-shadow: 0 20px 60px rgba(0,0,0,0.6), 0 8px 32px rgba(0,0,0,0.4),
0 0 40px rgba(var(--accent-rgb), 0.08), inset 0 1px 0 rgba(255,255,255,0.1);
display: flex; flex-direction: column; overflow: hidden;
}
.cache-health-header {
display: flex; align-items: center; justify-content: space-between;
padding: 20px 24px;
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.06) 0%, transparent 60%);
border-bottom: 1px solid rgba(var(--accent-rgb), 0.12);
}
.cache-health-header-content { display: flex; align-items: center; gap: 14px; }
.cache-health-header-icon { font-size: 28px; opacity: 0.9; }
.cache-health-title {
font-size: 20px; font-weight: 700; color: #fff; letter-spacing: -0.3px;
font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif;
}
.cache-health-subtitle { font-size: 13px; color: rgba(255,255,255,0.45); margin-top: 2px; }
.cache-health-body { flex: 1; overflow-y: auto; padding: 20px 24px; }
.cache-health-footer {
display: flex; justify-content: flex-end; padding: 16px 24px;
border-top: 1px solid rgba(255,255,255,0.06); background: rgba(0,0,0,0.2);
}
.cache-health-loading {
display: flex; flex-direction: column; align-items: center; justify-content: center;
padding: 48px; gap: 12px; color: rgba(255,255,255,0.5); font-size: 14px;
}
/* Status banner */
.cache-health-status {
display: flex; align-items: center; gap: 12px;
padding: 14px 18px; border-radius: 12px; margin-bottom: 20px;
}
.cache-health-status.healthy { background: rgba(34,197,94,0.08); border: 1px solid rgba(34,197,94,0.2); }
.cache-health-status.fair { background: rgba(245,158,11,0.08); border: 1px solid rgba(245,158,11,0.2); }
.cache-health-status.poor { background: rgba(239,68,68,0.08); border: 1px solid rgba(239,68,68,0.2); }
.cache-health-status-icon { font-size: 20px; }
.cache-health-status.healthy .cache-health-status-icon { color: #22c55e; }
.cache-health-status.fair .cache-health-status-icon { color: #f59e0b; }
.cache-health-status.poor .cache-health-status-icon { color: #ef4444; }
.cache-health-status-text { font-size: 14px; font-weight: 600; color: rgba(255,255,255,0.8); }
/* Stat cards */
.cache-health-cards {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 20px;
}
.cache-health-card {
text-align: center; padding: 14px 8px; border-radius: 12px;
background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
transition: border-color 0.2s;
}
.cache-health-card:hover { border-color: rgba(255,255,255,0.1); }
.cache-health-card-value { font-size: 22px; font-weight: 700; color: #fff; }
.cache-health-card-value.warn { color: rgba(255,180,80,0.9); }
.cache-health-card-label { font-size: 10px; color: rgba(255,255,255,0.35); text-transform: uppercase; letter-spacing: 0.5px; margin-top: 4px; }
/* Sections */
.cache-health-section { margin-bottom: 16px; }
.cache-health-section-title {
font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.35);
text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px;
}
/* Source bars */
.cache-health-source-bars { display: flex; flex-direction: column; gap: 8px; }
.cache-health-source-row { display: flex; align-items: center; gap: 10px; }
.cache-health-source-name { font-size: 13px; color: rgba(255,255,255,0.6); width: 60px; text-transform: capitalize; }
.cache-health-source-track {
flex: 1; height: 8px; border-radius: 4px; background: rgba(255,255,255,0.06); overflow: hidden;
}
.cache-health-source-fill { height: 100%; border-radius: 4px; transition: width 0.5s ease; }
.cache-health-source-count { font-size: 12px; color: rgba(255,255,255,0.4); width: 50px; text-align: right; }
/* Type pills */
.cache-health-type-pills { display: flex; gap: 8px; flex-wrap: wrap; }
.cache-health-pill {
padding: 6px 14px; border-radius: 20px; font-size: 13px; color: rgba(255,255,255,0.5);
background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06);
text-transform: capitalize;
}
.cache-health-pill strong { color: #fff; margin-left: 4px; }
/* Metrics grid */
.cache-health-metrics { display: flex; flex-direction: column; gap: 6px; }
.cache-health-metric {
display: flex; justify-content: space-between; align-items: center;
padding: 6px 0; border-bottom: 1px solid rgba(255,255,255,0.04);
}
.cache-health-metric:last-child { border-bottom: none; }
.cache-health-metric-label { font-size: 13px; color: rgba(255,255,255,0.4); }
.cache-health-metric-value { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.8); }
/* ── Findings Tab ── */
.repair-findings-toolbar {
display: flex;
align-items: center;
flex-wrap: wrap;
margin-bottom: 14px;
gap: 10px;
flex-wrap: wrap;
}
.repair-findings-filters {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.repair-findings-filters select {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
color: #fff;
padding: 6px 10px;
font-size: 12px;
cursor: pointer;
}
.repair-findings-filters select option {
background: #1a1a1a;
}
.repair-findings-summary {
display: flex;
gap: 16px;
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
}
.repair-findings-summary strong {
color: #fff;
font-weight: 600;
}
.repair-select-all {
display: flex;
align-items: center;
gap: 6px;
cursor: pointer;
color: rgba(255, 255, 255, 0.6);
font-size: 12px;
user-select: none;
}
.repair-select-all input[type="checkbox"] {
accent-color: rgb(var(--accent-rgb, 99, 102, 241));
cursor: pointer;
}
.repair-select-all:hover {
color: rgba(255, 255, 255, 0.9);
}
.repair-findings-bulk {
display: flex;
align-items: center;
gap: 6px;
}
.repair-bulk-count {
color: rgba(255, 255, 255, 0.6);
font-size: 12px;
margin-right: 4px;
}
.repair-bulk-btn {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 6px;
color: rgba(255, 255, 255, 0.7);
padding: 6px 14px;
font-size: 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.repair-bulk-btn:hover {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.repair-bulk-btn.fix {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.12);
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.3);
color: rgb(var(--accent-light-rgb, 129, 140, 248));
font-weight: 600;
}
.repair-bulk-btn.fix:hover {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.2);
}
.repair-bulk-btn.fix-all {
background: rgba(245, 158, 11, 0.12);
border-color: rgba(245, 158, 11, 0.3);
color: #fbbf24;
font-weight: 600;
}
.repair-bulk-btn.fix-all:hover {
background: rgba(245, 158, 11, 0.22);
}
.repair-clear-btn {
margin-left: auto;
background: rgba(239, 68, 68, 0.08);
border: 1px solid rgba(239, 68, 68, 0.2);
border-radius: 6px;
padding: 5px 12px;
color: #f87171;
font-size: 11px;
cursor: pointer;
transition: all 0.2s ease;
}
.repair-clear-btn:hover {
background: rgba(239, 68, 68, 0.18);
border-color: rgba(239, 68, 68, 0.4);
}
.repair-findings-list {
display: flex;
flex-direction: column;
gap: 6px;
}
/* Finding card — expandable two-row layout */
.repair-finding-card {
background: rgba(22, 22, 22, 0.95);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
overflow: hidden;
transition: all 0.2s ease;
}
.repair-finding-card:hover {
border-color: rgba(255, 255, 255, 0.12);
background: rgba(28, 28, 28, 0.98);
}
.repair-finding-card.warning {
border-left: 3px solid rgba(245, 158, 11, 0.5);
}
.repair-finding-card.critical {
border-left: 3px solid rgba(239, 68, 68, 0.5);
}
.repair-finding-card.info {
border-left: 3px solid rgba(59, 130, 246, 0.3);
}
.repair-finding-main {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 14px;
cursor: pointer;
}
.repair-finding-select {
flex-shrink: 0;
}
.repair-finding-select input[type="checkbox"] {
accent-color: var(--accent-color, #6366f1);
}
.repair-finding-content {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.repair-finding-title {
font-size: 13px;
font-weight: 500;
color: #fff;
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
}
.repair-finding-icon {
font-size: 12px;
flex-shrink: 0;
}
.repair-finding-status-badge {
font-size: 9px;
font-weight: 600;
padding: 1px 6px;
border-radius: 8px;
text-transform: uppercase;
}
.repair-finding-status-badge.resolved {
background: rgba(34, 197, 94, 0.12);
color: #22c55e;
}
.repair-finding-status-badge.dismissed {
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.4);
}
.repair-finding-type-badge {
font-size: 10px;
font-weight: 500;
padding: 1px 7px;
border-radius: 8px;
background: rgba(var(--accent-rgb, 99, 102, 241), 0.1);
color: rgb(var(--accent-light-rgb, 129, 140, 248));
}
.repair-finding-desc {
font-size: 12px;
color: rgba(255, 255, 255, 0.45);
line-height: 1.4;
}
.repair-finding-path {
font-size: 11px;
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
color: rgba(255, 255, 255, 0.3);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.repair-finding-meta {
font-size: 10px;
color: rgba(255, 255, 255, 0.25);
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.repair-finding-actions {
display: flex;
gap: 4px;
flex-shrink: 0;
align-items: center;
}
.repair-finding-btn {
background: none;
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 5px;
min-width: 26px;
height: 26px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
transition: all 0.2s ease;
}
.repair-finding-btn.fix {
color: rgb(var(--accent-light-rgb, 129, 140, 248));
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.25);
font-size: 10px;
font-weight: 600;
padding: 0 8px;
letter-spacing: 0.02em;
}
.repair-finding-btn.fix:hover {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.15);
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.4);
}
.repair-finding-btn.fix:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.repair-finding-btn.resolve {
color: #22c55e;
}
.repair-finding-btn.resolve:hover {
background: rgba(34, 197, 94, 0.15);
border-color: rgba(34, 197, 94, 0.3);
}
.repair-finding-btn.dismiss {
color: rgba(255, 255, 255, 0.4);
}
.repair-finding-btn.dismiss:hover {
background: rgba(239, 68, 68, 0.12);
border-color: rgba(239, 68, 68, 0.3);
color: #ef4444;
}
.repair-finding-expand-btn {
background: none;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 5px;
width: 26px;
height: 26px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
transition: all 0.2s ease;
}
.repair-finding-expand-btn:hover {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.6);
}
.repair-finding-expand-btn.open {
transform: rotate(180deg);
}
/* Finding detail panel — expandable */
.repair-finding-detail {
max-height: 0;
overflow: hidden;
transition: max-height 0.25s ease;
}
.repair-finding-detail.open {
max-height: 600px;
overflow-y: auto;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.repair-finding-detail-inner {
padding: 16px 18px 18px;
display: flex;
flex-direction: column;
gap: 12px;
}
/* Detail key-value rows */
.repair-detail-grid {
display: grid;
grid-template-columns: auto 1fr;
gap: 4px 14px;
font-size: 12px;
}
.repair-detail-key {
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
font-weight: 500;
}
.repair-detail-val {
color: rgba(255, 255, 255, 0.75);
word-break: break-all;
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
font-size: 11px;
}
.repair-detail-val.path {
color: rgba(var(--accent-light-rgb, 129, 140, 248), 0.8);
}
.repair-detail-val.highlight {
color: #fbbf24;
}
.repair-detail-val.success {
color: #4ade80;
}
.repair-detail-val.error {
color: #f87171;
}
/* Detail sub-items (for duplicates, missing tracks, etc.) */
.repair-detail-sublist {
display: flex;
flex-direction: column;
gap: 4px;
margin-top: 4px;
}
.repair-detail-subitem {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.04);
border-radius: 6px;
padding: 6px 10px;
font-size: 11px;
color: rgba(255, 255, 255, 0.55);
display: flex;
flex-direction: column;
gap: 2px;
}
.repair-detail-subitem strong {
color: rgba(255, 255, 255, 0.8);
font-weight: 500;
}
.repair-detail-subitem .mono {
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
}
/* Duplicate keep/remove badges */
.repair-detail-subitem.best {
border-color: rgba(34, 197, 94, 0.2);
background: rgba(34, 197, 94, 0.04);
}
.repair-detail-subitem.removable {
opacity: 0.65;
}
.repair-keep-badge {
display: inline-block;
font-size: 9px;
font-weight: 700;
padding: 1px 5px;
border-radius: 3px;
background: rgba(34, 197, 94, 0.15);
color: #22c55e;
margin-right: 4px;
letter-spacing: 0.04em;
}
.repair-remove-badge {
display: inline-block;
font-size: 9px;
font-weight: 700;
padding: 1px 5px;
border-radius: 3px;
background: rgba(239, 68, 68, 0.12);
color: #ef4444;
margin-right: 4px;
letter-spacing: 0.04em;
}
/* Finding media thumbnails (album art + artist image) */
.repair-finding-media {
display: flex;
gap: 18px;
margin-bottom: 14px;
padding: 14px 16px;
background: rgba(255, 255, 255, 0.025);
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.06);
align-items: flex-start;
}
.repair-finding-media-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
min-width: 0;
}
.repair-finding-media-img {
width: 150px;
height: 150px;
border-radius: 10px;
object-fit: cover;
border: 1px solid rgba(255, 255, 255, 0.1);
flex-shrink: 0;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.repair-finding-media-img:hover {
transform: scale(1.03);
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
}
.repair-finding-media-img.artist {
border-radius: 50%;
}
.repair-finding-media-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
text-align: center;
max-width: 150px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 1.3;
font-weight: 500;
}
/* Play button for findings */
.repair-finding-play-btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
background: rgba(var(--accent-rgb, 99, 102, 241), 0.12);
border: 1px solid rgba(var(--accent-rgb, 99, 102, 241), 0.25);
border-radius: 8px;
color: rgb(var(--accent-light-rgb, 129, 140, 248));
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
margin-top: 4px;
}
.repair-finding-play-btn:hover {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.2);
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.4);
transform: translateY(-1px);
}
.repair-finding-play-btn:active {
transform: translateY(0);
}
.repair-finding-play-btn svg {
width: 14px;
height: 14px;
fill: currentColor;
}
/* Artwork preview (for missing cover art) */
.repair-artwork-preview {
margin-top: 8px;
display: flex;
align-items: flex-end;
gap: 10px;
}
.repair-artwork-preview img {
width: 80px;
height: 80px;
border-radius: 6px;
object-fit: cover;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.repair-artwork-label {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
}
/* Completion bar (for incomplete albums) */
.repair-completion-bar {
margin: 8px 0 4px;
}
.repair-completion-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
margin-bottom: 4px;
}
.repair-completion-track {
height: 6px;
background: rgba(255, 255, 255, 0.06);
border-radius: 3px;
overflow: hidden;
}
.repair-completion-fill {
height: 100%;
background: linear-gradient(90deg, #f59e0b, #f97316);
border-radius: 3px;
transition: width 0.3s ease;
}
/* Spectrum bar (for fake lossless) */
.repair-spectrum-bar {
margin-bottom: 10px;
}
.repair-spectrum-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
margin-bottom: 4px;
}
.repair-spectrum-track {
position: relative;
height: 10px;
background: rgba(255, 255, 255, 0.06);
border-radius: 5px;
overflow: visible;
}
.repair-spectrum-detected {
position: absolute;
top: 0;
left: 0;
height: 100%;
background: linear-gradient(90deg, #ef4444, #f97316);
border-radius: 5px;
opacity: 0.7;
}
.repair-spectrum-expected {
position: absolute;
top: -2px;
width: 2px;
height: 14px;
background: #22c55e;
border-radius: 1px;
}
.repair-spectrum-legend {
display: flex;
justify-content: space-between;
margin-top: 4px;
font-size: 10px;
}
.repair-spectrum-legend-detected {
color: #f97316;
}
.repair-spectrum-legend-expected {
color: #22c55e;
}
/* Score bars (for AcoustID) */
.repair-score-bar {
display: flex;
align-items: center;
gap: 8px;
}
.repair-score-bar-track {
flex: 1;
height: 4px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
overflow: hidden;
max-width: 120px;
}
.repair-score-bar-fill {
height: 100%;
border-radius: 2px;
transition: width 0.3s ease;
}
.repair-score-bar-fill.good { background: #4ade80; }
.repair-score-bar-fill.warn { background: #fbbf24; }
.repair-score-bar-fill.bad { background: #f87171; }
/* Pagination */
.repair-findings-pagination {
display: flex;
justify-content: center;
align-items: center;
gap: 4px;
padding: 14px 0 4px;
}
.repair-page-btn {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.5);
padding: 4px 10px;
border-radius: 5px;
cursor: pointer;
font-size: 12px;
transition: all 0.2s ease;
}
.repair-page-btn.active {
background: var(--accent-color, #6366f1);
color: #fff;
border-color: var(--accent-color, #6366f1);
}
.repair-page-btn:hover:not(.active) {
background: rgba(255, 255, 255, 0.12);
color: #fff;
}
.repair-page-info {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
padding: 0 8px;
}
/* ── History Tab ── */
.repair-history-list {
display: flex;
flex-direction: column;
gap: 6px;
}
.repair-history-entry {
padding: 12px 14px;
background: rgba(22, 22, 22, 0.95);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
transition: all 0.2s ease;
}
.repair-history-entry:hover {
border-color: rgba(255, 255, 255, 0.1);
background: rgba(28, 28, 28, 0.98);
}
.repair-history-header {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 8px;
}
.repair-history-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.repair-history-dot.success {
background: #4ade80;
box-shadow: 0 0 6px rgba(74, 222, 128, 0.4);
}
.repair-history-dot.error {
background: #f87171;
box-shadow: 0 0 6px rgba(248, 113, 113, 0.4);
}
.repair-history-dot.running {
background: rgb(var(--accent-rgb, 99, 102, 241));
box-shadow: 0 0 6px rgba(var(--accent-rgb, 99, 102, 241), 0.4);
}
.repair-history-name {
font-size: 13px;
font-weight: 600;
color: #fff;
flex: 1;
}
.repair-history-status {
font-size: 10px;
font-weight: 600;
padding: 2px 8px;
border-radius: 8px;
text-transform: uppercase;
}
.repair-history-status.success {
background: rgba(34, 197, 94, 0.12);
color: #22c55e;
}
.repair-history-status.error {
background: rgba(239, 68, 68, 0.12);
color: #ef4444;
}
.repair-history-status.running {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.12);
color: var(--accent-color, #6366f1);
}
.repair-history-duration {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
}
.repair-history-stats {
display: flex;
gap: 4px;
flex-wrap: wrap;
}
.repair-history-stat {
font-size: 11px;
padding: 2px 8px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.45);
}
.repair-history-stat strong {
color: rgba(255, 255, 255, 0.7);
font-weight: 600;
}
.repair-history-stat.findings {
background: rgba(245, 158, 11, 0.08);
color: rgba(245, 158, 11, 0.7);
}
.repair-history-stat.findings strong {
color: #f59e0b;
}
.repair-history-stat.errors {
background: rgba(239, 68, 68, 0.08);
color: rgba(239, 68, 68, 0.7);
}
.repair-history-stat.errors strong {
color: #ef4444;
}
.repair-history-stat.fixed {
background: rgba(34, 197, 94, 0.08);
color: rgba(34, 197, 94, 0.7);
}
.repair-history-stat.fixed strong {
color: #22c55e;
}
.repair-history-meta {
font-size: 10px;
color: rgba(255, 255, 255, 0.25);
margin-top: 6px;
}
/* ── Responsive ── */
@media (max-width: 768px) {
.repair-modal {
width: 98vw;
max-height: 95vh;
border-radius: 12px;
}
.repair-modal-header {
padding: 14px 16px;
}
.repair-modal-logo {
width: 40px;
height: 40px;
}
.repair-modal-title {
font-size: 16px;
}
.repair-modal-subtitle {
display: none;
}
.repair-tab-content {
padding: 12px 14px;
}
.repair-findings-filters {
flex-wrap: wrap;
}
.repair-job-main {
flex-direction: column;
gap: 10px;
}
.repair-job-actions {
align-self: flex-end;
}
.repair-detail-grid {
grid-template-columns: 1fr;
gap: 2px;
}
.repair-help-modal {
max-width: 95vw;
}
}
/* ── Repair Job Live Progress Panel ── */
@keyframes repair-card-glow {
0%, 100% { box-shadow: 0 0 8px rgba(var(--accent-rgb, 99, 102, 241), 0.08); }
50% { box-shadow: 0 0 16px rgba(var(--accent-rgb, 99, 102, 241), 0.2); }
}
.repair-job-card.running {
animation: repair-card-glow 2s ease-in-out infinite;
}
.repair-job-progress {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease, padding 0.3s ease;
padding: 0 14px;
}
.repair-job-progress.visible {
max-height: 300px;
padding: 8px 14px 12px;
border-top: 1px solid rgba(255, 255, 255, 0.04);
}
.repair-progress-bar-wrap {
width: 100%;
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
overflow: hidden;
margin-bottom: 6px;
}
.repair-progress-bar {
height: 100%;
background: linear-gradient(90deg, rgb(var(--accent-rgb, 99, 102, 241)), rgb(var(--accent-light-rgb, 129, 140, 248)));
transition: width 0.5s ease;
border-radius: 2px;
}
.repair-job-progress.finished .repair-progress-bar {
background: #4ade80;
}
.repair-job-progress.error .repair-progress-bar {
background: #ef4444;
}
.repair-progress-phase {
font-size: 10px;
color: rgba(255, 255, 255, 0.5);
margin-bottom: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.repair-progress-log {
max-height: 200px;
overflow-y: auto;
font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
font-size: 10px;
line-height: 1.5;
}
.repair-progress-log::-webkit-scrollbar {
width: 4px;
}
.repair-progress-log::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.1);
border-radius: 2px;
}
.repair-log-line {
padding: 1px 0;
color: rgba(255, 255, 255, 0.45);
}
.repair-log-line.success {
color: #4ade80;
}
.repair-log-line.error {
color: #f87171;
}
.repair-log-line.skip {
color: rgba(255, 255, 255, 0.25);
}
/* ── Repair Job Help Button & Modal ── */
.repair-help-btn {
background: transparent;
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.35);
width: 26px;
height: 26px;
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: 600;
transition: all 0.2s ease;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
.repair-help-btn:hover {
background: rgba(var(--accent-rgb, 99, 102, 241), 0.15);
color: rgb(var(--accent-light-rgb, 129, 140, 248));
border-color: rgba(var(--accent-rgb, 99, 102, 241), 0.3);
}
.repair-help-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.6);
z-index: 10001;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(4px);
animation: repair-help-fadein 0.15s ease;
}
@keyframes repair-help-fadein {
from { opacity: 0; }
to { opacity: 1; }
}
.repair-help-modal {
background: rgba(18, 18, 18, 0.98);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
width: 90vw;
max-width: 480px;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);
animation: repair-help-slidein 0.2s ease;
}
@keyframes repair-help-slidein {
from { transform: translateY(12px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
.repair-help-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 24px 12px;
}
.repair-help-header h3 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: #fff;
}
.repair-help-close {
background: none;
border: none;
color: rgba(255, 255, 255, 0.4);
font-size: 22px;
cursor: pointer;
padding: 4px 8px;
border-radius: 6px;
transition: all 0.2s ease;
}
.repair-help-close:hover {
color: #fff;
background: rgba(255, 255, 255, 0.1);
}
.repair-help-badges {
display: flex;
gap: 6px;
flex-wrap: wrap;
padding: 0 24px 16px;
}
.repair-help-body {
padding: 0 24px 20px;
color: rgba(255, 255, 255, 0.65);
font-size: 13px;
line-height: 1.7;
}
.repair-help-body p {
margin: 0 0 12px;
}
.repair-help-body p:last-child {
margin-bottom: 0;
}
.repair-help-setting-list {
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 8px;
padding: 10px 14px;
margin-top: 4px;
}
.repair-help-setting-item {
font-size: 12px;
color: rgba(255, 255, 255, 0.55);
padding: 3px 0;
line-height: 1.5;
}
.repair-help-setting-item::before {
content: '\2022';
color: rgb(var(--accent-light-rgb, 129, 140, 248));
margin-right: 8px;
}
.repair-help-settings-section {
padding: 0 24px 20px;
}
.repair-help-section-title {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.35);
margin-bottom: 8px;
}
.repair-help-setting {
display: flex;
justify-content: space-between;
padding: 5px 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.repair-help-setting:last-child {
border-bottom: none;
}
.repair-help-setting-key {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
}
.repair-help-setting-val {
font-size: 12px;
color: #fff;
font-weight: 500;
}
/* =====================================================
SETTINGS PAGE — Modern Tabbed Redesign (stg- prefix)
===================================================== */
/* Tab bar */
.stg-tabbar {
display: flex;
gap: 4px;
padding: 4px;
background: rgba(255, 255, 255, 0.04);
border-radius: 12px;
margin-bottom: 24px;
overflow-x: auto;
scrollbar-width: none;
width: fit-content;
}
.stg-tabbar::-webkit-scrollbar { display: none; }
.stg-tab {
padding: 9px 20px;
border-radius: 9px;
border: none;
background: transparent;
color: rgba(255, 255, 255, 0.45);
font-size: 0.85em;
font-weight: 500;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
white-space: nowrap;
font-family: inherit;
}
.stg-tab:hover {
color: rgba(255, 255, 255, 0.85);
background: rgba(255, 255, 255, 0.06);
transform: translateY(-1px);
}
.stg-tab:active {
transform: scale(0.97);
}
.stg-tab.active {
background: var(--accent-color, #1db954);
color: #fff;
font-weight: 600;
box-shadow: 0 2px 12px rgba(var(--accent-rgb, 29, 185, 84), 0.3);
}
/* Body — single centered column */
.stg-body {
max-width: 820px;
width: 100%;
}
/* Panel visibility */
.stg-panel { display: none; }
.stg-panel.active { display: block; }
/* Section header — clean divider */
.stg-section-title {
font-size: 0.72em;
font-weight: 600;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.35);
padding: 20px 0 8px;
margin: 0;
border: none;
}
.stg-section-title:first-child { padding-top: 0; }
/* Setting row — label left, control right */
.stg-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 13px 16px;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
min-height: 48px;
}
.stg-row:last-child { border-bottom: none; }
.stg-row-info {
flex: 1;
min-width: 0;
}
.stg-row-label {
font-size: 0.9em;
color: rgba(255, 255, 255, 0.88);
font-weight: 400;
line-height: 1.3;
}
.stg-row-desc {
font-size: 0.78em;
color: rgba(255, 255, 255, 0.35);
margin-top: 2px;
line-height: 1.4;
}
.stg-row-control {
flex-shrink: 0;
display: flex;
align-items: center;
gap: 8px;
}
.stg-row-control input[type="text"],
.stg-row-control input[type="password"],
.stg-row-control input[type="number"],
.stg-row-control input[type="url"] {
width: 280px;
max-width: 100%;
padding: 8px 12px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
color: #fff;
font-size: 0.88em;
font-family: inherit;
transition: border-color 0.2s;
}
.stg-row-control input:focus {
border-color: var(--accent-color, #1db954);
outline: none;
}
.stg-row-control select {
padding: 8px 12px;
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
color: #fff;
font-size: 0.88em;
font-family: inherit;
cursor: pointer;
min-width: 160px;
}
.stg-row-control select:focus {
border-color: var(--accent-color, #1db954);
outline: none;
}
/* Service accordion (API services, expandable sections) */
.stg-service {
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
}
.stg-service:last-child { border-bottom: none; }
.stg-service-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 16px;
cursor: pointer;
transition: background 0.2s, padding-left 0.2s;
user-select: none;
}
.stg-service-header:hover {
background: rgba(255, 255, 255, 0.04);
padding-left: 20px;
}
.stg-service-name {
font-size: 0.9em;
color: rgba(255, 255, 255, 0.88);
font-weight: 500;
}
.stg-service-chevron {
color: rgba(255, 255, 255, 0.25);
transition: transform 0.2s;
font-size: 0.8em;
}
.stg-service.expanded .stg-service-chevron {
transform: rotate(90deg);
color: var(--accent-color, #1db954);
}
.stg-service.expanded .stg-service-name {
color: #fff;
}
.stg-service-body {
display: none;
padding: 0 16px 16px;
}
.stg-service.expanded .stg-service-body {
display: block;
animation: stgSlideIn 0.25s ease-out;
}
@keyframes stgSlideIn {
from { opacity: 0; transform: translateY(-6px); }
to { opacity: 1; transform: translateY(0); }
}
/* Card container — subtle grouping for related settings */
.stg-card {
background: rgba(255, 255, 255, 0.025);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
margin-bottom: 16px;
overflow: hidden;
transition: border-color 0.25s, box-shadow 0.25s;
}
.stg-card:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 2px 16px rgba(0, 0, 0, 0.15);
}
/* Action buttons in settings */
.stg-actions {
display: flex;
gap: 8px;
padding: 8px 16px 14px;
}
.stg-btn {
padding: 8px 16px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.75);
font-size: 0.82em;
font-family: inherit;
cursor: pointer;
transition: all 0.2s;
}
.stg-btn:hover {
background: rgba(255, 255, 255, 0.08);
color: #fff;
transform: translateY(-1px);
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2);
}
.stg-btn:active {
transform: scale(0.97);
box-shadow: none;
}
.stg-btn-primary {
background: var(--accent-color, #1db954);
border-color: var(--accent-color, #1db954);
color: #fff;
font-weight: 500;
}
.stg-btn-primary:hover {
filter: brightness(1.15);
}
/* Toggle switch (replaces checkbox for booleans) */
.stg-toggle {
position: relative;
width: 40px;
height: 22px;
flex-shrink: 0;
}
.stg-toggle input {
opacity: 0;
width: 0;
height: 0;
position: absolute;
}
.stg-toggle-track {
position: absolute;
inset: 0;
background: rgba(255, 255, 255, 0.12);
border-radius: 11px;
cursor: pointer;
transition: background 0.25s;
}
.stg-toggle-track::after {
content: '';
position: absolute;
left: 2px;
top: 2px;
width: 18px;
height: 18px;
background: #fff;
border-radius: 50%;
transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
}
.stg-toggle input:checked + .stg-toggle-track {
background: var(--accent-color, #1db954);
}
.stg-toggle input:checked + .stg-toggle-track::after {
transform: translateX(18px);
}
/* ── Settings page layout override — transform old layout ── */
/* Center everything in a single column */
#settings-page .settings-content {
flex-direction: column;
align-items: center;
max-width: 100% !important;
margin: 0 auto;
}
/* Tab bar centered */
#settings-page .stg-tabbar {
margin: 0 auto 28px;
}
/* Columns become single centered column */
#settings-page .settings-columns {
flex-direction: column;
max-width: 760px;
width: 100%;
gap: 0;
margin: 0 auto;
margin-bottom: 0;
}
#settings-page .settings-left-column,
#settings-page .settings-right-column,
#settings-page .settings-third-column {
min-width: unset;
width: 100%;
gap: 0;
}
/* Kill glassmorphic cards — flat, no bg, no borders, no shadows */
#settings-page .settings-group {
background: none !important;
border: none !important;
border-radius: 0 !important;
box-shadow: none !important;
padding: 0 !important;
margin-bottom: 0;
position: relative;
overflow: visible;
}
/* Kill the accent gradient bar at top of cards */
#settings-page .settings-group::before {
display: none !important;
}
/* Kill hover effects on cards */
#settings-page .settings-group:hover {
border-color: transparent !important;
box-shadow: none !important;
}
/* Section titles — clean, readable, accent bar on hover */
#settings-page .settings-group > h3 {
font-size: 0.82em;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.45);
padding: 32px 0 12px;
padding-left: 14px;
padding-right: 0;
margin: 0;
border: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
border-left: 2px solid rgba(var(--accent-rgb), 0.2);
position: relative;
transition: color 0.25s, border-color 0.3s;
}
/* Kill the accent underline on h3 */
#settings-page .settings-group > h3::after {
display: none !important;
}
#settings-page .settings-group:first-child > h3 { padding-top: 4px; }
/* Active section — accent bar + brighter title when interacting */
#settings-page .settings-group:hover > h3,
#settings-page .settings-group:focus-within > h3 {
border-left-color: rgb(var(--accent-rgb));
color: rgba(255, 255, 255, 0.8);
}
/* ── Form rows — label left, control right, help text wraps below ── */
#settings-page .form-group {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 8px 20px;
padding: 14px 8px !important;
margin: 0 !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.035);
border-radius: 8px;
transition: background 0.2s;
}
#settings-page .form-group:hover {
background: rgba(255, 255, 255, 0.02);
}
#settings-page .form-group:last-child { border-bottom: none; }
#settings-page .form-group > label {
font-size: 0.9em;
color: rgba(255, 255, 255, 0.8);
font-weight: 400;
white-space: nowrap;
margin: 0;
flex-shrink: 0;
}
#settings-page .form-group > input[type="text"],
#settings-page .form-group > input[type="password"],
#settings-page .form-group > input[type="number"],
#settings-page .form-group > input[type="url"] {
flex: 1;
max-width: 340px;
padding: 9px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
color: rgba(255, 255, 255, 0.9);
font-size: 0.88em;
font-family: inherit;
margin: 0;
transition: border-color 0.25s, background 0.25s, box-shadow 0.25s;
}
#settings-page .form-group > input:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.1);
}
#settings-page .form-group > input:focus {
border-color: rgba(var(--accent-rgb), 0.4);
background: rgba(255, 255, 255, 0.06);
outline: none;
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.1);
}
#settings-page .form-group > select,
#settings-page select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 9px 36px 9px 14px;
background: rgba(255, 255, 255, 0.04);
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='rgba(255,255,255,0.35)' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 12px center;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
color: rgba(255, 255, 255, 0.85);
font-size: 0.88em;
font-family: inherit;
cursor: pointer;
min-width: 180px;
margin: 0;
transition: border-color 0.25s, background-color 0.25s, box-shadow 0.25s;
}
#settings-page select:hover {
background-color: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.1);
}
#settings-page select:focus {
border-color: rgba(var(--accent-rgb), 0.4);
outline: none;
background-color: rgba(255, 255, 255, 0.06);
box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.1);
}
#settings-page select option {
background: #1a1a1e;
color: #fff;
padding: 8px;
}
/* ── API service frames — subtle grouped cards ── */
#settings-page .api-service-frame {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
margin: 6px 0;
padding: 0 !important;
overflow: hidden;
transition: border-color 0.25s, box-shadow 0.25s, transform 0.25s;
}
#settings-page .api-service-frame:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
transform: translateY(-1px);
}
#settings-page .api-service-frame:focus-within {
border-color: rgba(var(--accent-rgb, 29, 185, 84), 0.3);
box-shadow: 0 0 0 1px rgba(var(--accent-rgb, 29, 185, 84), 0.1), 0 4px 20px rgba(0, 0, 0, 0.15);
}
#settings-page .api-service-frame .service-title {
padding: 14px 18px !important;
margin: 0 !important;
font-size: 0.9em !important;
font-weight: 500;
color: rgba(255, 255, 255, 0.85);
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
letter-spacing: 0.02em;
}
#settings-page .api-service-frame .form-group {
padding: 10px 18px !important;
}
#settings-page .api-service-frame .callback-info {
padding: 2px 18px 12px;
}
#settings-page .api-service-frame .form-actions {
padding: 4px 18px 14px;
display: flex;
gap: 8px;
}
/* Callback / hint text */
#settings-page .callback-info .callback-help,
#settings-page .callback-info .callback-label,
#settings-page .settings-hint,
#settings-page .setting-help-text {
font-size: 0.8em;
color: rgba(255, 255, 255, 0.35);
line-height: 1.6;
letter-spacing: 0.01em;
}
#settings-page .callback-info .callback-url {
font-size: 0.82em;
color: rgba(255, 255, 255, 0.5);
font-family: monospace;
}
/* ── Server toggles — pill buttons ── */
#settings-page .server-toggle-container {
padding: 12px 0;
display: flex;
gap: 8px;
}
#settings-page .server-toggle-btn {
border-radius: 10px;
padding: 10px 20px;
font-size: 0.85em;
font-weight: 500;
border: 1px solid rgba(255, 255, 255, 0.08);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
#settings-page .server-toggle-btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
border-color: rgba(var(--accent-rgb), 0.25);
}
#settings-page .server-toggle-btn:active {
transform: translateY(0);
}
#settings-page .server-config-container {
padding: 0;
}
/* ── Buttons — unified flat style ── */
#settings-page .test-button,
#settings-page .detect-button,
#settings-page .auth-button {
padding: 9px 18px;
min-width: fit-content;
border-radius: 10px;
font-size: 0.84em;
font-weight: 600;
font-family: inherit;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.06) 0%, rgba(255, 255, 255, 0.02) 100%);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.7);
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
letter-spacing: 0.01em;
}
#settings-page .test-button::before,
#settings-page .detect-button::before,
#settings-page .auth-button::before {
content: '';
position: absolute;
inset: 0;
border-radius: 10px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.2) 0%, rgba(var(--accent-rgb), 0.05) 100%);
opacity: 0;
transition: opacity 0.3s;
}
#settings-page .test-button:hover::before,
#settings-page .detect-button:hover::before,
#settings-page .auth-button:hover::before {
opacity: 1;
}
#settings-page .test-button:hover,
#settings-page .detect-button:hover,
#settings-page .auth-button:hover {
color: #fff;
border-color: rgba(var(--accent-rgb), 0.35);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.15);
}
#settings-page .test-button:active,
#settings-page .detect-button:active,
#settings-page .auth-button:active {
transform: translateY(0);
box-shadow: none;
}
/* Test buttons row */
#settings-page .api-test-buttons {
padding: 16px 0;
gap: 8px;
display: flex;
flex-wrap: wrap;
}
/* ── Quality section ── */
#settings-page .quality-tier {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
margin-bottom: 10px;
transition: border-color 0.2s;
}
#settings-page .quality-tier:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.12);
}
#settings-page .preset-button {
border-radius: 8px;
font-size: 0.84em;
padding: 8px 18px;
}
#settings-page .quality-presets {
padding: 8px 0 16px;
}
/* ── Checkbox labels — full-width rows ── */
#settings-page .checkbox-label {
padding: 13px 8px !important;
display: flex !important;
align-items: center;
gap: 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.035);
border-radius: 8px;
margin: 0 !important;
cursor: pointer;
font-size: 0.9em;
color: rgba(255, 255, 255, 0.8);
transition: background 0.2s, color 0.2s;
}
#settings-page .checkbox-label:hover {
background: rgba(255, 255, 255, 0.02);
color: #fff;
}
#settings-page .checkbox-label:last-child { border-bottom: none; }
/* ── Tag service groups ── */
#settings-page .tag-service-group {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
margin-bottom: 6px;
overflow: hidden;
transition: border-color 0.2s;
}
#settings-page .tag-service-group:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.12);
}
#settings-page .tag-service-header {
padding: 12px 18px;
}
#settings-page .tag-service-body {
padding: 0 18px 12px;
}
/* ── Save button — centered, sticky feel ── */
#settings-page .settings-actions {
max-width: 760px;
width: 100%;
margin: 0 auto;
padding: 24px 0 16px;
}
#settings-page .settings-actions .save-button {
width: 100%;
padding: 12px;
border-radius: 10px;
font-size: 0.92em;
font-weight: 600;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
#settings-page .settings-actions .save-button:hover {
transform: translateY(-1px);
box-shadow: 0 4px 20px rgba(var(--accent-rgb, 29, 185, 84), 0.35);
}
#settings-page .settings-actions .save-button:active {
transform: scale(0.99);
box-shadow: 0 2px 8px rgba(var(--accent-rgb, 29, 185, 84), 0.2);
}
/* ── Path input groups (dir paths with Unlock buttons) ── */
#settings-page .path-input-group {
flex: 1;
max-width: 340px;
display: flex;
gap: 6px;
align-items: center;
}
#settings-page .path-input-group input {
flex: 1;
padding: 9px 14px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 8px;
color: #fff;
font-size: 0.88em;
font-family: inherit;
}
#settings-page .browse-button {
padding: 8px 14px;
border-radius: 8px;
font-size: 0.82em;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.6);
transform: none;
}
#settings-page .browse-button:hover {
transform: none;
box-shadow: none;
}
/* ── Form groups with hint text — wrap to next line under the row ── */
#settings-page .form-group:has(> small.settings-hint) {
flex-wrap: wrap;
}
#settings-page .form-group > small.settings-hint,
#settings-page .form-group > .settings-hint {
flex-basis: 100%;
font-size: 0.78em;
color: rgba(255, 255, 255, 0.25);
margin-top: -2px;
padding-bottom: 2px;
line-height: 1.4;
}
/* ── Template path inputs — full width since labels are long ── */
#settings-page .form-group > input[type="text"][id^="template-"] {
flex: 1;
max-width: 420px;
}
/* ── Setting help text — always wraps to its own line ── */
#settings-page .setting-help-text {
width: 100%;
flex-basis: 100%;
display: block;
padding: 2px 0 4px;
font-size: 0.8em;
color: rgba(255, 255, 255, 0.25);
line-height: 1.5;
margin: 0;
}
/* Standalone help text (not inside a form-group) — add separator */
#settings-page .settings-group > .setting-help-text {
padding: 6px 0 14px;
border-bottom: 1px solid rgba(255, 255, 255, 0.035);
}
/* Inline status spans — keep inline */
#settings-page span.setting-help-text {
display: inline;
width: auto;
flex-basis: auto;
padding: 0;
}
/* ── Download source containers ── */
#settings-page #soulseek-settings-container,
#settings-page #tidal-download-settings-container,
#settings-page #qobuz-settings-container,
#settings-page #hifi-download-settings-container,
#settings-page #deezer-download-settings-container,
#settings-page #youtube-settings-container,
#settings-page #hybrid-settings-container {
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(255, 255, 255, 0.05);
border-radius: 12px;
padding: 4px 18px;
margin: 8px 0;
transition: border-color 0.25s, box-shadow 0.25s;
}
#settings-page #soulseek-settings-container:hover,
#settings-page #tidal-download-settings-container:hover,
#settings-page #qobuz-settings-container:hover,
#settings-page #hifi-download-settings-container:hover,
#settings-page #deezer-download-settings-container:hover,
#settings-page #youtube-settings-container:hover,
#settings-page #hybrid-settings-container:hover {
border-color: rgba(255, 255, 255, 0.1);
box-shadow: 0 2px 16px rgba(0, 0, 0, 0.12);
}
/* ── Path inputs with lock buttons ── */
#settings-page .form-group .path-input-wrapper {
flex: 1;
max-width: 340px;
}
/* ── Hybrid source priority list (drag and drop) ── */
.hybrid-source-list {
display: flex;
flex-direction: column;
gap: 4px;
padding: 8px 0;
}
.hybrid-source-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
transition: all 0.2s;
user-select: none;
}
.hybrid-source-item:hover {
border-color: rgba(255, 255, 255, 0.12);
background: rgba(255, 255, 255, 0.05);
transform: translateX(2px);
}
.hybrid-source-item.disabled {
opacity: 0.35;
}
.hybrid-source-item.disabled:hover {
transform: none;
}
.hybrid-source-arrows {
display: flex;
flex-direction: column;
gap: 1px;
flex-shrink: 0;
}
.hybrid-arrow-btn {
background: none;
border: none;
color: rgba(255, 255, 255, 0.25);
font-size: 0.6em;
cursor: pointer;
padding: 1px 4px;
line-height: 1;
border-radius: 3px;
transition: all 0.15s;
}
.hybrid-arrow-btn:hover {
color: var(--accent-color, #1db954);
background: rgba(255, 255, 255, 0.06);
}
.hybrid-source-icon {
width: 22px;
height: 22px;
flex-shrink: 0;
border-radius: 4px;
object-fit: contain;
}
.hybrid-source-icon.emoji-icon {
font-size: 1.2em;
width: 22px;
height: 22px;
display: flex;
align-items: center;
justify-content: center;
}
.hybrid-source-name {
flex: 1;
font-size: 0.9em;
color: rgba(255, 255, 255, 0.85);
font-weight: 500;
}
.hybrid-source-priority {
font-size: 0.75em;
color: rgba(255, 255, 255, 0.3);
font-weight: 600;
min-width: 18px;
text-align: center;
}
.hybrid-source-toggle {
position: relative;
width: 36px;
height: 20px;
flex-shrink: 0;
}
.hybrid-source-toggle input {
opacity: 0;
width: 0;
height: 0;
position: absolute;
}
.hybrid-source-toggle .toggle-track {
position: absolute;
inset: 0;
background: rgba(255, 255, 255, 0.12);
border-radius: 10px;
cursor: pointer;
transition: background 0.25s;
}
.hybrid-source-toggle .toggle-track::after {
content: '';
position: absolute;
left: 2px;
top: 2px;
width: 16px;
height: 16px;
background: #fff;
border-radius: 50%;
transition: transform 0.25s;
}
.hybrid-source-toggle input:checked + .toggle-track {
background: var(--accent-color, #1db954);
}
.hybrid-source-toggle input:checked + .toggle-track::after {
transform: translateX(16px);
}
/* ── Accent color picker ── */
#settings-page .accent-color-selector {
display: flex;
align-items: center;
gap: 10px;
}
/* ── Responsive ── */
@media (max-width: 768px) {
/* Tab bar scrolls horizontally */
#settings-page .stg-tabbar {
width: 100%;
border-radius: 0;
margin-bottom: 16px;
justify-content: flex-start;
}
.stg-tab { padding: 8px 14px; font-size: 0.8em; }
/* Content fills screen */
#settings-page .settings-columns { max-width: 100% !important; padding: 0 8px; }
/* Form rows stack vertically */
#settings-page .form-group {
flex-direction: column !important;
align-items: flex-start !important;
gap: 8px !important;
padding: 12px 0 !important;
}
#settings-page .form-group > input[type="text"],
#settings-page .form-group > input[type="password"],
#settings-page .form-group > input[type="number"],
#settings-page .form-group > input[type="url"],
#settings-page .form-group > select { max-width: 100% !important; width: 100% !important; }
/* Path input groups full width */
#settings-page .path-input-group { max-width: 100%; width: 100%; }
/* Source containers */
#settings-page [id$="-settings-container"],
#settings-page [id$="-download-settings-container"] { padding: 4px 12px !important; }
/* API service frames */
#settings-page .api-service-frame .form-group { padding: 8px 12px !important; }
#settings-page .api-service-frame .callback-info { padding: 2px 12px 10px; }
#settings-page .api-service-frame .form-actions { padding: 4px 12px 12px; }
/* Save button */
#settings-page .settings-actions { padding: 16px 8px; }
#settings-page .settings-actions .save-button { width: 100%; }
/* Section titles */
#settings-page .settings-group > h3 { padding: 24px 0 10px; }
}
/* ==================================================================================
PLAYLIST EXPLORER — Visual Discovery Tree
================================================================================== */
.explorer-container {
padding: 24px 32px;
display: flex;
flex-direction: column;
min-height: 100%;
}
/* Playlist card picker */
.explorer-playlist-picker {
margin-bottom: 16px;
}
.explorer-picker-top {
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
margin-bottom: 10px;
flex-wrap: wrap;
}
.explorer-picker-tabs {
display: flex;
gap: 4px;
margin-bottom: 10px;
}
.explorer-picker-tab {
padding: 6px 14px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
background: none;
border: 1px solid transparent;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s;
display: flex;
align-items: center;
gap: 6px;
}
.explorer-picker-tab:hover {
color: rgba(255, 255, 255, 0.65);
background: rgba(255, 255, 255, 0.04);
}
.explorer-picker-tab.active {
color: #fff;
background: rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.25);
}
.explorer-picker-tab-count {
font-size: 10px;
font-weight: 700;
color: rgba(255, 255, 255, 0.3);
background: rgba(255, 255, 255, 0.06);
padding: 1px 6px;
border-radius: 10px;
min-width: 18px;
text-align: center;
}
.explorer-picker-tab.active .explorer-picker-tab-count {
color: rgba(var(--accent-rgb), 0.9);
background: rgba(var(--accent-rgb), 0.15);
}
.explorer-picker-scroll {
display: flex;
gap: 10px;
overflow-x: auto;
padding: 4px 2px 8px;
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
}
.explorer-picker-scroll::-webkit-scrollbar {
height: 4px;
}
.explorer-picker-scroll::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
.explorer-picker-card {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 14px 8px 8px;
min-width: 200px;
max-width: 260px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
flex-shrink: 0;
}
.explorer-picker-card:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.12);
transform: translateY(-2px) scale(1.02);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
}
.explorer-picker-card.active {
border-color: rgba(var(--accent-rgb), 0.5);
background: rgba(var(--accent-rgb), 0.08);
box-shadow: 0 0 0 1px rgba(var(--accent-rgb), 0.2), 0 4px 16px rgba(var(--accent-rgb), 0.1);
}
.explorer-picker-card-art {
width: 44px;
height: 44px;
border-radius: 8px;
overflow: hidden;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.04);
}
.explorer-picker-card-art img {
width: 100%;
height: 100%;
object-fit: cover;
}
.explorer-picker-card-art-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.15);
font-size: 18px;
}
.explorer-picker-card-info {
min-width: 0;
flex: 1;
}
.explorer-picker-card-name {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.explorer-picker-card-meta {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
margin-top: 2px;
}
.explorer-picker-card.not-ready {
opacity: 0.5;
border-style: dashed;
}
.explorer-picker-card.not-ready:hover {
opacity: 0.7;
border-color: rgba(245, 166, 35, 0.3);
}
.explorer-picker-not-ready {
color: rgba(245, 166, 35, 0.8);
}
.explorer-picker-card-lock {
position: absolute;
top: 6px;
right: 8px;
font-size: 12px;
opacity: 0.5;
}
.explorer-picker-card {
position: relative;
}
.explorer-picker-empty {
font-size: 13px;
color: rgba(255, 255, 255, 0.3);
padding: 16px 0;
}
.explorer-controls {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
/* Mode toggle — segmented control */
.explorer-mode-toggle {
display: flex;
background: rgba(255, 255, 255, 0.03);
border-radius: 10px;
overflow: hidden;
position: relative;
}
.explorer-mode-btn {
padding: 10px 18px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
background: none;
border: none;
cursor: pointer;
transition: all 0.25s;
position: relative;
z-index: 1;
letter-spacing: 0.2px;
}
.explorer-mode-btn.active {
color: #fff;
background: rgba(var(--accent-rgb), 0.25);
border-radius: 8px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
}
.explorer-mode-btn:hover:not(.active) {
color: rgba(255, 255, 255, 0.65);
}
/* Explore button — primary CTA */
.explorer-build-btn {
padding: 10px 24px;
font-size: 13px;
font-weight: 700;
color: #fff;
background: var(--accent);
border: none;
border-radius: 10px;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
letter-spacing: 0.3px;
position: relative;
overflow: hidden;
}
.explorer-build-btn::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, transparent 50%);
border-radius: inherit;
}
.explorer-build-btn:hover:not(:disabled) {
transform: translateY(-1px);
box-shadow: 0 6px 24px rgba(var(--accent-rgb), 0.35);
filter: brightness(1.1);
}
.explorer-build-btn:active:not(:disabled) {
transform: translateY(0);
filter: brightness(0.95);
}
.explorer-build-btn:disabled {
opacity: 0.5;
cursor: default;
filter: saturate(0.5);
}
/* Action bar — sticky at top */
.explorer-action-bar {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 8px;
padding: 12px 20px;
background: rgba(18, 18, 22, 0.9);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
margin-bottom: 16px;
backdrop-filter: blur(12px);
position: sticky;
top: 0;
z-index: 20;
animation: explorer-action-bar-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) both;
}
@keyframes explorer-action-bar-in {
from { opacity: 0; transform: translateY(-12px); }
to { opacity: 1; transform: none; }
}
.explorer-nav-hint {
font-size: 10px;
color: rgba(255, 255, 255, 0.2);
width: 100%;
text-align: center;
margin-top: 2px;
}
.explorer-selection-count {
font-size: 13px;
color: rgba(255, 255, 255, 0.6);
font-weight: 500;
}
.explorer-action-buttons {
display: flex;
gap: 8px;
}
.explorer-action-btn {
padding: 7px 16px;
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.55);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.07);
border-radius: 8px;
cursor: pointer;
transition: all 0.2s;
letter-spacing: 0.2px;
}
.explorer-action-btn:hover {
background: rgba(255, 255, 255, 0.1);
color: #fff;
border-color: rgba(255, 255, 255, 0.15);
}
.explorer-action-btn.primary {
background: var(--accent);
border-color: transparent;
color: #fff;
font-weight: 700;
padding: 8px 22px;
font-size: 12px;
position: relative;
overflow: hidden;
}
.explorer-action-btn.primary::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, transparent 50%);
border-radius: inherit;
}
.explorer-action-btn.primary:hover {
box-shadow: 0 4px 18px rgba(var(--accent-rgb), 0.4);
filter: brightness(1.1);
transform: translateY(-1px);
}
/* Viewport */
.explorer-viewport {
position: relative;
flex: 1;
overflow: auto;
min-height: 400px;
cursor: default;
/* Enable smooth scrolling for pan operations */
}
.explorer-svg {
position: absolute;
top: 0;
left: 0;
pointer-events: none;
z-index: 0;
overflow: visible;
}
.explorer-tree {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
padding-bottom: 60px;
transform-origin: top center;
/* No transition — zoom must be instant so SVG coordinates are correct */
}
/* Empty state */
.explorer-empty {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 80px 20px;
text-align: center;
}
.explorer-empty-icon {
width: 80px;
height: 80px;
color: rgba(255, 255, 255, 0.12);
margin-bottom: 20px;
}
.explorer-empty-icon svg {
width: 100%;
height: 100%;
}
.explorer-empty-icon svg circle,
.explorer-empty-icon svg line {
stroke-dasharray: 200;
stroke-dashoffset: 200;
animation: explorer-empty-draw 2s ease forwards;
}
.explorer-empty-icon svg circle:nth-child(1) { animation-delay: 0s; }
.explorer-empty-icon svg line:nth-child(2) { animation-delay: 0.2s; }
.explorer-empty-icon svg line:nth-child(3) { animation-delay: 0.4s; }
.explorer-empty-icon svg line:nth-child(4) { animation-delay: 0.4s; }
.explorer-empty-icon svg circle:nth-child(5) { animation-delay: 0.7s; }
.explorer-empty-icon svg circle:nth-child(6) { animation-delay: 0.7s; }
.explorer-empty-icon svg circle:nth-child(7) { animation-delay: 0.7s; }
.explorer-empty-icon svg line:nth-child(8) { animation-delay: 0.5s; }
@keyframes explorer-empty-draw {
to { stroke-dashoffset: 0; }
}
.explorer-empty-title {
font-size: 18px;
font-weight: 600;
color: rgba(255, 255, 255, 0.4);
margin: 0 0 8px;
}
.explorer-empty-desc {
font-size: 13px;
color: rgba(255, 255, 255, 0.25);
margin: 0;
max-width: 400px;
}
/* Progress bar */
.explorer-progress {
display: flex;
align-items: center;
gap: 14px;
padding: 10px 0;
}
.explorer-progress-bar {
flex: 1;
height: 4px;
background: rgba(255, 255, 255, 0.06);
border-radius: 4px;
overflow: hidden;
}
.explorer-progress-fill {
height: 100%;
width: 0;
background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.6), var(--accent));
border-radius: 4px;
transition: width 0.4s ease;
position: relative;
overflow: hidden;
}
.explorer-progress-fill::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.25), transparent);
animation: explorer-shimmer 1.5s ease-in-out infinite;
}
@keyframes explorer-shimmer {
to { left: 100%; }
}
.explorer-progress-text {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
white-space: nowrap;
}
/* ── Node Graph Tree ── */
/* Zoom controls */
.explorer-zoom-controls {
position: sticky;
top: 12px;
float: right;
display: flex;
flex-direction: column;
gap: 4px;
z-index: 50;
margin-right: 8px;
}
.explorer-zoom-btn {
width: 32px;
height: 32px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.1);
background: rgba(18, 18, 22, 0.85);
backdrop-filter: blur(8px);
color: rgba(255, 255, 255, 0.7);
font-size: 16px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
}
.explorer-zoom-btn:hover {
background: rgba(var(--accent-rgb), 0.2);
border-color: rgba(var(--accent-rgb), 0.3);
color: #fff;
}
/* Tiers: horizontal rows of nodes — z-index: 1 so they paint above the SVG (z-index: 0) */
.explorer-tier {
display: flex;
justify-content: center;
flex-wrap: nowrap;
gap: 20px;
padding: 10px 0;
position: relative;
z-index: 1;
}
.explorer-tier-root {
margin-bottom: 8px;
}
.explorer-tier-artists {
gap: 24px;
margin-bottom: 4px;
}
.explorer-artist-tiers {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
z-index: 1;
}
/* Branch: wraps a node + its children below */
.explorer-branch {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
z-index: 1;
animation: explorer-node-enter 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
animation-delay: var(--enter-delay, 0s);
}
/* Children container (albums under artist, tracks under album) */
.explorer-children {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 14px;
padding-top: 20px;
position: relative;
z-index: 1;
}
.explorer-children:empty {
display: none;
}
/* ── Base Node ── */
.explorer-node {
position: relative;
border-radius: 50%;
overflow: hidden;
cursor: pointer;
transition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
border: 2px solid rgba(255, 255, 255, 0.08);
}
.explorer-node:hover {
transform: scale(1.08);
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5), 0 0 20px rgba(var(--accent-rgb), 0.15);
border-color: rgba(var(--accent-rgb), 0.3);
z-index: 10;
}
/* Ripple ring on artist hover */
.explorer-node-artist::after {
content: '';
position: absolute;
inset: -6px;
border-radius: 50%;
border: 1.5px solid rgba(var(--accent-rgb), 0);
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
pointer-events: none;
}
.explorer-node-artist:hover::after {
inset: -10px;
border-color: rgba(var(--accent-rgb), 0.2);
}
.explorer-node.expanded {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.15), 0 8px 32px rgba(0, 0, 0, 0.4);
}
.explorer-node-img {
width: 100%;
height: 100%;
object-fit: cover;
position: absolute;
top: 0;
left: 0;
}
.explorer-node-img-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: rgba(var(--accent-rgb), 0.1);
color: rgba(255, 255, 255, 0.2);
font-size: 32px;
position: absolute;
top: 0;
left: 0;
}
/* Label overlay at bottom of node */
.explorer-node-label {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 10px 10px 8px;
background: linear-gradient(to top, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.5) 60%, transparent 100%);
text-align: center;
z-index: 2;
}
.explorer-node-label-sub {
font-size: 8px;
font-weight: 800;
letter-spacing: 2px;
color: rgba(var(--accent-rgb), 0.9);
text-transform: uppercase;
margin-bottom: 2px;
}
.explorer-node-label-main {
font-size: 12px;
font-weight: 700;
color: #fff;
line-height: 1.2;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.explorer-node-label-meta {
font-size: 9px;
color: rgba(255, 255, 255, 0.5);
margin-top: 2px;
}
/* ── Root Node ── */
.explorer-node-root {
width: 160px;
height: 160px;
border-radius: 24px;
border-width: 2px;
border-color: rgba(var(--accent-rgb), 0.3);
}
.explorer-node-root .explorer-node-label {
padding: 14px 12px 12px;
border-radius: 0 0 22px 22px;
}
.explorer-node-root .explorer-node-label-main {
font-size: 14px;
}
.explorer-node-glow {
position: absolute;
inset: -20px;
background: radial-gradient(circle, rgba(var(--accent-rgb), 0.2) 0%, transparent 70%);
z-index: 0;
animation: explorer-glow-pulse 4s ease-in-out infinite;
}
@keyframes explorer-glow-pulse {
0%, 100% { opacity: 0.5; transform: scale(1); }
50% { opacity: 1; transform: scale(1.05); }
}
/* ── Artist Node ── */
.explorer-node-artist {
width: 82px;
height: 82px;
}
.explorer-node-artist .explorer-node-label-main {
font-size: 11px;
}
/* Artist has selected albums indicator */
.explorer-node-artist.has-selection {
border-color: rgba(var(--accent-rgb), 0.5);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.15), 0 4px 16px rgba(var(--accent-rgb), 0.1);
}
.explorer-node-artist.has-selection::after {
inset: -10px;
border-color: rgba(var(--accent-rgb), 0.25);
animation: explorer-selected-breathe 2.5s ease-in-out infinite;
}
.explorer-node-artist.error {
border-color: rgba(255, 71, 87, 0.3);
opacity: 0.5;
cursor: default;
}
/* Expand hint arrow on artist nodes */
.explorer-node-expand-hint {
position: absolute;
bottom: 2px;
left: 50%;
transform: translateX(-50%);
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
z-index: 5;
transition: all 0.2s;
line-height: 1;
}
.explorer-node-artist:hover .explorer-node-expand-hint {
color: var(--accent);
bottom: 0px;
}
.explorer-node-artist.expanded .explorer-node-expand-hint {
transform: translateX(-50%) rotate(180deg);
color: var(--accent);
}
.explorer-node-error-ring {
position: absolute;
inset: -4px;
border-radius: 50%;
border: 2px dashed rgba(255, 71, 87, 0.3);
z-index: 3;
}
/* ── Album Node ── */
.explorer-node-album {
width: 90px;
height: 90px;
border-radius: 16px;
}
.explorer-node-album .explorer-node-label {
padding: 6px 6px 6px;
border-radius: 0 0 14px 14px;
}
.explorer-node-album .explorer-node-label-main {
font-size: 10px;
}
.explorer-node-album .explorer-node-label-meta {
font-size: 8px;
}
.explorer-node-album.selected {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.25), 0 4px 20px rgba(var(--accent-rgb), 0.2);
animation: explorer-selected-breathe 2.5s ease-in-out infinite;
}
@keyframes explorer-selected-breathe {
0%, 100% { box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.2), 0 4px 16px rgba(var(--accent-rgb), 0.1); }
50% { box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.35), 0 4px 24px rgba(var(--accent-rgb), 0.2); }
}
.explorer-node-album.owned {
opacity: 0.45;
}
.explorer-node-album.added {
border-color: rgba(76, 175, 80, 0.6);
box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.2);
}
/* Selection checkmark */
.explorer-node-select {
position: absolute;
top: 6px;
right: 6px;
width: 22px;
height: 22px;
border-radius: 50%;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
border: 2px solid rgba(255, 255, 255, 0.3);
display: flex;
align-items: center;
justify-content: center;
z-index: 5;
opacity: 0;
transition: all 0.2s;
}
.explorer-node-album:hover .explorer-node-select,
.explorer-node-select.active {
opacity: 1;
}
.explorer-node-select.active {
background: var(--accent);
border-color: var(--accent);
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.5);
}
.explorer-node-select svg {
width: 12px;
height: 12px;
color: #fff;
opacity: 0;
}
.explorer-node-select.active svg {
opacity: 1;
}
/* Badge floating on album node */
.explorer-node-badge-float {
position: absolute;
bottom: 50%;
left: 50%;
transform: translateX(-50%);
font-size: 7px;
font-weight: 800;
padding: 2px 6px;
border-radius: 4px;
text-transform: uppercase;
letter-spacing: 0.5px;
z-index: 5;
white-space: nowrap;
}
.explorer-node-badge-float.owned {
background: rgba(76, 175, 80, 0.85);
color: #fff;
}
.explorer-node-badge-float.playlist {
background: rgba(var(--accent-rgb), 0.85);
color: #fff;
top: 6px;
left: 6px;
bottom: auto;
font-size: 10px;
padding: 1px 5px;
}
/* ── Track Node ── */
.explorer-node-track {
width: auto;
height: auto;
border-radius: 10px;
overflow: visible;
padding: 6px 14px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
cursor: default;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.explorer-node-track:hover {
transform: none;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
border-color: rgba(255, 255, 255, 0.1);
}
.explorer-node-track .explorer-node-label {
position: static;
background: none;
padding: 0;
text-align: left;
}
.explorer-node-track .explorer-node-label-main {
font-size: 11px;
font-weight: 500;
white-space: nowrap;
}
.explorer-node-track .explorer-node-label-meta {
font-size: 9px;
}
/* ── SVG Connection Lines ── */
.explorer-svg {
transition: opacity 0.4s ease;
opacity: 0;
}
.explorer-tree:hover .explorer-svg {
opacity: 1;
}
.explorer-line {
fill: none;
}
.explorer-line-animated {
animation: explorer-line-draw 0.6s cubic-bezier(0.4, 0, 0.2, 1) forwards;
}
@keyframes explorer-line-draw {
to { stroke-dashoffset: 0; }
}
@keyframes explorer-node-enter {
from { opacity: 0; transform: translateY(20px) scale(0.8); }
to { opacity: 1; transform: none; }
}
/* ── Responsive ── */
@media (max-width: 900px) {
.explorer-container { padding: 16px; }
.explorer-controls { width: 100%; flex-wrap: wrap; }
.explorer-node-root { width: 120px; height: 120px; }
.explorer-node-artist { width: 68px; height: 68px; }
.explorer-node-album { width: 72px; height: 72px; }
.explorer-tier { gap: 12px; }
}
@media (max-width: 600px) {
.explorer-action-bar { flex-direction: column; gap: 10px; text-align: center; }
.explorer-node-root { width: 100px; height: 100px; }
.explorer-node-artist { width: 56px; height: 56px; }
.explorer-node-album { width: 60px; height: 60px; }
}
display: flex;
align-items: center;
gap: 20px;
padding: 24px 32px;
background: linear-gradient(135deg, rgba(var(--accent-rgb), 0.1) 0%, rgba(var(--accent-rgb), 0.03) 100%);
border: 1px solid rgba(var(--accent-rgb), 0.15);
border-radius: 20px;
position: relative;
overflow: hidden;
backdrop-filter: blur(16px);
animation: explorer-node-enter 0.6s ease both;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.06);
}
.explorer-root-glow {
position: absolute;
width: 200px;
height: 200px;
background: radial-gradient(circle, rgba(var(--accent-rgb), 0.15) 0%, transparent 70%);
top: -80px;
left: -40px;
pointer-events: none;
}
.explorer-root-image {
width: 72px;
height: 72px;
border-radius: 14px;
object-fit: cover;
box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
border: 2px solid rgba(255, 255, 255, 0.08);
flex-shrink: 0;
z-index: 1;
}
.explorer-root-image-placeholder {
width: 72px;
height: 72px;
border-radius: 14px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(var(--accent-rgb), 0.15);
color: rgba(255, 255, 255, 0.3);
font-size: 28px;
flex-shrink: 0;
z-index: 1;
}
.explorer-root-info { z-index: 1; }
.explorer-root-label {
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 1.5px;
color: rgba(var(--accent-rgb), 0.8);
margin-bottom: 4px;
}
.explorer-root-name {
font-size: 22px;
font-weight: 800;
color: #fff;
letter-spacing: -0.3px;
}
.explorer-root-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
margin-top: 4px;
}
/* Trunk — vertical line from root to artists */
.explorer-trunk {
width: 2px;
height: 32px;
background: linear-gradient(to bottom, rgba(var(--accent-rgb), 0.4), rgba(var(--accent-rgb), 0.15));
margin: 0 auto;
border-radius: 2px;
animation: explorer-trunk-grow 0.4s ease 0.3s both;
}
@keyframes explorer-trunk-grow {
from { height: 0; opacity: 0; }
to { height: 32px; opacity: 1; }
}
/* Artist column — vertical list */
.explorer-artists-column {
display: flex;
flex-direction: column;
gap: 4px;
width: 100%;
}
/* Artist row — connector + card + albums */
.explorer-artist-row {
animation: explorer-node-enter 0.5s ease both;
}
/* Left connector (dot + horizontal line) */
.explorer-artist-connector {
display: flex;
align-items: center;
padding-left: 48px;
height: 0;
position: relative;
}
.explorer-connector-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 8px rgba(var(--accent-rgb), 0.4);
flex-shrink: 0;
position: relative;
z-index: 2;
}
.explorer-connector-line {
height: 2px;
flex: 1;
max-width: 32px;
background: linear-gradient(to right, rgba(var(--accent-rgb), 0.4), rgba(var(--accent-rgb), 0.1));
border-radius: 2px;
}
/* Artist card — horizontal layout */
.explorer-artist-card {
display: flex;
align-items: center;
gap: 16px;
padding: 14px 20px;
margin: 0 16px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 14px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
}
.explorer-artist-card:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(var(--accent-rgb), 0.2);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
}
.explorer-artist-card.expanded {
border-color: rgba(var(--accent-rgb), 0.35);
background: rgba(var(--accent-rgb), 0.04);
box-shadow: 0 4px 24px rgba(var(--accent-rgb), 0.08);
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.explorer-artist-card.error {
border-color: rgba(255, 71, 87, 0.15);
opacity: 0.6;
cursor: default;
}
.explorer-artist-card.empty {
opacity: 0.5;
cursor: default;
}
.explorer-artist-card-left { flex-shrink: 0; }
.explorer-artist-avatar {
width: 52px;
height: 52px;
border-radius: 50%;
overflow: hidden;
border: 2px solid rgba(255, 255, 255, 0.08);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.3);
}
.explorer-artist-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.explorer-artist-avatar span {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: rgba(var(--accent-rgb), 0.12);
color: rgba(255, 255, 255, 0.4);
font-size: 20px;
font-weight: 700;
}
.explorer-artist-card-center {
flex: 1;
min-width: 0;
}
.explorer-artist-card-name {
font-size: 15px;
font-weight: 700;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.explorer-artist-card-tracks {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
margin-top: 3px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-style: italic;
}
.explorer-artist-card-error {
font-size: 11px;
color: rgba(255, 71, 87, 0.7);
margin-top: 3px;
}
.explorer-artist-card-right {
display: flex;
align-items: center;
gap: 16px;
flex-shrink: 0;
}
.explorer-artist-stat {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
white-space: nowrap;
}
.explorer-artist-stat strong {
color: rgba(255, 255, 255, 0.7);
font-weight: 700;
}
.explorer-expand-indicator {
font-size: 14px;
color: rgba(255, 255, 255, 0.3);
transition: transform 0.3s;
width: 20px;
text-align: center;
}
.explorer-artist-card.expanded .explorer-expand-indicator {
color: var(--accent);
}
/* Albums container (expands below artist card) */
.explorer-albums-container {
max-height: 0;
overflow: hidden;
transition: max-height 0.5s cubic-bezier(0.4, 0, 0.2, 1);
margin: 0 16px;
border-left: 2px solid transparent;
}
.explorer-albums-container.open {
max-height: 4000px;
border-left-color: rgba(var(--accent-rgb), 0.15);
margin-left: 56px;
padding: 12px 0 12px 24px;
}
/* Album nodes — horizontal flow */
.explorer-album-nodes {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
/* Individual album node */
.explorer-album-node {
display: flex;
align-items: stretch;
animation: explorer-node-enter 0.4s ease both;
position: relative;
}
.explorer-album-node-connector {
width: 20px;
display: flex;
align-items: center;
position: relative;
}
.explorer-album-node-connector::before {
content: '';
width: 100%;
height: 2px;
background: rgba(var(--accent-rgb), 0.15);
border-radius: 2px;
}
.explorer-album-node-connector::after {
content: '';
position: absolute;
right: 0;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(var(--accent-rgb), 0.3);
transform: translateX(50%);
}
.explorer-album-node-card {
width: 160px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 12px;
overflow: hidden;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}
.explorer-album-node:hover .explorer-album-node-card {
border-color: rgba(var(--accent-rgb), 0.3);
transform: translateY(-2px);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
}
.explorer-album-node.selected .explorer-album-node-card {
border-color: rgba(var(--accent-rgb), 0.6);
box-shadow: 0 0 0 1px rgba(var(--accent-rgb), 0.2), 0 4px 20px rgba(var(--accent-rgb), 0.12);
}
.explorer-album-node.owned {
opacity: 0.5;
}
.explorer-album-node.selected .explorer-album-node-connector::before,
.explorer-album-node.selected .explorer-album-node-connector::after {
background: var(--accent);
}
/* Album node art */
.explorer-album-node-art {
position: relative;
width: 100%;
aspect-ratio: 1;
overflow: hidden;
background: rgba(var(--accent-rgb), 0.05);
}
.explorer-album-node-art img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.4s;
}
.explorer-album-node:hover .explorer-album-node-art img {
transform: scale(1.06);
}
.explorer-album-node-art-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.15);
font-size: 32px;
}
.explorer-album-node-check {
position: absolute;
top: 8px;
right: 8px;
width: 26px;
height: 26px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
border: 2px solid rgba(255, 255, 255, 0.25);
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
opacity: 0;
}
.explorer-album-node:hover .explorer-album-node-check,
.explorer-album-node-check.checked {
opacity: 1;
}
.explorer-album-node-check.checked {
background: var(--accent);
border-color: var(--accent);
box-shadow: 0 2px 8px rgba(var(--accent-rgb), 0.4);
}
.explorer-album-node-check svg {
width: 14px;
height: 14px;
color: #fff;
opacity: 0;
}
.explorer-album-node-check.checked svg {
opacity: 1;
}
/* Album node info */
.explorer-album-node-info {
padding: 10px 12px 12px;
}
.explorer-album-node-title {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
line-height: 1.3;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.explorer-album-node-meta {
font-size: 10px;
color: rgba(255, 255, 255, 0.3);
margin-top: 4px;
}
.explorer-album-node-badges {
display: flex;
gap: 4px;
margin-top: 6px;
flex-wrap: wrap;
}
.explorer-node-badge {
font-size: 9px;
font-weight: 700;
padding: 2px 7px;
border-radius: 4px;
text-transform: uppercase;
letter-spacing: 0.4px;
}
.explorer-node-badge.owned {
background: rgba(76, 175, 80, 0.2);
color: rgba(76, 175, 80, 0.9);
}
.explorer-node-badge.playlist {
background: rgba(var(--accent-rgb), 0.2);
color: rgba(var(--accent-rgb), 0.9);
}
/* SVG connection lines */
.explorer-connection-line {
stroke: rgba(var(--accent-rgb), 0.2);
stroke-width: 2;
fill: none;
animation: explorer-line-draw 0.6s ease forwards;
filter: drop-shadow(0 0 2px rgba(var(--accent-rgb), 0.1));
}
@keyframes explorer-line-draw {
from { stroke-dashoffset: var(--line-length, 500); }
to { stroke-dashoffset: 0; }
}
@keyframes explorer-node-enter {
from { opacity: 0; transform: translateY(16px) scale(0.92) rotate(-2deg); }
60% { transform: translateY(-2px) scale(1.02) rotate(0.5deg); }
to { opacity: 1; transform: none; }
}
/* Responsive */
@media (max-width: 900px) {
.explorer-container { padding: 16px; }
.explorer-controls { width: 100%; }
.explorer-root-node { padding: 16px 20px; gap: 14px; }
.explorer-root-name { font-size: 18px; }
.explorer-root-image { width: 56px; height: 56px; }
.explorer-artist-card { margin: 0 8px; padding: 12px 14px; gap: 12px; }
.explorer-artist-card-right { gap: 10px; }
.explorer-albums-container.open { margin-left: 40px; padding-left: 16px; }
.explorer-album-node-card { width: 130px; }
}
@media (max-width: 600px) {
.explorer-action-bar { flex-direction: column; gap: 10px; text-align: center; }
.explorer-artist-avatar { width: 40px; height: 40px; }
.explorer-artist-card-right { display: none; }
.explorer-album-nodes { gap: 8px; }
.explorer-album-node-card { width: 110px; }
.explorer-connector-dot { display: none; }
.explorer-connector-line { display: none; }
}
/* ==================================================================================
DASHBOARD — Recent Syncs
================================================================================== */
.sync-history-cards {
display: flex;
gap: 12px;
overflow-x: auto;
padding: 4px 2px 8px;
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
}
.sync-history-cards::-webkit-scrollbar { height: 4px; }
.sync-history-cards::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.1); border-radius: 4px; }
.sync-history-empty {
font-size: 13px;
color: rgba(255, 255, 255, 0.25);
padding: 16px 0;
}
.sync-history-card {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 16px;
min-width: 280px;
max-width: 360px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 14px;
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
flex-shrink: 0;
position: relative;
overflow: hidden;
animation: sync-card-enter 0.4s ease both;
}
@keyframes sync-card-enter {
from { opacity: 0; transform: translateY(8px) scale(0.97); }
to { opacity: 1; transform: none; }
}
.sync-card-delete {
position: absolute;
top: 6px;
right: 8px;
width: 20px;
height: 20px;
border: none;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.3);
border-radius: 50%;
font-size: 14px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: all 0.2s;
z-index: 2;
line-height: 1;
}
.sync-history-card:hover .sync-card-delete { opacity: 1; }
.sync-card-delete:hover { background: rgba(239, 83, 80, 0.3); color: #EF5350; }
.sync-history-card::before {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 3px;
border-radius: 14px 0 0 14px;
transition: all 0.2s;
}
.sync-history-card.health-good::before { background: #4CAF50; }
.sync-history-card.health-warn::before { background: #FFB74D; }
.sync-history-card.health-bad::before { background: #EF5350; }
.sync-history-card:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.12);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
}
.sync-card-thumb {
width: 48px;
height: 48px;
border-radius: 10px;
overflow: hidden;
flex-shrink: 0;
background: rgba(255, 255, 255, 0.04);
}
.sync-card-thumb img {
width: 100%;
height: 100%;
object-fit: cover;
}
.sync-card-thumb-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.15);
font-size: 18px;
}
.sync-card-info {
flex: 1;
min-width: 0;
}
.sync-card-name {
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sync-card-meta {
display: flex;
gap: 8px;
align-items: center;
margin-top: 3px;
}
.sync-card-source {
font-size: 10px;
font-weight: 700;
color: rgba(255, 255, 255, 0.4);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.sync-card-time {
font-size: 10px;
color: rgba(255, 255, 255, 0.25);
}
.sync-card-stats {
flex-shrink: 0;
text-align: right;
min-width: 60px;
}
.sync-card-pct {
font-size: 18px;
font-weight: 800;
color: rgba(255, 255, 255, 0.9);
line-height: 1;
}
.sync-card-bar {
width: 60px;
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 3px;
margin: 4px 0;
overflow: hidden;
}
.sync-card-bar-fill {
height: 100%;
border-radius: 3px;
transition: width 0.5s ease;
}
.health-good .sync-card-bar-fill { background: #4CAF50; }
.health-warn .sync-card-bar-fill { background: #FFB74D; }
.health-bad .sync-card-bar-fill { background: #EF5350; }
.sync-card-counts {
font-size: 9px;
color: rgba(255, 255, 255, 0.3);
white-space: nowrap;
}
/* Sync Detail Modal — wider than default discog modal */
#sync-detail-overlay .discog-modal {
max-width: 900px;
width: 95vw;
}
/* Sync Detail Modal Table */
.sync-detail-table-wrap {
overflow: auto;
flex: 1;
min-height: 0;
padding: 0 16px 16px;
}
.sync-detail-notice {
text-align: center;
padding: 16px !important;
}
.sync-detail-notice-text {
font-size: 12px;
color: rgba(255, 255, 255, 0.3);
background: rgba(255, 255, 255, 0.03);
border: 1px dashed rgba(255, 255, 255, 0.08);
border-radius: 8px;
padding: 12px 16px;
line-height: 1.5;
}
.sync-detail-row.no-data td {
color: rgba(255, 255, 255, 0.4);
}
.sync-detail-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.sync-detail-table thead th {
position: sticky;
top: 0;
background: rgba(18, 18, 22, 0.95);
padding: 10px 8px;
text-align: left;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.4);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
z-index: 2;
}
.sync-detail-table tbody tr {
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
transition: background 0.15s;
}
.sync-detail-table tbody tr:hover {
background: rgba(255, 255, 255, 0.03);
}
.sync-detail-table tbody td {
padding: 8px 10px;
color: rgba(255, 255, 255, 0.7);
}
.sync-detail-num {
color: rgba(255, 255, 255, 0.25);
width: 32px;
white-space: nowrap;
}
.sync-detail-art {
width: 36px;
padding: 4px 6px !important;
}
.sync-detail-art img {
width: 32px;
height: 32px;
border-radius: 4px;
object-fit: cover;
display: block;
}
.sync-detail-art-empty {
width: 32px;
height: 32px;
border-radius: 4px;
background: rgba(255, 255, 255, 0.04);
}
.sync-dl-wishlist {
font-size: 9px;
color: rgba(255, 183, 77, 0.8);
font-weight: 600;
white-space: nowrap;
}
.sync-detail-track {
font-weight: 500;
min-width: 150px;
}
.sync-detail-artist {
min-width: 100px;
color: rgba(255, 255, 255, 0.5);
}
.sync-detail-album {
min-width: 100px;
color: rgba(255, 255, 255, 0.4);
font-size: 11px;
}
.sync-detail-status { text-align: center; width: 45px; white-space: nowrap; }
.sync-detail-conf { text-align: center; width: 55px; white-space: nowrap; }
.sync-detail-dl { text-align: center; width: 35px; white-space: nowrap; }
.sync-detail-row.unmatched .sync-detail-track {
color: rgba(255, 255, 255, 0.45);
}
.conf-badge {
display: inline-block;
padding: 1px 6px;
border-radius: 4px;
font-size: 10px;
font-weight: 700;
}
.conf-badge.conf-high {
background: rgba(76, 175, 80, 0.15);
color: rgba(76, 175, 80, 0.9);
}
.conf-badge.conf-mid {
background: rgba(255, 183, 77, 0.15);
color: rgba(255, 183, 77, 0.9);
}
.conf-badge.conf-low {
background: rgba(239, 83, 80, 0.15);
color: rgba(239, 83, 80, 0.9);
}
@media (max-width: 768px) {
.sync-history-card { min-width: 240px; }
.sync-detail-table { font-size: 11px; }
.sync-detail-table tbody td { max-width: 120px; }
}
/* ==================================================================================
SERVER PLAYLIST MANAGER — Sync Page Server Tab
================================================================================== */
/* Playlist grid layout */
.server-pl-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 14px;
padding: 4px 2px;
}
/* Playlist cards */
.server-pl-card {
position: relative;
display: flex;
flex-direction: column;
padding: 18px 16px 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 16px;
cursor: pointer;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
overflow: hidden;
animation: sync-card-enter 0.35s ease both;
}
.server-pl-card-glow {
position: absolute;
top: -40%;
left: -20%;
width: 140%;
height: 100%;
background: radial-gradient(ellipse at center, hsla(var(--card-hue), 70%, 55%, 0.08) 0%, transparent 70%);
pointer-events: none;
transition: opacity 0.4s;
opacity: 0.5;
}
.server-pl-card:hover {
transform: translateY(-4px);
border-color: hsla(var(--card-hue), 60%, 60%, 0.25);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35), 0 0 20px hsla(var(--card-hue), 70%, 55%, 0.08);
}
.server-pl-card:hover .server-pl-card-glow {
opacity: 1;
}
/* Top row — visual bars + server badge */
.server-pl-card-top {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
position: relative;
z-index: 1;
}
.server-pl-card-icon-wrap {
width: 44px;
height: 44px;
border-radius: 12px;
background: hsla(var(--card-hue), 50%, 50%, 0.12);
display: flex;
align-items: flex-end;
justify-content: center;
padding-bottom: 8px;
gap: 3px;
}
/* Animated equalizer bars */
.server-pl-card-bars {
display: flex;
align-items: flex-end;
gap: 2.5px;
height: 20px;
}
.server-pl-card-bars span {
display: block;
width: 3.5px;
border-radius: 2px;
background: hsla(var(--card-hue), 65%, 60%, 0.7);
transition: height 0.3s ease;
}
.server-pl-card-bars span:nth-child(1) { height: 8px; }
.server-pl-card-bars span:nth-child(2) { height: 14px; }
.server-pl-card-bars span:nth-child(3) { height: 10px; }
.server-pl-card-bars span:nth-child(4) { height: 6px; }
.server-pl-card:hover .server-pl-card-bars span:nth-child(1) { height: 14px; animation: eq-bar 0.6s ease infinite alternate; }
.server-pl-card:hover .server-pl-card-bars span:nth-child(2) { height: 8px; animation: eq-bar 0.5s ease infinite alternate 0.1s; }
.server-pl-card:hover .server-pl-card-bars span:nth-child(3) { height: 16px; animation: eq-bar 0.55s ease infinite alternate 0.2s; }
.server-pl-card:hover .server-pl-card-bars span:nth-child(4) { height: 12px; animation: eq-bar 0.65s ease infinite alternate 0.15s; }
@keyframes eq-bar {
0% { height: 6px; }
100% { height: 18px; }
}
.server-pl-card-badge {
width: 28px;
height: 28px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.35);
transition: color 0.3s, border-color 0.3s;
}
.server-pl-card:hover .server-pl-card-badge {
color: rgba(255, 255, 255, 0.6);
border-color: rgba(255, 255, 255, 0.15);
}
/* Card body */
.server-pl-card-body {
position: relative;
z-index: 1;
margin-bottom: 14px;
}
.server-pl-card-name {
font-size: 14px;
font-weight: 650;
color: rgba(255, 255, 255, 0.9);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
letter-spacing: -0.01em;
line-height: 1.3;
}
.server-pl-card-meta {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
margin-top: 4px;
}
.server-pl-track-count {
font-weight: 700;
color: hsla(var(--card-hue), 60%, 65%, 0.9);
font-variant-numeric: tabular-nums;
}
/* Card footer */
.server-pl-card-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding-top: 12px;
border-top: 1px solid rgba(255, 255, 255, 0.05);
position: relative;
z-index: 1;
}
.server-pl-card-action {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: rgba(255, 255, 255, 0.25);
transition: color 0.3s;
}
.server-pl-card:hover .server-pl-card-action {
color: hsla(var(--card-hue), 60%, 65%, 0.8);
}
.server-pl-card-arrow {
color: rgba(255, 255, 255, 0.2);
transition: transform 0.3s, color 0.3s;
display: flex;
align-items: center;
}
.server-pl-card:hover .server-pl-card-arrow {
transform: translateX(4px);
color: hsla(var(--card-hue), 60%, 65%, 0.7);
}
/* Skeleton loading state */
.server-pl-skeleton {
pointer-events: none;
--card-hue: 220;
}
.server-pl-skeleton .skeleton-box {
background: linear-gradient(90deg, rgba(255,255,255,0.04) 25%, rgba(255,255,255,0.08) 50%, rgba(255,255,255,0.04) 75%);
background-size: 200% 100%;
animation: skeleton-shimmer 1.5s ease infinite;
}
@keyframes skeleton-shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
/* ── Disambiguation Modal ── */
.server-disambig-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(8px);
z-index: 9000;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.25s ease;
pointer-events: none;
}
.server-disambig-overlay.visible { opacity: 1; pointer-events: auto; }
.server-disambig-overlay.hidden { display: none; }
.server-disambig-modal {
background: rgba(22, 22, 30, 0.98);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 20px;
padding: 28px;
max-width: 520px;
width: 90vw;
box-shadow: 0 32px 80px rgba(0, 0, 0, 0.5);
transform: scale(0.95);
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.server-disambig-overlay.visible .server-disambig-modal { transform: scale(1); }
.server-disambig-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20px;
}
.server-disambig-title {
font-size: 16px;
font-weight: 700;
color: #fff;
margin: 0;
}
.server-disambig-subtitle {
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
margin: 4px 0 0;
}
.server-disambig-close {
width: 32px;
height: 32px;
border: none;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.5);
border-radius: 50%;
font-size: 20px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.2s;
}
.server-disambig-close:hover { background: rgba(255, 255, 255, 0.12); color: #fff; }
.server-disambig-card {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
border-radius: 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
cursor: pointer;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
margin-bottom: 8px;
animation: fadeSlideUp 0.3s ease forwards;
opacity: 0;
}
.server-disambig-card:hover {
background: rgba(255, 255, 255, 0.07);
border-color: rgba(var(--accent-rgb), 0.2);
transform: translateX(4px);
}
.server-disambig-icon {
width: 44px;
height: 44px;
border-radius: 12px;
background: rgba(var(--accent-rgb), 0.1);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
flex-shrink: 0;
}
.server-disambig-info { flex: 1; min-width: 0; }
.server-disambig-name {
font-size: 14px;
font-weight: 650;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 4px;
}
.server-disambig-details {
display: flex;
flex-wrap: wrap;
gap: 8px;
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
align-items: center;
}
.server-disambig-details .source-badge {
font-size: 9px;
padding: 2px 8px;
border-radius: 4px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.04em;
background: rgba(var(--accent-rgb), 0.12);
color: var(--accent);
}
.server-disambig-arrow {
color: rgba(255, 255, 255, 0.2);
flex-shrink: 0;
transition: transform 0.25s, color 0.25s;
}
.server-disambig-card:hover .server-disambig-arrow {
transform: translateX(4px);
color: var(--accent);
}
@keyframes fadeSlideUp {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── Editor Header ── */
.server-editor-header {
display: flex;
align-items: center;
gap: 14px;
padding: 8px 0 12px;
}
.server-editor-back {
padding: 6px 14px;
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.6);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
cursor: pointer;
transition: all 0.2s;
flex-shrink: 0;
}
.server-editor-back:hover { background: rgba(255, 255, 255, 0.1); color: #fff; }
.server-editor-info { flex: 1; min-width: 0; }
.server-editor-refresh {
width: 32px;
height: 32px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgba(255, 255, 255, 0.04);
color: rgba(255, 255, 255, 0.4);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.2s;
}
.server-editor-refresh:hover {
background: rgba(255, 255, 255, 0.1);
color: #fff;
border-color: rgba(255, 255, 255, 0.15);
}
.server-editor-name {
font-size: 16px;
font-weight: 700;
color: #fff;
margin: 0;
}
.server-editor-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
}
.server-editor-stats {
display: flex;
gap: 10px;
flex-shrink: 0;
}
.server-editor-stat {
text-align: center;
padding: 4px 10px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.05);
}
.server-editor-stat-num {
font-size: 16px;
font-weight: 800;
line-height: 1.2;
}
.server-editor-stat-num.matched { color: #4caf50; }
.server-editor-stat-num.missing { color: #ef5350; }
.server-editor-stat-num.extra { color: #ffb74d; }
.server-editor-stat-label {
font-size: 9px;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.3);
font-weight: 600;
}
/* No-source banner */
.server-no-source-banner {
padding: 10px 16px;
background: rgba(255, 183, 77, 0.06);
border: 1px solid rgba(255, 183, 77, 0.15);
border-radius: 10px;
font-size: 12px;
color: rgba(255, 183, 77, 0.8);
margin-bottom: 10px;
}
/* Editor filters */
.server-editor-filters {
display: flex;
gap: 4px;
margin-bottom: 10px;
}
/* ── Dual-Column Compare Layout ── */
.server-compare-columns {
display: flex;
gap: 0;
height: calc(100vh - 340px);
min-height: 380px;
max-height: 620px;
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 14px;
overflow: hidden;
}
.server-compare-col {
flex: 1;
display: flex;
flex-direction: column;
min-width: 0;
}
.server-compare-col.source {
border-right: 1px solid rgba(255, 255, 255, 0.06);
}
.server-col-header {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
background: rgba(255, 255, 255, 0.02);
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
font-size: 11px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.5);
flex-shrink: 0;
}
.server-col-icon {
font-size: 14px;
display: flex;
align-items: center;
}
.server-col-count {
margin-left: auto;
font-variant-numeric: tabular-nums;
font-size: 10px;
padding: 2px 8px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.05);
color: rgba(255, 255, 255, 0.4);
}
.server-col-scroll {
flex: 1;
overflow-y: auto;
overscroll-behavior: contain;
}
.server-col-scroll::-webkit-scrollbar { width: 4px; }
.server-col-scroll::-webkit-scrollbar-track { background: transparent; }
.server-col-scroll::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.08); border-radius: 2px; }
.server-col-scroll::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.15); }
/* ── Track Items ── */
.server-track-item {
display: flex;
align-items: center;
gap: 10px;
padding: 7px 14px;
border-bottom: 1px solid rgba(255, 255, 255, 0.03);
cursor: pointer;
transition: background 0.15s, box-shadow 0.2s;
min-height: 50px;
}
.server-track-item:hover { background: rgba(255, 255, 255, 0.03); }
.server-track-item:last-child { border-bottom: none; }
.server-track-item.highlighted {
background: rgba(100, 181, 246, 0.07);
box-shadow: inset 3px 0 0 rgba(100, 181, 246, 0.5);
}
.server-track-num {
width: 22px;
font-size: 10px;
color: rgba(255, 255, 255, 0.2);
text-align: right;
flex-shrink: 0;
font-variant-numeric: tabular-nums;
}
.server-track-art {
width: 36px;
height: 36px;
border-radius: 6px;
overflow: hidden;
flex-shrink: 0;
}
.server-track-art img {
width: 100%;
height: 100%;
object-fit: cover;
}
.server-track-art-empty {
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.04);
border-radius: 6px;
}
.server-track-info {
flex: 1;
min-width: 0;
}
.server-track-title {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.85);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.server-track-artist {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-top: 1px;
}
.server-track-duration {
font-size: 10px;
color: rgba(255, 255, 255, 0.2);
flex-shrink: 0;
width: 34px;
text-align: right;
font-variant-numeric: tabular-nums;
}
.server-track-status-dot {
width: 7px;
height: 7px;
border-radius: 50%;
flex-shrink: 0;
}
.server-track-item.matched .server-track-status-dot {
background: #4caf50;
box-shadow: 0 0 6px rgba(76, 175, 80, 0.35);
}
.server-track-item.missing .server-track-status-dot {
background: #ef5350;
box-shadow: 0 0 6px rgba(239, 83, 80, 0.35);
}
.server-track-item.extra .server-track-status-dot {
background: #ffb74d;
box-shadow: 0 0 6px rgba(255, 183, 77, 0.35);
}
/* ── Empty Slots (missing / extra gap) ── */
.server-track-empty-slot {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
padding: 6px 12px;
border-radius: 8px;
border: 1.5px dashed rgba(239, 83, 80, 0.2);
background: rgba(239, 83, 80, 0.02);
transition: all 0.2s;
min-height: 36px;
}
.server-track-empty-slot:hover {
border-color: rgba(239, 83, 80, 0.45);
background: rgba(239, 83, 80, 0.06);
}
.server-track-empty-slot.extra {
border-color: rgba(255, 183, 77, 0.15);
background: rgba(255, 183, 77, 0.02);
}
.empty-slot-wrap { cursor: pointer; }
.empty-slot-wrap:hover .empty-slot-label { color: rgba(239, 83, 80, 0.9); }
.empty-slot-icon {
color: rgba(239, 83, 80, 0.4);
flex-shrink: 0;
display: flex;
align-items: center;
}
.empty-slot-label {
font-size: 11px;
font-weight: 600;
color: rgba(239, 83, 80, 0.5);
transition: color 0.2s;
white-space: nowrap;
}
.empty-slot-hint {
font-size: 10px;
color: rgba(255, 255, 255, 0.15);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
min-width: 0;
}
/* Confidence badge on matched tracks */
.server-track-conf {
font-size: 9px;
font-weight: 700;
padding: 2px 6px;
border-radius: 4px;
flex-shrink: 0;
font-variant-numeric: tabular-nums;
letter-spacing: 0.02em;
}
.server-track-conf.exact {
background: rgba(76, 175, 80, 0.12);
color: #4caf50;
}
.server-track-conf.high {
background: rgba(139, 195, 74, 0.12);
color: #8bc34a;
}
.server-track-conf.fuzzy {
background: rgba(255, 183, 77, 0.12);
color: #ffb74d;
}
/* Track action buttons (swap + remove) */
.server-track-actions {
display: flex;
align-items: center;
gap: 2px;
flex-shrink: 0;
opacity: 0;
transition: opacity 0.15s;
}
.server-track-item:hover .server-track-actions { opacity: 1; }
.server-track-swap-btn {
width: 22px;
height: 22px;
border-radius: 6px;
border: 1px solid transparent;
background: transparent;
color: rgba(255, 255, 255, 0.15);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.2s;
padding: 0;
}
.server-track-swap-btn:hover {
background: rgba(var(--accent-rgb), 0.12);
border-color: rgba(var(--accent-rgb), 0.25);
color: var(--accent);
}
.server-track-remove-btn {
width: 22px;
height: 22px;
border-radius: 6px;
border: 1px solid transparent;
background: transparent;
color: rgba(255, 255, 255, 0.15);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.2s;
padding: 0;
}
.server-track-remove-btn:hover {
background: rgba(239, 83, 80, 0.12);
border-color: rgba(239, 83, 80, 0.25);
color: #ef5350;
}
.extra-gap { opacity: 0.5; }
.extra-gap .server-track-empty-slot { border-color: rgba(255, 183, 77, 0.15); }
.extra-gap .empty-slot-label { color: rgba(255, 183, 77, 0.4); }
/* ── Editor Footer ── */
.server-editor-footer {
padding: 10px 0;
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
text-align: center;
}
/* ── Search Modal ── */
.server-search-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(4px);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.2s ease;
}
.server-search-overlay.visible { opacity: 1; }
.server-search-popover {
width: 580px;
max-width: 95vw;
max-height: 80vh;
background: rgba(20, 20, 28, 0.98);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
box-shadow: 0 32px 80px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255,255,255,0.03) inset;
display: flex;
flex-direction: column;
transform: scale(0.96) translateY(8px);
transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.server-search-overlay.visible .server-search-popover {
transform: scale(1) translateY(0);
}
.server-search-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 20px 20px 0;
}
.server-search-title {
font-size: 16px;
font-weight: 700;
color: #fff;
margin-bottom: 4px;
}
.server-search-context {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
display: flex;
align-items: center;
gap: 4px;
flex-wrap: wrap;
}
.server-search-context-label {
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.04em;
font-size: 9px;
color: rgba(255, 255, 255, 0.25);
background: rgba(255, 255, 255, 0.05);
padding: 1px 6px;
border-radius: 3px;
}
.server-search-context-artist { color: rgba(255, 255, 255, 0.5); font-weight: 600; }
.server-search-context-sep { color: rgba(255, 255, 255, 0.15); }
.server-search-context-name { color: var(--accent); font-weight: 600; }
.server-search-close {
width: 30px;
height: 30px;
border: none;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.4);
border-radius: 50%;
font-size: 18px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.2s;
}
.server-search-close:hover { background: rgba(255, 255, 255, 0.12); color: #fff; }
.server-search-input-wrap {
display: flex;
align-items: center;
gap: 0;
margin: 14px 20px 0;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
transition: border-color 0.2s;
}
.server-search-input-wrap:focus-within {
border-color: rgba(var(--accent-rgb), 0.4);
}
.server-search-input-icon {
padding: 0 4px 0 14px;
color: rgba(255, 255, 255, 0.25);
display: flex;
align-items: center;
flex-shrink: 0;
}
.server-search-input {
flex: 1;
padding: 11px 14px 11px 8px;
background: transparent;
border: none;
color: #fff;
font-size: 13px;
outline: none;
}
.server-search-results-header {
padding: 10px 20px 0;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.5px;
color: rgba(255, 255, 255, 0.25);
min-height: 20px;
}
.server-search-results {
overflow-y: auto;
flex: 1;
padding: 6px 12px 16px;
max-height: 420px;
}
.server-search-results::-webkit-scrollbar { width: 4px; }
.server-search-results::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 2px; }
.server-search-hint {
text-align: center;
padding: 32px 20px;
color: rgba(255, 255, 255, 0.2);
font-size: 12px;
line-height: 1.6;
}
.server-search-spinner {
width: 20px;
height: 20px;
border: 2px solid rgba(255,255,255,0.1);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin 0.6s linear infinite;
margin: 0 auto 8px;
}
@keyframes spin { to { transform: rotate(360deg); } }
.server-search-result {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 10px;
border-radius: 12px;
margin-bottom: 2px;
cursor: pointer;
transition: background 0.15s;
animation: fadeSlideUp 0.2s ease both;
}
.server-search-result:hover { background: rgba(255, 255, 255, 0.05); }
.server-search-result-art {
width: 44px;
height: 44px;
border-radius: 8px;
overflow: hidden;
flex-shrink: 0;
}
.server-search-result-art img {
width: 100%;
height: 100%;
object-fit: cover;
}
.server-search-result-art-empty {
width: 100%;
height: 100%;
background: rgba(255, 255, 255, 0.04);
border-radius: 8px;
}
.server-search-result-info {
flex: 1;
min-width: 0;
}
.server-search-result-title {
font-size: 13px;
font-weight: 600;
color: rgba(255, 255, 255, 0.9);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.server-search-result-meta {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
margin-top: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.server-search-result-details {
display: flex;
align-items: center;
gap: 5px;
flex-shrink: 0;
}
.server-search-format {
padding: 2px 6px;
border-radius: 4px;
font-size: 9px;
font-weight: 700;
background: rgba(var(--accent-rgb), 0.12);
color: rgba(var(--accent-rgb), 0.85);
letter-spacing: 0.03em;
}
.server-search-bitrate {
font-size: 9px;
font-weight: 600;
color: rgba(255, 255, 255, 0.2);
font-variant-numeric: tabular-nums;
}
.server-search-dur {
font-size: 10px;
color: rgba(255, 255, 255, 0.2);
font-variant-numeric: tabular-nums;
min-width: 28px;
text-align: right;
}
.server-search-select-btn {
padding: 6px 14px;
background: rgba(var(--accent-rgb), 0.1);
border: 1px solid rgba(var(--accent-rgb), 0.2);
border-radius: 8px;
color: var(--accent);
font-size: 11px;
font-weight: 600;
cursor: pointer;
flex-shrink: 0;
transition: all 0.2s;
}
.server-search-select-btn:hover {
background: var(--accent);
border-color: var(--accent);
color: #fff;
}
/* Server tab icon */
.tab-icon.server-icon::before {
content: '💻';
}
/* ── Server Playlist Manager — Mobile ── */
@media (max-width: 768px) {
.server-pl-grid {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 10px;
}
.server-pl-card { padding: 14px 12px 12px; }
.server-pl-card-icon-wrap { width: 36px; height: 36px; }
.server-pl-card-name { font-size: 12px; }
/* Stack columns vertically with toggle */
.server-compare-columns {
flex-direction: column;
height: auto;
max-height: none;
}
.server-compare-col {
max-height: 50vh;
}
.server-compare-col.source {
border-right: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.server-editor-header {
flex-wrap: wrap;
gap: 8px;
}
.server-editor-stats {
width: 100%;
justify-content: flex-start;
}
.server-track-item { padding: 6px 10px; gap: 8px; min-height: 44px; }
.server-track-art { width: 32px; height: 32px; }
.server-track-title { font-size: 11px; }
.server-track-artist { font-size: 9px; }
.server-track-duration { display: none; }
.server-track-actions { opacity: 1; }
.server-disambig-modal { padding: 20px 16px; }
.server-search-popover { max-width: 100vw; width: 100vw; max-height: 100vh; border-radius: 0; }
.server-search-result { gap: 8px; padding: 8px 6px; }
.server-search-result-art { width: 36px; height: 36px; }
.server-search-result-details { gap: 3px; }
.sync-tab-server { flex: 1 !important; }
.sync-tab-divider { display: none; }
}
/* ==================================================================================
SMART DELETE MODAL
================================================================================== */
.smart-delete-modal {
background: rgba(20, 20, 28, 0.98);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
padding: 24px;
max-width: 420px;
width: 90vw;
box-shadow: 0 32px 80px rgba(0, 0, 0, 0.6);
}
.smart-delete-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8px;
}
.smart-delete-header h3 {
font-size: 16px;
font-weight: 700;
color: #fff;
margin: 0;
}
.smart-delete-close {
width: 30px;
height: 30px;
border: none;
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.4);
border-radius: 50%;
font-size: 18px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
}
.smart-delete-close:hover { background: rgba(255, 255, 255, 0.12); color: #fff; }
.smart-delete-desc {
font-size: 12px;
color: rgba(255, 255, 255, 0.35);
margin: 0 0 16px;
}
.smart-delete-options {
display: flex;
flex-direction: column;
gap: 8px;
}
.smart-delete-option {
display: flex;
align-items: center;
gap: 14px;
padding: 14px 16px;
border-radius: 14px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.06);
cursor: pointer;
transition: all 0.2s;
text-align: left;
color: #fff;
}
.smart-delete-option:hover {
background: rgba(255, 255, 255, 0.06);
border-color: rgba(255, 255, 255, 0.12);
}
.smart-delete-option.destructive:hover {
background: rgba(239, 83, 80, 0.08);
border-color: rgba(239, 83, 80, 0.2);
}
.smart-delete-option-icon {
font-size: 20px;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.smart-delete-option-info { flex: 1; min-width: 0; }
.smart-delete-option-title {
font-size: 13px;
font-weight: 600;
margin-bottom: 2px;
}
.smart-delete-option.destructive .smart-delete-option-title { color: #ef5350; }
.smart-delete-option-desc {
font-size: 11px;
color: rgba(255, 255, 255, 0.35);
line-height: 1.3;
}
/* ==================================================================================
TRACK REDOWNLOAD MODAL
================================================================================== */
.redownload-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(4px);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
}
.redownload-modal {
background: rgba(16, 16, 24, 0.85);
backdrop-filter: blur(40px) saturate(1.4);
-webkit-backdrop-filter: blur(40px) saturate(1.4);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 24px;
max-width: 1100px;
width: 95vw;
max-height: 88vh;
display: flex;
flex-direction: column;
box-shadow: 0 40px 100px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255,255,255,0.06) inset, 0 0 80px rgba(0,0,0,0.3) inset;
}
.redownload-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 28px 32px 0;
}
.redownload-header h3 { font-size: 20px; font-weight: 800; color: #fff; margin: 0; letter-spacing: -0.02em; }
.redownload-header-sub { font-size: 13px; color: rgba(255,255,255,0.3); margin: 6px 0 0; }
.redownload-close {
width: 32px; height: 32px; border: none; background: rgba(255,255,255,0.06);
color: rgba(255,255,255,0.4); border-radius: 50%; font-size: 18px; cursor: pointer;
display: flex; align-items: center; justify-content: center; transition: all 0.2s;
flex-shrink: 0;
}
.redownload-close:hover { background: rgba(255,255,255,0.12); color: #fff; }
/* Current track card */
.redownload-current {
display: flex; align-items: center; gap: 16px;
margin: 20px 32px 0; padding: 16px 20px;
background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
border-radius: 16px;
}
.redownload-current-art {
width: 56px; height: 56px; border-radius: 12px;
overflow: hidden; flex-shrink: 0;
background: rgba(var(--accent-rgb), 0.1);
display: flex; align-items: center; justify-content: center;
}
.redownload-current-art img {
width: 100%; height: 100%; object-fit: cover;
}
.redownload-current-art .redownload-art-empty {
font-size: 22px; width: 100%; height: 100%;
display: flex; align-items: center; justify-content: center;
background: rgba(var(--accent-rgb), 0.1); border-radius: 0;
}
.redownload-current-info { flex: 1; min-width: 0; }
.redownload-current-title { font-size: 16px; font-weight: 700; color: rgba(255,255,255,0.95); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.redownload-current-meta { font-size: 12px; color: rgba(255,255,255,0.35); margin-top: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.redownload-current-badges { display: flex; gap: 4px; flex-shrink: 0; }
.redownload-badge {
font-size: 10px; font-weight: 700; padding: 4px 10px; border-radius: 6px;
letter-spacing: 0.03em;
}
.redownload-badge.fmt { background: rgba(var(--accent-rgb), 0.12); color: var(--accent); }
.redownload-badge.bitrate { background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.4); }
/* Step indicator */
.redownload-steps {
display: flex; align-items: center; gap: 0; padding: 22px 32px 10px;
}
.redownload-step {
font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.2);
padding: 8px 16px; border-radius: 10px; transition: all 0.25s;
display: flex; align-items: center; gap: 10px; white-space: nowrap;
}
.redownload-step.active {
color: #fff; background: rgba(var(--accent-rgb), 0.12);
}
.redownload-step-num {
width: 24px; height: 24px; border-radius: 50%;
background: rgba(255,255,255,0.06); display: flex;
align-items: center; justify-content: center;
font-size: 11px; font-weight: 800;
}
.redownload-step.active .redownload-step-num {
background: var(--accent); color: #fff;
}
.redownload-step-line {
flex: 1; height: 2px; background: rgba(255,255,255,0.06);
margin: 0 6px; min-width: 20px; border-radius: 1px;
}
.redownload-body { padding: 8px 32px 28px; overflow-y: auto; flex: 1; }
.redownload-loading, .redownload-error, .redownload-empty {
text-align: center; padding: 30px; color: rgba(255,255,255,0.25); font-size: 12px;
}
.redownload-error { color: #ef5350; }
/* Step 1 — Metadata source columns */
.redownload-columns {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 12px;
}
.redownload-source-col {
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 14px;
overflow: hidden;
display: flex;
flex-direction: column;
}
.redownload-col-header {
display: flex; align-items: center; gap: 8px;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.02);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
font-size: 13px; font-weight: 700; color: rgba(255, 255, 255, 0.6);
}
.redownload-col-icon { font-size: 16px; }
.redownload-col-label { flex: 1; }
.redownload-col-count {
font-size: 10px; padding: 2px 8px; border-radius: 10px;
background: rgba(255, 255, 255, 0.06); color: rgba(255, 255, 255, 0.35);
font-variant-numeric: tabular-nums;
}
.redownload-col-results {
max-height: 380px; overflow-y: auto; padding: 6px;
}
.redownload-col-results::-webkit-scrollbar { width: 3px; }
.redownload-col-results::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.08); border-radius: 2px; }
.redownload-col-empty {
padding: 30px 16px; text-align: center;
font-size: 12px; color: rgba(255, 255, 255, 0.2);
}
.redownload-result {
display: flex; align-items: center; gap: 12px; padding: 10px 12px; border-radius: 12px;
cursor: pointer; transition: all 0.15s; margin-bottom: 3px;
border: 1px solid transparent;
}
.redownload-result:hover { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.06); }
.redownload-result:has(input:checked) { background: rgba(var(--accent-rgb), 0.06); border-color: rgba(var(--accent-rgb), 0.15); }
.redownload-result input[type="radio"] { accent-color: var(--accent); flex-shrink: 0; width: 16px; height: 16px; }
.redownload-result-art { width: 48px; height: 48px; border-radius: 10px; overflow: hidden; flex-shrink: 0; }
.redownload-result-art img { width: 100%; height: 100%; object-fit: cover; }
.redownload-art-empty { width: 100%; height: 100%; background: rgba(255,255,255,0.04); border-radius: 6px; }
.redownload-result-info { flex: 1; min-width: 0; }
.redownload-result-title { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.9); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.redownload-result-meta { font-size: 11px; color: rgba(255,255,255,0.35); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
.redownload-current-badge { font-size: 8px; background: rgba(var(--accent-rgb),0.15); color: var(--accent); padding: 1px 5px; border-radius: 3px; font-weight: 700; text-transform: uppercase; }
.redownload-result-score { font-size: 11px; font-weight: 700; flex-shrink: 0; padding: 4px 10px; border-radius: 6px; }
.redownload-result-score.high { background: rgba(76,175,80,0.12); color: #4caf50; }
.redownload-result-score.medium { background: rgba(255,183,77,0.12); color: #ffb74d; }
.redownload-result-score.low { background: rgba(239,83,80,0.12); color: #ef5350; }
.redownload-result-right { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; flex-shrink: 0; }
.redownload-result-dur { font-size: 10px; color: rgba(255,255,255,0.2); flex-shrink: 0; min-width: 30px; text-align: right; }
/* Step 2 — Download source columns */
.rdl-src-columns {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 12px;
}
.rdl-src-col {
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 14px;
overflow: hidden;
display: flex;
flex-direction: column;
}
.rdl-src-col-header {
display: flex; align-items: center; gap: 8px;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.02);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
font-size: 13px; font-weight: 700; color: rgba(255, 255, 255, 0.6);
}
.rdl-src-col-icon { font-size: 16px; }
.rdl-src-col-label { flex: 1; }
.rdl-src-col-count {
font-size: 10px; padding: 2px 8px; border-radius: 10px;
background: rgba(255, 255, 255, 0.06); color: rgba(255, 255, 255, 0.35);
}
.rdl-src-col-body {
max-height: 400px; overflow-y: auto; padding: 6px;
}
.rdl-src-col-body::-webkit-scrollbar { width: 3px; }
.rdl-src-col-body::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.08); border-radius: 2px; }
/* Individual result item */
.rdl-src-item {
display: flex; align-items: flex-start; gap: 10px;
padding: 10px 12px; border-radius: 12px; cursor: pointer;
transition: all 0.15s; margin-bottom: 4px;
border: 1px solid transparent;
}
.rdl-src-item:hover { background: rgba(255, 255, 255, 0.04); border-color: rgba(255, 255, 255, 0.06); }
.rdl-src-item:has(input:checked) { background: rgba(var(--accent-rgb), 0.06); border-color: rgba(var(--accent-rgb), 0.15); }
.rdl-src-item.recommended { border-color: rgba(var(--accent-rgb), 0.1); }
.rdl-src-item.blacklisted { opacity: 0.3; cursor: not-allowed; }
.rdl-src-item input[type="radio"] { accent-color: var(--accent); flex-shrink: 0; width: 16px; height: 16px; margin-top: 4px; }
.rdl-src-radio-placeholder { width: 16px; height: 16px; flex-shrink: 0; }
.rdl-src-item-body { flex: 1; min-width: 0; }
.rdl-src-item-top { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
.rdl-src-item-name {
font-size: 13px; font-weight: 600; color: rgba(255, 255, 255, 0.9);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0;
}
.rdl-src-recommended {
font-size: 8px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.05em;
padding: 2px 6px; border-radius: 4px;
background: rgba(var(--accent-rgb), 0.15); color: var(--accent);
white-space: nowrap; flex-shrink: 0;
}
.rdl-src-item-details {
display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-bottom: 6px;
}
.rdl-src-fmt {
font-size: 10px; font-weight: 700; padding: 2px 7px; border-radius: 4px;
background: rgba(var(--accent-rgb), 0.12); color: var(--accent); letter-spacing: 0.02em;
}
.rdl-src-detail {
font-size: 10px; color: rgba(255, 255, 255, 0.3);
}
.rdl-src-user {
color: rgba(255, 255, 255, 0.45); font-weight: 600;
}
/* Confidence bar */
.rdl-src-conf-bar {
height: 3px; background: rgba(255, 255, 255, 0.06); border-radius: 2px; overflow: hidden;
}
.rdl-src-conf-fill {
height: 100%; border-radius: 2px; transition: width 0.3s ease;
}
.rdl-src-conf-fill.high { background: #4caf50; }
.rdl-src-conf-fill.medium { background: #ffb74d; }
.rdl-src-conf-fill.low { background: #ef5350; }
.rdl-src-conf-pct {
font-size: 11px; font-weight: 700; flex-shrink: 0; min-width: 34px; text-align: right; margin-top: 2px;
}
.rdl-src-conf-pct.high { color: #4caf50; }
.rdl-src-conf-pct.medium { color: #ffb74d; }
.rdl-src-conf-pct.low { color: #ef5350; }
.rdl-src-bl { font-size: 9px; color: #ef5350; font-weight: 600; margin-top: 2px; }
.rdl-src-col-empty {
padding: 24px 16px; text-align: center;
font-size: 12px; color: rgba(255, 255, 255, 0.2);
}
/* Sticky footer — always visible at bottom of modal */
.redownload-sticky-footer {
padding: 16px 32px 24px;
border-top: 1px solid rgba(255, 255, 255, 0.06);
background: rgba(16, 16, 24, 0.95);
backdrop-filter: blur(20px);
flex-shrink: 0;
border-radius: 0 0 24px 24px;
}
.redownload-delete-old {
display: flex; align-items: center; gap: 8px; padding: 0 0 12px;
font-size: 12px; color: rgba(255,255,255,0.4); cursor: pointer;
}
.redownload-delete-old input { accent-color: var(--accent); }
/* Step 3 — Progress */
.redownload-progress { padding: 20px 0; text-align: center; }
.redownload-progress-title { font-size: 13px; font-weight: 600; color: rgba(255,255,255,0.8); }
.redownload-progress-from { font-size: 11px; color: rgba(255,255,255,0.3); margin: 4px 0 16px; }
.redownload-progress-bar-wrap { height: 8px; background: rgba(255,255,255,0.08); border-radius: 4px; overflow: hidden; }
.redownload-progress-bar { height: 100%; background: linear-gradient(90deg, #4caf50, #66bb6a); border-radius: 4px; width: 0; transition: width 0.5s ease; box-shadow: 0 0 8px rgba(76, 175, 80, 0.4); }
.redownload-progress-status { font-size: 11px; color: rgba(255,255,255,0.3); margin-top: 12px; }
/* Action buttons */
.redownload-actions { display: flex; justify-content: flex-end; gap: 12px; }
.redownload-btn {
padding: 12px 28px; border-radius: 12px; font-size: 14px; font-weight: 700; cursor: pointer; transition: all 0.2s; border: none;
}
.redownload-btn.primary {
background: linear-gradient(135deg, rgba(var(--accent-rgb), 1), rgba(var(--accent-rgb), 0.8));
color: #fff;
box-shadow: 0 4px 16px rgba(var(--accent-rgb), 0.3);
letter-spacing: 0.01em;
}
.redownload-btn.primary:hover { filter: brightness(1.15); transform: translateY(-1px); box-shadow: 0 6px 24px rgba(var(--accent-rgb), 0.4); }
.redownload-btn.secondary { background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.6); }
.redownload-btn.secondary:hover { background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.8); }
/* Redownload button in track table */
.enhanced-redownload-btn {
background: none; border: none; color: rgba(255,255,255,0.2); cursor: pointer;
font-size: 16px; padding: 2px 4px; border-radius: 4px; transition: all 0.2s;
}
.enhanced-redownload-btn:hover { color: var(--accent); background: rgba(var(--accent-rgb),0.1); }
/* Track actions group — source info, redownload, delete in one cell */
.col-track-actions { width: auto; padding: 0 4px !important; }
.enhanced-track-actions-group {
display: flex;
align-items: center;
gap: 2px;
justify-content: flex-end;
opacity: 0.4;
transition: opacity 0.15s;
}
tr:hover .enhanced-track-actions-group { opacity: 1; }
.enhanced-source-info-btn,
.enhanced-redownload-btn {
background: none; border: none; cursor: pointer;
width: 24px; height: 24px; border-radius: 5px;
display: flex; align-items: center; justify-content: center;
transition: all 0.15s; padding: 0;
}
.enhanced-source-info-btn { color: rgba(255,255,255,0.35); font-size: 13px; }
.enhanced-source-info-btn:hover { color: rgba(100,181,246,0.9); background: rgba(100,181,246,0.1); }
.enhanced-redownload-btn { color: rgba(255,255,255,0.35); font-size: 15px; }
.enhanced-redownload-btn:hover { color: var(--accent); background: rgba(var(--accent-rgb),0.1); }
.enhanced-delete-btn {
background: none; border: none; cursor: pointer;
width: 24px; height: 24px; border-radius: 5px;
display: flex; align-items: center; justify-content: center;
color: rgba(255,255,255,0.35); font-size: 13px;
transition: all 0.15s; padding: 0;
}
.enhanced-delete-btn:hover { color: #ef5350; background: rgba(239,83,80,0.1); }
/* Source Info Popover */
.source-info-popover {
position: fixed;
width: 360px;
max-width: 95vw;
background: rgba(20, 20, 28, 0.98);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
box-shadow: 0 16px 48px rgba(0, 0, 0, 0.5);
z-index: 9500;
opacity: 0;
transform: scale(0.96);
transition: opacity 0.2s, transform 0.2s;
}
.source-info-popover.visible { opacity: 1; transform: scale(1); }
.source-info-header {
display: flex; justify-content: space-between; align-items: center;
padding: 14px 16px 10px;
}
.source-info-title { font-size: 13px; font-weight: 700; color: #fff; }
.source-info-close {
width: 24px; height: 24px; border: none; background: rgba(255,255,255,0.06);
color: rgba(255,255,255,0.4); border-radius: 50%; font-size: 16px;
cursor: pointer; display: flex; align-items: center; justify-content: center;
}
.source-info-close:hover { background: rgba(255,255,255,0.12); color: #fff; }
.source-info-body { padding: 0 16px 12px; }
.source-info-row {
display: flex; justify-content: space-between; align-items: center;
padding: 6px 0; border-bottom: 1px solid rgba(255,255,255,0.03);
}
.source-info-row:last-child { border-bottom: none; }
.source-info-label {
font-size: 11px; color: rgba(255,255,255,0.35); font-weight: 600;
text-transform: uppercase; letter-spacing: 0.04em; flex-shrink: 0;
}
.source-info-value {
font-size: 12px; color: rgba(255,255,255,0.8); text-align: right;
max-width: 220px;
}
.source-info-mono { font-family: monospace; font-size: 11px; }
.source-info-ellipsis { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.source-info-empty {
padding: 20px 16px; text-align: center; font-size: 11px;
color: rgba(255,255,255,0.25);
}
.source-info-loading {
padding: 24px 16px; text-align: center; font-size: 11px;
color: rgba(255,255,255,0.25);
}
.source-info-actions { padding: 4px 16px 14px; }
.source-info-blacklist-btn {
width: 100%; padding: 8px 14px; border-radius: 8px; border: 1px solid rgba(239,83,80,0.2);
background: rgba(239,83,80,0.06); color: #ef5350; font-size: 11px; font-weight: 600;
cursor: pointer; transition: all 0.2s;
}
.source-info-blacklist-btn:hover { background: rgba(239,83,80,0.12); border-color: rgba(239,83,80,0.35); }
.source-info-blacklist-btn:disabled { opacity: 0.5; cursor: default; }
.source-info-history {
padding: 8px 16px 14px; font-size: 10px; color: rgba(255,255,255,0.2); text-align: center;
}
/* ── Blacklist Modal ── */
.blacklist-modal {
background: rgba(18, 18, 26, 0.95);
backdrop-filter: blur(30px);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 20px;
max-width: 600px;
width: 95vw;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 32px 80px rgba(0, 0, 0, 0.6);
}
.blacklist-modal-header {
display: flex; justify-content: space-between; align-items: center;
padding: 20px 24px 16px;
}
.blacklist-modal-header h3 { font-size: 16px; font-weight: 700; color: #fff; margin: 0; }
.blacklist-modal-body { padding: 0 24px 24px; overflow-y: auto; flex: 1; }
.blacklist-modal-body::-webkit-scrollbar { width: 4px; }
.blacklist-modal-body::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 2px; }
.blacklist-empty {
text-align: center; padding: 30px; font-size: 12px;
color: rgba(255, 255, 255, 0.25); line-height: 1.6;
}
.blacklist-entry {
display: flex; align-items: center; gap: 12px;
padding: 10px 12px; border-radius: 10px; margin-bottom: 4px;
border: 1px solid rgba(255, 255, 255, 0.04);
transition: background 0.15s;
}
.blacklist-entry:hover { background: rgba(255, 255, 255, 0.03); }
.blacklist-entry-icon {
font-size: 16px; flex-shrink: 0;
width: 32px; height: 32px; border-radius: 8px;
background: rgba(239, 83, 80, 0.08);
display: flex; align-items: center; justify-content: center;
}
.blacklist-entry-info { flex: 1; min-width: 0; }
.blacklist-entry-track {
font-size: 13px; font-weight: 600; color: rgba(255, 255, 255, 0.85);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.blacklist-entry-file {
font-size: 10px; color: rgba(255, 255, 255, 0.3); font-family: monospace;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px;
}
.blacklist-entry-user { font-size: 10px; color: rgba(255, 255, 255, 0.25); margin-top: 1px; }
.blacklist-entry-meta { font-size: 10px; color: rgba(255, 255, 255, 0.2); flex-shrink: 0; }
.blacklist-entry-remove {
width: 24px; height: 24px; border-radius: 6px; border: none;
background: transparent; color: rgba(255, 255, 255, 0.2);
cursor: pointer; display: flex; align-items: center; justify-content: center;
font-size: 12px; flex-shrink: 0; transition: all 0.15s;
}
.blacklist-entry-remove:hover { background: rgba(239, 83, 80, 0.12); color: #ef5350; }