From 219a388d725406b0fca5cc62af1eebc195b1fe20 Mon Sep 17 00:00:00 2001 From: Mattias Tall Date: Tue, 26 May 2026 10:58:31 +0200 Subject: [PATCH] Channel page: overlay avatar/name/buttons on banner Name, subscriber count, and action buttons sit at the bottom of the banner with a gradient overlay. Falls back to a plain dark header when no banner is available. Description moves below the header. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/pages/Channel.jsx | 77 +++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/frontend/src/pages/Channel.jsx b/frontend/src/pages/Channel.jsx index bbb5c40..d9f09a8 100644 --- a/frontend/src/pages/Channel.jsx +++ b/frontend/src/pages/Channel.jsx @@ -79,39 +79,42 @@ export default function ChannelPage() { return (
- {/* Banner */} - {channel.banner_url && ( -
- -
- )} - - {/* Channel header */} -
- {channel.thumbnail_url ? ( - {channel.name} - ) : ( -
- {channel.name?.[0]?.toUpperCase()} -
+ {/* Channel header — banner with overlay, or plain if no banner */} +
+ {channel.banner_url && ( + )} -
-

{channel.name}

-

- {[ - formatSubs(channel.subscriber_count) && `${formatSubs(channel.subscriber_count)} subscribers`, - `${channel.video_count} videos indexed`, - ].filter(Boolean).join(" · ")} -

- {channel.description && ( -

{channel.description}

+ {/* Gradient overlay */} +
+ + {/* Info row sits at the bottom of the banner */} +
+ {/* Avatar */} + {channel.thumbnail_url ? ( + {channel.name} + ) : ( +
+ {channel.name?.[0]?.toUpperCase()} +
)} -
-
+ + {/* Name + meta */} +
+

{channel.name}

+

+ {[ + formatSubs(channel.subscriber_count) && `${formatSubs(channel.subscriber_count)} subscribers`, + `${channel.video_count} videos indexed`, + ].filter(Boolean).join(" · ")} +

+
+ + {/* Action buttons */} +
{dlResult != null && ( {dlResult === 0 ? "Already up to date" : `${dlResult} queued`} @@ -127,7 +130,7 @@ export default function ChannelPage() { @@ -136,15 +139,21 @@ export default function ChannelPage() { disabled={followMut.isPending} className={`text-sm font-medium px-4 py-2 rounded-lg transition-colors ${ isFollowed - ? "bg-zinc-700 text-zinc-300 hover:bg-zinc-600" - : "bg-zinc-800 text-zinc-300 hover:bg-zinc-700" + ? "bg-zinc-700/80 text-zinc-300 hover:bg-zinc-600" + : "bg-zinc-800/80 text-zinc-300 hover:bg-zinc-700" }`} > {isFollowed ? "Following" : "Follow"}
+
+ {/* Description below banner */} + {channel.description && ( +

{channel.description}

+ )} + {/* Video grid */} {loadingVideos ? (