feat(ui): sequential playlist track numbering and banner panel

This commit is contained in:
2025-10-03 20:12:03 -04:00
parent 6fff93fe45
commit a7fc6e8d5d
3 changed files with 42 additions and 6 deletions

View File

@@ -11,6 +11,7 @@
selectedTrackIndex?: number | null; selectedTrackIndex?: number | null;
onTrackClick?: (index: number) => void; onTrackClick?: (index: number) => void;
showAlbumColumn?: boolean; showAlbumColumn?: boolean;
useSequentialNumbers?: boolean;
} }
let { let {
@@ -21,7 +22,8 @@
tracks, tracks,
selectedTrackIndex = null, selectedTrackIndex = null,
onTrackClick, onTrackClick,
showAlbumColumn = false showAlbumColumn = false,
useSequentialNumbers = false
}: Props = $props(); }: Props = $props();
function getThumbnailUrl(coverPath?: string): string { function getThumbnailUrl(coverPath?: string): string {
@@ -100,7 +102,7 @@
onclick={() => handleTrackClick(i)} onclick={() => handleTrackClick(i)}
> >
<td class="track-number"> <td class="track-number">
{track.metadata.trackNumber ?? i + 1} {useSequentialNumbers ? i + 1 : (track.metadata.trackNumber ?? i + 1)}
</td> </td>
<td>{track.metadata.title ?? '—'}</td> <td>{track.metadata.title ?? '—'}</td>
{#if showAlbumColumn} {#if showAlbumColumn}
@@ -206,6 +208,13 @@
width: 100%; width: 100%;
} }
thead {
position: sticky;
top: 0;
z-index: 1;
background: #121212;
}
th { th {
text-align: left; text-align: left;
} }

View File

@@ -12,6 +12,7 @@
let playlists = $state<Playlist[]>([]); let playlists = $state<Playlist[]>([]);
let playlistsLoadTimestamp = $state<number>(0); let playlistsLoadTimestamp = $state<number>(0);
let showBanner = $state(false);
// Count active downloads (queued or downloading) // Count active downloads (queued or downloading)
let activeDownloads = $derived( let activeDownloads = $derived(
@@ -149,9 +150,17 @@
</nav> </nav>
</aside> </aside>
<main class="content-area sunken-panel"> <div class="right-column">
{@render children?.()} <main class="content-area sunken-panel">
</main> {@render children?.()}
</main>
{#if showBanner}
<div class="banner-panel sunken-panel">
Banner content here
</div>
{/if}
</div>
</div> </div>
<div class="status-text">Ready</div> <div class="status-text">Ready</div>
@@ -230,15 +239,32 @@
padding-left: 8px; padding-left: 8px;
} }
.content-area { .right-column {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
display: flex;
flex-direction: column;
gap: 8px;
}
.content-area {
flex: 1;
min-height: 0;
overflow-y: auto; overflow-y: auto;
padding: 0; padding: 0;
font-family: "Pixelated MS Sans Serif", Arial; font-family: "Pixelated MS Sans Serif", Arial;
background: #121212; background: #121212;
} }
.banner-panel {
flex-shrink: 0;
height: 120px;
padding: 8px;
font-family: "Pixelated MS Sans Serif", Arial;
background: #121212;
overflow: hidden;
}
.status-text { .status-text {
padding: 6px 8px 10px 10px; padding: 6px 8px 10px 10px;
font-family: "Pixelated MS Sans Serif", Arial; font-family: "Pixelated MS Sans Serif", Arial;

View File

@@ -94,6 +94,7 @@
{selectedTrackIndex} {selectedTrackIndex}
onTrackClick={handleTrackClick} onTrackClick={handleTrackClick}
showAlbumColumn={true} showAlbumColumn={true}
useSequentialNumbers={true}
/> />
{/if} {/if}
</div> </div>