{#if catalog.artistLoading && !page} {#if resolver.active}

● {resolver.label} — finding the best source…

{:else if resolver.error}

{resolver.error}

{/if}

Loading artist…

{:else if !page} {#if resolver.error}

{resolver.error}

{/if}

{catalog.error || "Artist not found."}

{:else}
{#if page.artist.name}

{page.artist.name}

{:else}
{/if} {#if logo.mode === "mask"}
{:else if logo.mode === "color"}
{/if}
{#if popularTracks.length}
{#if !page.art_preview}
{#if releasedCount > 0} {releasedCount} releases {/if} {#if page.artist.fans} {fmtFans(page.artist.fans)} {/if} {#if activeYears} {activeYears} {/if} {#if libraryOwnedCount > 0 && releasedCount > 0} {libraryOwnedCount}/{releasedCount} {/if} {#if artistDisk.bytes > 0} {fmtBytes(artistDisk.bytes)} {#if artistDisk.perAlbum.length} {#each artistDisk.perAlbum as row (row.title)} {row.title} {fmtBytes(row.bytes)} {/each} {/if} {/if} {#if artistDisk.quality} {artistDisk.quality} {/if} {#if playStats.seconds >= 60} {fmtPlayTime(playStats.seconds)} {/if} {#if playStats.last} {fmtLastPlayed(playStats.last)} {/if} {#if playStats.topTitle && playStats.topCount >= 2} {playStats.topTitle} · {playStats.topCount}× {/if} {#if page.top_genre} {page.top_genre} {/if} {#if page.socials?.length} {#each page.socials as link (link.kind)} {@const meta = SOCIAL_META[link.kind] ?? SOCIAL_META.website} {/each} {/if}
{/if}
{/if}
{#if resolver.active} ● {resolver.label} — finding the best source… {:else if resolver.error} {resolver.error} {/if}
{#if heroNotice} {heroNotice} {/if} {#if page.banner_custom} {/if}
{#if page.partial_error}

{page.partial_error}

{:else if page.art_preview}

● {page.albums.length || popularTracks.length ? "Refining release details…" : "Loading songs and releases…"}

{/if} {#if page.art_preview && !popularTracks.length && !page.albums.length}
{#each [0, 1, 2, 3, 4] as row (row)}
{/each}
{#each [0, 1, 2, 3, 4] as card (card)} {/each}
{/if} {#if popularTracks.length} {/if} {#if tabs.length}

Discography

{#each tabs as tab (tab.key)} {/each}
{/if} {#each visibleTabs as group (group.key)}
{#each group.items as al, cardIndex (al.familyKey)}
toggleExpander(al)} onkeydown={(e) => e.key === "Enter" && toggleExpander(al)} onmouseenter={() => { queueCardAccent(al.cover, true); queueDescPrefetch(al); }} onmouseleave={cancelDescPrefetch} >
{#if familyNowPlaying(al)} Playing {/if} {#if al.editions.length > 1} {al.editions.length} {/if} {#if al.cover && !artBroken[al.cover]}
{#if tinyCover(al.cover)} {/if} handleCoverError(event.currentTarget, al.cover, al.title)} />
{:else}
{/if} {#if group.key !== "upcoming"} {/if}
{al.title} {#if familyInLibrary(al)}{/if}
{group.key === "upcoming" ? upcomingDate(al) : year(al)}{al.track_count ? ` · ${al.track_count} tracks` : ""}
{#if expanderIndex(group) === cardIndex}
{#key openFamilyKey}
{#if previousRailArtAlbum?.cover && !artBroken[previousRailArtAlbum.cover]} {/if} {#key railArtTransitionKey} {#if railArtAlbum?.cover && !artBroken[railArtAlbum.cover]} {/if} {/key}
{#if previousRailArtAlbum?.cover && !artBroken[previousRailArtAlbum.cover]} {/if} {#key railArtTransitionKey} {#if railArtAlbum?.cover && !artBroken[railArtAlbum.cover]} handleCoverError(event.currentTarget, railArtAlbum.cover, railArtAlbum.title)} /> {:else}
{/if} {/key}

{openAlbum?.title ?? openFamily?.baseTitle ?? ""}

{group.key === "upcoming" ? upcomingDate(openAlbum ?? openFamily) : fullDate(openAlbum ?? openFamily)}{openTracks.length ? ` · ${openTracks.length} tracks` : openAlbum?.track_count ? ` · ${openAlbum.track_count} tracks` : ""}{fmtRuntime(openTracks) ? ` · ${fmtRuntime(openTracks)}` : ""}{openFamily && familyInLibrary(openFamily) ? " · in your library" : ""}

{#if !openReleaseLocked}
{/if} {#if openInfo?.description}

{openInfo.description}

{/if} {#if openFamily && openFamily.editions.length > 1}
Editions {#each openFamily.editions as edition (edition.id)} {/each}
{/if}
{#if openLoading}

Loading tracks…

{:else} {#each openDiscs as d (d.disc)} {#if multiDisc}
Disc {d.disc} · {d.tracks.length} tracks
{/if} {#each d.tracks as t (t.id)} {@const locked = t.unreleased} {@const playTrack = () => { if (locked) return; streamSong(page.artist.name, t.title, { cover: t.cover ?? openAlbum?.cover, trackId: t.id, albumId: openAlbumId, album: openAlbum?.title || null, expectSecs: t.duration_secs ?? null, }); }}
e.key === "Enter" && playTrack()} > {nowPlaying("trackId", t.id) ? "♫" : (t.track_no ?? "·")} {t.title} {#if libraryTicks.has(norm(t.title || ""))}{/if} {#if locked} Unreleased {:else} {fmtDuration(t.duration_secs)} {/if} {#if !locked} {/if}
{/each} {/each} {/if}
{/key}
{/if} {/each}
{/each}
{/if}