From 9a1c3b4124c676091530bc54d10b7f6ac9c98c90 Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Tue, 10 Mar 2026 15:24:33 -0700 Subject: [PATCH] Fix watchlist badge positioning and mobile card sizing --- webui/static/script.js | 48 ++++++++++++++----------------- webui/static/style.css | 65 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 84 insertions(+), 29 deletions(-) diff --git a/webui/static/script.js b/webui/static/script.js index 3f4dbefc..8cc198ff 100644 --- a/webui/static/script.js +++ b/webui/static/script.js @@ -31811,6 +31811,14 @@ function createLibraryArtistCard(artist) { if (artist.genius_url) { badgeSources.push({ cls: 'genius-card-icon', logo: GENIUS_LOGO_URL, fallback: 'GEN', title: 'View on Genius', url: artist.genius_url }); } + // Add watchlist indicator as the last badge + const hasExternalId = artist.itunes_artist_id || artist.spotify_artist_id; + if (artist.is_watched) { + badgeSources.push({ cls: 'watch-card-icon watched', logo: null, fallback: '👁️', fallbackExpanded: 'Watching', title: 'On your watchlist', url: null, isWatch: true }); + } else if (hasExternalId) { + badgeSources.push({ cls: 'watch-card-icon', logo: null, fallback: '👁️', fallbackExpanded: 'Watch', title: 'Add to Watchlist', url: null, isWatch: true, unwatched: true }); + } + if (badgeSources.length > 0) { const badgeContainer = document.createElement('div'); badgeContainer.className = 'card-badge-container'; @@ -31824,40 +31832,28 @@ function createLibraryArtistCard(artist) { img.style.cssText = 'width: 16px; height: auto; display: block;'; img.onerror = () => { icon.textContent = source.fallback; }; icon.appendChild(img); + } else if (source.fallbackExpanded) { + icon.innerHTML = `${source.fallback}${source.fallbackExpanded}`; } else { icon.textContent = source.fallback; } - icon.onclick = (e) => { - e.stopPropagation(); - window.open(source.url, '_blank'); - }; + if (source.isWatch && source.unwatched) { + icon.style.opacity = '0.4'; + icon.onclick = (e) => { + e.stopPropagation(); + toggleLibraryCardWatchlist(icon, artist); + }; + } else if (source.url) { + icon.onclick = (e) => { + e.stopPropagation(); + window.open(source.url, '_blank'); + }; + } badgeContainer.appendChild(icon); }); card.appendChild(badgeContainer); } - // Add watchlist button/indicator on the card - const hasExternalId = artist.itunes_artist_id || artist.spotify_artist_id; - if (artist.is_watched) { - const watchIcon = document.createElement('div'); - watchIcon.className = 'watchlist-card-icon'; - watchIcon.title = 'On your watchlist'; - watchIcon.style.top = badgeOffset + 'px'; - watchIcon.textContent = '👁️'; - card.appendChild(watchIcon); - } else if (hasExternalId) { - const watchBtn = document.createElement('button'); - watchBtn.className = 'library-card-watchlist-btn'; - watchBtn.style.top = badgeOffset + 'px'; - watchBtn.title = 'Add to Watchlist'; - watchBtn.innerHTML = '👁️Watch'; - watchBtn.onclick = (e) => { - e.stopPropagation(); - toggleLibraryCardWatchlist(watchBtn, artist); - }; - card.appendChild(watchBtn); - } - // Create image element const imageContainer = document.createElement("div"); imageContainer.className = "library-artist-image"; diff --git a/webui/static/style.css b/webui/static/style.css index eea5f297..b6986ad1 100644 --- a/webui/static/style.css +++ b/webui/static/style.css @@ -16372,6 +16372,7 @@ body { .library-artist-card { border-radius: 12px; + aspect-ratio: 0.65; } .library-artist-info { @@ -16381,6 +16382,29 @@ body { .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; + } } /* ======================================== @@ -28339,13 +28363,12 @@ body { .card-badge-container { position: absolute; top: 8px; + align-items: flex-end; right: 8px; display: flex; flex-direction: column; - gap: 4px; + gap: 3px; z-index: 100; - max-height: calc(100% - 80px); - overflow: hidden; } .source-card-icon { @@ -28401,6 +28424,42 @@ body { .genius-card-icon:hover { background: #ffff64; } +.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 {