UI polish: centering, search width, dropdown contrast, cover thumbnails, branding, sticky headers

- Constrain main content to max-w-5xl centered
- Widen search input (w-72 md:w-80 lg:w-96)
- Search dropdown: card with shadow, border, and primary-tinted hover
- Branding: SVG music note icon + gradient text + tagline
- Covers: 64px with front-250 thumbnail URL for faster loading
- Badge colors per type (primary/secondary/accent/ghost)
- Sticky table headers via table-pin-rows
- SVG icons for Add/Remove/RSS/OPML buttons
- Consistent hover transitions across tables
This commit is contained in:
2026-07-03 10:58:44 +02:00
parent 0bae5fd288
commit 16f23557f0
6 changed files with 126 additions and 71 deletions
@@ -1,80 +1,84 @@
<div id="artist-list" hx-swap-oob="true">
{#if artists.isEmpty()}
<div class="card bg-base-100 shadow-xl p-8 text-center">
<p class="text-lg text-base-content/60">No artists tracked yet</p>
<p class="text-sm text-base-content/40 mt-2">Search for artists using the search bar above and click "+ Add"</p>
<div class="card bg-base-100 shadow-xl p-10 text-center border border-base-300">
<svg class="w-12 h-12 mx-auto text-base-content/20 mb-3" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/>
</svg>
<p class="text-lg font-medium text-base-content/60">No artists tracked yet</p>
<p class="text-sm text-base-content/40 mt-1">Search for artists using the search bar above and click <span class="font-semibold text-primary">+ Add</span></p>
</div>
{#else}
<div class="overflow-x-auto">
<table class="table table-zebra">
<div class="overflow-x-auto rounded-box border border-base-300">
<table class="table table-pin-rows">
<thead>
<tr>
<tr class="bg-base-200/80">
<th>Artist</th>
<th>Since</th>
<th>Release Types</th>
<th>Actions</th>
<th class="w-24">Actions</th>
</tr>
</thead>
<tbody>
{#for artist in artists}
<tr>
<tr class="hover:bg-base-200/50 transition-colors">
<td>
<div class="font-medium">{artist.name}</div>
{#if artist.disambiguation}
<div class="text-xs text-base-content/60">{artist.disambiguation}</div>
<div class="text-xs text-base-content/50">{artist.disambiguation}</div>
{/if}
</td>
<td class="text-sm text-base-content/60">{artist.createdAt}</td>
<td class="text-sm text-base-content/50">{artist.createdAt}</td>
<td>
<div class="flex flex-wrap gap-1">
<label class="label cursor-pointer gap-1">
<div class="flex flex-wrap gap-1.5">
<label class="label cursor-pointer gap-1.5 p-1">
<input type="checkbox" class="checkbox checkbox-xs checkbox-primary"
{#if artist.albumMonitored}checked{/if}
hx-patch="/api/artists/{artist.mbid}/monitor?type=album"
hx-target="#artist-list"
hx-swap="innerHTML">
<span class="label-text text-xs">Album</span>
<span class="label-text text-xs font-medium text-primary">Album</span>
</label>
<label class="label cursor-pointer gap-1">
<input type="checkbox" class="checkbox checkbox-xs"
<label class="label cursor-pointer gap-1.5 p-1">
<input type="checkbox" class="checkbox checkbox-xs checkbox-secondary"
{#if artist.singleMonitored}checked{/if}
hx-patch="/api/artists/{artist.mbid}/monitor?type=single"
hx-target="#artist-list"
hx-swap="innerHTML">
<span class="label-text text-xs">Single</span>
<span class="label-text text-xs font-medium text-secondary">Single</span>
</label>
<label class="label cursor-pointer gap-1">
<input type="checkbox" class="checkbox checkbox-xs"
<label class="label cursor-pointer gap-1.5 p-1">
<input type="checkbox" class="checkbox checkbox-xs checkbox-accent"
{#if artist.epMonitored}checked{/if}
hx-patch="/api/artists/{artist.mbid}/monitor?type=ep"
hx-target="#artist-list"
hx-swap="innerHTML">
<span class="label-text text-xs">EP</span>
<span class="label-text text-xs font-medium text-accent">EP</span>
</label>
<label class="label cursor-pointer gap-1">
<label class="label cursor-pointer gap-1.5 p-1">
<input type="checkbox" class="checkbox checkbox-xs"
{#if artist.broadcastMonitored}checked{/if}
hx-patch="/api/artists/{artist.mbid}/monitor?type=broadcast"
hx-target="#artist-list"
hx-swap="innerHTML">
<span class="label-text text-xs">Broadcast</span>
<span class="label-text text-xs text-base-content/60">Broadcast</span>
</label>
<label class="label cursor-pointer gap-1">
<label class="label cursor-pointer gap-1.5 p-1">
<input type="checkbox" class="checkbox checkbox-xs"
{#if artist.otherMonitored}checked{/if}
hx-patch="/api/artists/{artist.mbid}/monitor?type=other"
hx-target="#artist-list"
hx-swap="innerHTML">
<span class="label-text text-xs">Other</span>
<span class="label-text text-xs text-base-content/60">Other</span>
</label>
</div>
</td>
<td>
<button class="btn btn-error btn-xs"
<button class="btn btn-ghost btn-xs text-error hover:bg-error/10"
hx-delete="/api/artists/{artist.mbid}"
hx-target="#artist-list"
hx-swap="innerHTML"
onclick="return confirm('Remove {artist.name}?')">
<svg class="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg>
Remove
</button>
</td>