NEW: collage cover for custom playlists
This commit is contained in:
parent
81d666ce3f
commit
1c2d925c05
2 changed files with 60 additions and 1 deletions
35
js/ui.js
35
js/ui.js
|
|
@ -219,10 +219,43 @@ export class UIRenderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
createUserPlaylistCardHTML(playlist) {
|
createUserPlaylistCardHTML(playlist) {
|
||||||
|
let imageHTML = '';
|
||||||
|
|
||||||
|
if (playlist.cover) {
|
||||||
|
imageHTML = `<img src="${playlist.cover}" alt="${playlist.name}" class="card-image" loading="lazy">`;
|
||||||
|
} else {
|
||||||
|
const tracks = playlist.tracks || [];
|
||||||
|
const uniqueCovers = [];
|
||||||
|
const seenCovers = new Set();
|
||||||
|
|
||||||
|
for (const track of tracks) {
|
||||||
|
const cover = track.album?.cover;
|
||||||
|
if (cover && !seenCovers.has(cover)) {
|
||||||
|
seenCovers.add(cover);
|
||||||
|
uniqueCovers.push(cover);
|
||||||
|
if (uniqueCovers.length >= 4) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uniqueCovers.length >= 2) {
|
||||||
|
const count = uniqueCovers.length;
|
||||||
|
const itemsClass = count < 4 ? `items-${count}` : '';
|
||||||
|
imageHTML = `
|
||||||
|
<div class="card-image card-collage ${itemsClass}">
|
||||||
|
${uniqueCovers.map(cover => `<img src="${this.api.getCoverUrl(cover, '320')}" alt="" loading="lazy">`).join('')}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
} else if (uniqueCovers.length > 0) {
|
||||||
|
imageHTML = `<img src="${this.api.getCoverUrl(uniqueCovers[0], '320')}" alt="${playlist.name}" class="card-image" loading="lazy">`;
|
||||||
|
} else {
|
||||||
|
imageHTML = `<img src="assets/appicon.png" alt="${playlist.name}" class="card-image" loading="lazy">`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return `
|
return `
|
||||||
<div class="card user-playlist" data-playlist-id="${playlist.id}" data-href="#userplaylist/${playlist.id}" style="cursor: pointer;">
|
<div class="card user-playlist" data-playlist-id="${playlist.id}" data-href="#userplaylist/${playlist.id}" style="cursor: pointer;">
|
||||||
<div class="card-image-wrapper">
|
<div class="card-image-wrapper">
|
||||||
<img src="${playlist.cover || 'assets/appicon.png'}" alt="${playlist.name}" class="card-image" loading="lazy">
|
${imageHTML}
|
||||||
<button class="edit-playlist-btn" data-action="edit-playlist" title="Edit Playlist">
|
<button class="edit-playlist-btn" data-action="edit-playlist" title="Edit Playlist">
|
||||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
|
<path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
|
||||||
|
|
|
||||||
26
styles.css
26
styles.css
|
|
@ -721,6 +721,32 @@ body.has-page-background .track-item:hover {
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.card-collage {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
grid-template-rows: 1fr 1fr;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-collage img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
border-radius: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-collage.items-3 img:first-child {
|
||||||
|
grid-row: span 2;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-collage.items-2 {
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
grid-template-rows: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
.card.artist .card-image {
|
.card.artist .card-image {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue