From 819a2757bc5ecd85cbf0d673abdd5b87a42f4b4d Mon Sep 17 00:00:00 2001 From: KeelrLeek <156356974+KeelrLeek@users.noreply.github.com> Date: Tue, 4 Aug 2026 14:43:52 -0500 Subject: [PATCH] artist page: five sections after the hero, and nothing moved to fit them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Latest release, Releases by year, Fans also like, In your library and About slot into the page between what is already there — hero, Popular, Discography grid and all — and CatalogArtist gains three lines: an import and two placements. They live in ArtistExtras so Svelte scopes their styles away from this file, which matters more than usual here: both files name a .hero-bg and a .card, for completely different things. Every section is fed by a call the app already makes. catalog_related is Deezer's related-artists field, literally commented "Fans also like" and simply never rendered on this page; the bio and profile calls already run; latest and the timeline come out of page.albums. Nothing here needs a provider that did not exist before. Latest release is CatalogSearch's top-result hero — the app's only surface for presenting one item prominently — with min-height 0 (there is no stat row to hold space for) and a 6px artwork radius so it rounds like a record; it tints from its OWN cover, scoped, so it never wears the playing track's colour. Fans also like reuses this page's .grid/.release markup, so its columns are the same 150px tracks as the discography above it, drifting 0px on all six. The release grid's min-height reserve had to learn about them. That reserve is the tab-pinning contract — everything under the pinned tab bar must span a pane-height — and when the grid was the last thing on the page the grid had to supply all of it. It is not last any more, so both reserves now discount the real content below it: without that the grid stood on 206px of empty min-height under its final card, a hole nobody could see until something rendered after it. The discount is parent-bottom minus grid-bottom, which is invariant to the grid's own min-height because both edges move with it, so the reserve converges instead of chasing its own write; when nothing follows the grid it is 0 and the figure is exactly the old one. The grid's parent joins the ResizeObserver, because the sections land asynchronously and grow it without touching the grid's box or the pane's. An earlier attempt pulled the sections up by a measured slack instead. The grid reflowed after the measurement and they landed on top of the release cards. Reverted: prefer a fix that can only be a few px wrong over one that can be catastrophically wrong. Verified: expander open and close leaves scrollTop at 1571, and the tab bar sits at 231 across switches. --- src/components/ArtistExtras.svelte | 821 +++++++++++++++++++++++++++++ src/views/CatalogArtist.svelte | 78 ++- 2 files changed, 894 insertions(+), 5 deletions(-) create mode 100644 src/components/ArtistExtras.svelte diff --git a/src/components/ArtistExtras.svelte b/src/components/ArtistExtras.svelte new file mode 100644 index 0000000..8f8ab79 --- /dev/null +++ b/src/components/ArtistExtras.svelte @@ -0,0 +1,821 @@ + + +{#if artist} + {#if part === "latest"} + {#if latest} + +

Latest release

+
+
+
+
+
+ +
+
+ Latest · {(latest.record_type ?? "album").toUpperCase()} +
+
{latest.title}
+
+ {year(latest)} + {#if latest.track_count} + · + {latest.track_count} tracks + {/if} +
+
+ + +
+
+
+
+ {/if} + {:else} +
+ {#if timeline} +
+

Releases by year

+ + {timeline.last - timeline.first + 1} years · {timeline.total} releases + +
+
+ {#each timeline.cols as c (c.year)} +
+ + {String(c.year).slice(2)} +
+ {/each} +
+ {/if} + + {#if related.length} +

Fans also like

+
+ {#each related as a (a.id)} + + {/each} +
+ {/if} + + {#if owned.length} +

In your library

+
+ {#each owned as o (o.album.id)} + + {/each} +
+ {/if} + + {#if bio || profile?.listeners || profile?.tags?.length} +

About

+
+ {#if profile?.listeners || profile?.plays} +
+ {#if profile.listeners} + {fmt(profile.listeners)}listeners + {/if} + {#if profile.plays} + {fmt(profile.plays)}plays + {/if} +
+ {/if} + {#if bio}

{bio}

{/if} + {#if profile?.tags?.length} +
+ {#each profile.tags as t (t)}{t}{/each} +
+ {/if} +
+ {/if} + + + +
+ {/if} +{/if} + + diff --git a/src/views/CatalogArtist.svelte b/src/views/CatalogArtist.svelte index cf4de75..57dceb8 100644 --- a/src/views/CatalogArtist.svelte +++ b/src/views/CatalogArtist.svelte @@ -1,5 +1,6 @@