feat: replace /archive with release-cardinal searchable browser (Phase 9 §8.H)

Retire the three-card overview for a search + medium + genre browser over all
releases. Adds q/genre filter params to the api/release paged read path,
mirroring the existing api/track/page TrackFilter pattern.
This commit is contained in:
daniel-c-harvey
2026-06-13 20:47:50 -04:00
parent 18f4b596f2
commit 737c423d9c
13 changed files with 607 additions and 59 deletions
@@ -2,11 +2,30 @@
padding-top: 16px;
}
.archive-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 2rem;
margin-top: 1rem;
.archive-search-row {
display: flex;
justify-content: flex-start;
padding: 0 0 12px 0;
}
/* archive-search-field rides on MudTextField, whose root is a child Razor component element.
Blazor isolation does not stamp the scope attribute there, so ::deep is required. */
::deep .archive-search-field {
max-width: 420px;
width: 100%;
}
.archive-filter-row {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
padding: 0 0 12px 0;
}
.archive-card-center {
display: flex;
justify-content: center;
width: 100%;
}
.archive-card-link {
@@ -14,35 +33,51 @@
color: inherit;
}
.archive-card {
.archive-release-card {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 0.75rem;
padding: 2.5rem 1.5rem;
border: 1px solid var(--mud-palette-lines-default);
width: 200px;
cursor: pointer;
border-radius: 8px;
background-color: var(--mud-palette-surface);
transition: transform 120ms ease, box-shadow 120ms ease;
overflow: hidden;
transition: transform 120ms ease;
}
.archive-card:hover {
.archive-release-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 28px color-mix(in srgb, var(--mud-palette-text-secondary) 18%, transparent);
}
/* archive-card-icon rides on MudIcon (child Razor component); ::deep pierces its output. */
::deep .archive-card-icon {
font-size: 56px;
color: var(--mud-palette-primary);
.archive-release-cover {
width: 200px;
height: 200px;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
/* archive-card-title / archive-card-blurb ride on MudText (child Razor component). */
::deep .archive-card-title {
.archive-release-cover--fallback {
background-color: var(--mud-palette-dark, #1a2238);
}
.archive-release-body {
padding: 8px 4px 0 4px;
display: flex;
flex-direction: column;
gap: 2px;
}
/* archive-release-title / archive-release-artist ride on MudText (child Razor component); ::deep
pierces into its output since Blazor isolation does not scope-stamp child component roots. */
::deep .archive-release-title {
font-weight: 600;
}
::deep .archive-card-blurb {
::deep .archive-release-artist {
opacity: 0.7;
}
.archive-empty {
display: flex;
justify-content: center;
padding: 48px 0;
}