:root{ /* Responsive sizing based on viewport width */ --outer-pad: 16px; --min-w: 320px; --w: max(var(--min-w), calc(100vw - (var(--outer-pad) * 2))); --h: clamp(120px, calc(var(--w) * 0.22), 190px); --art: clamp(88px, calc(var(--w) * 0.15), 128px); --radius: clamp(16px, calc(var(--w) * 0.03), 26px); /* Art corners slightly smaller than the card */ --art-radius: max(12px, calc(var(--radius) - 6px)); --pad: clamp(12px, calc(var(--w) * 0.02), 18px); --gap: clamp(10px, calc(var(--w) * 0.02), 18px); --blur: 18px; --shadow: 0 18px 50px rgba(0,0,0,.35); --stroke: rgba(255,255,255,.16); --text: rgba(255,255,255,.92); --muted: rgba(255,255,255,.70); } html, body { margin: 0; background: transparent; overflow: visible; width: 100vw; height: 100vh; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial; box-sizing: border-box; } *, *::before, *::after { box-sizing: inherit; } .wrap{ width: 100%; height: 100%; display: flex; align-items: stretch; justify-content: stretch; padding: var(--outer-pad); box-sizing: border-box; } .card{ position: relative; width: var(--w); height: var(--h); border-radius: var(--radius); box-shadow: var(--shadow); border: 1px solid var(--stroke); background: rgba(20,20,24,.40); backdrop-filter: blur(var(--blur)); -webkit-backdrop-filter: blur(var(--blur)); display: flex; align-items: center; gap: var(--gap); padding: var(--pad); box-sizing: border-box; overflow: hidden; transform: translateY(0); opacity: 1; transition: opacity .25s ease, transform .25s ease; } .card.hidden{ opacity: 0; transform: translateY(10px); } .card.no-art{ background: linear-gradient(135deg, rgba(30, 41, 59, 0.4), rgba(15, 23, 42, 0.6)); border-color: rgba(56, 189, 248, 0.3); box-shadow: 0 18px 50px rgba(0,0,0,.45), inset 0 0 20px rgba(56, 189, 248, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.1); backdrop-filter: blur(24px) saturate(1.2); -webkit-backdrop-filter: blur(24px) saturate(1.2); } .bg-bubbles{ position: absolute; inset: 0; z-index: 0; overflow: hidden; filter: blur(20px); transform: scale(1.2); background: linear-gradient(to bottom right, #0f172a, #1e40af, #0f172a); opacity: 0.8; } .bg-bubbles.hidden{ display: none; } .bg{ position:absolute; inset:-20px; z-index:0; opacity: .55; filter: blur(26px) saturate(1.1); transform: scale(1.12); } .bg img{ width:100%; height:100%; object-fit: cover; } .bgShade{ position:absolute; inset:0; z-index:0; background: radial-gradient(120% 160% at 20% 20%, rgba(255,255,255,.10), rgba(0,0,0,.55)); } .art{ position: relative; z-index: 2; width: var(--art); height: var(--art); border-radius: var(--art-radius); overflow: hidden; flex: 0 0 auto; border: 1px solid rgba(255,255,255,.14); background: rgba(0,0,0,.25); overflow: hidden; } .art img{ width: 100%; height: 100%; object-fit: cover; transition: opacity .25s ease; position: relative; z-index: 2; } /* Playing indicator - overlayed on album art */ .playing-indicator{ position: absolute; bottom: 5px; right: 5px; z-index: 10; width: 20px; height: 20px; border-radius: 4px; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); display: flex; align-items: center; justify-content: center; opacity: 0; transform: scale(0.9); transition: opacity 0.2s ease, transform 0.2s ease; } .playing-indicator.visible{ opacity: 1; transform: scale(1); } /* Equalizer bars */ .eq-bars{ display: flex; align-items: flex-end; justify-content: center; gap: 2px; height: 12px; } .eq-bars span{ width: 3px; background: rgba(255, 255, 255, 0.9); border-radius: 1px; animation: eq-bounce 0.8s ease-in-out infinite; } .eq-bars span:nth-child(1){ height: 8px; animation-delay: 0s; } .eq-bars span:nth-child(2){ height: 12px; animation-delay: 0.2s; } .eq-bars span:nth-child(3){ height: 6px; animation-delay: 0.4s; } @keyframes eq-bounce{ 0%, 100% { transform: scaleY(0.4); } 50% { transform: scaleY(1); } } /* Paused state */ .playing-indicator.paused .eq-bars span{ animation: none; background: rgba(255, 255, 255, 0.5); } .playing-indicator.paused .eq-bars span:nth-child(1){ height: 6px; } .playing-indicator.paused .eq-bars span:nth-child(2){ height: 6px; } .playing-indicator.paused .eq-bars span:nth-child(3){ height: 6px; } .meta{ position: relative; z-index: 2; display: flex; flex-direction: column; justify-content: center; align-self: center; min-width: 0; gap: 4px; padding-right: clamp(8px, calc(var(--w) * 0.02), 14px); flex: 1; } .title{ color: var(--text); font-weight: 700; font-size: clamp(18px, calc(var(--h) * 0.16), 22px); letter-spacing: .2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; text-shadow: 0 2px 10px rgba(0,0,0,.25); } .artist{ color: var(--muted); font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; max-width: 100%; } .album{ color: var(--muted); font-size: 13px; opacity: 0.8; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; max-width: 100%; font-style: italic; } .bubble-container, .bubble-overlay{ position:absolute; inset:0; pointer-events:none; opacity:0; transition: opacity .25s ease; } .bubble-overlay{ z-index:1; background: radial-gradient(circle at center, rgba(96,165,250,0.18), transparent 55%, transparent); } .bubble-container{ z-index:0; overflow:hidden; } .art.placeholder .bubble-container, .art.placeholder .bubble-overlay{ opacity:1; } .art.placeholder{ background: linear-gradient(to bottom right, #0f172a, #1e3a8a, #0f172a); } .art.placeholder img{ opacity: 0; } .bubble{ position:absolute; border-radius:50%; background: radial-gradient(circle at 30% 30%, rgba(255,255,255,0.9), rgba(56,189,248,0.6) 20%, rgba(37,99,235,0.3) 60%, transparent 80%); box-shadow: 0 0 10px rgba(56,189,248,0.4), inset 0 0 10px rgba(56,189,248,0.2); animation: float-up linear infinite; filter: blur(1px); pointer-events: none; z-index: 0; } /* Marquee for overflowing text */ .marquee{ overflow: hidden; text-overflow: clip; } .marquee .marqueeInner{ display: inline-flex; gap: 32px; min-width: 100%; width: max-content; animation: marquee linear infinite; } .marquee .marqueeInner span{ white-space: nowrap; max-width: none; } @keyframes marquee{ 0% { transform: translateX(0); } 100% { transform: translateX(calc(-50% - 16px)); } } @keyframes float-up{ 0% { top: 110%; transform: translateX(0) scale(0.8); opacity: 0; } 10% { opacity: var(--bubble-opacity); } 50% { transform: translateX(var(--sway-distance)) scale(1.2); } 90% { opacity: var(--bubble-opacity); } 100% { top: -20%; transform: translateX(0) scale(0.8); opacity: 0; } }