From 50c73f570a6bf55cc44fc38eedd830bf37155d95 Mon Sep 17 00:00:00 2001 From: needs <624097+needs@users.noreply.github.com> Date: Fri, 21 Aug 2026 02:58:49 +0200 Subject: [PATCH] Keep header text off the activity calendar The five headers overlaying a title on the calendar used a fixed w-1/2 gradient, so any content wider than half the header - dividers, playtime, last seen, long server names - landed unreadable on the cells. Extract a shared ActivityHeader whose overlay is sized to its content and fades from opaque white through 85% to transparent, and drop the calendar below md where the title alone needs the full width. Co-Authored-By: Claude Opus 5 (1M context) --- apps/frontend/app/clan/[clanName]/layout.tsx | 38 +++++---- .../[gameTypeName]/(lists)/layout.tsx | 18 ++--- .../[gameTypeName]/map/[mapName]/layout.tsx | 34 ++++---- .../app/player/[playerName]/layout.tsx | 72 ++++++++--------- apps/frontend/app/server/[ip]/[port]/page.tsx | 80 +++++++++---------- apps/frontend/components/ActivityHeader.tsx | 31 +++++++ 6 files changed, 147 insertions(+), 126 deletions(-) create mode 100644 apps/frontend/components/ActivityHeader.tsx diff --git a/apps/frontend/app/clan/[clanName]/layout.tsx b/apps/frontend/app/clan/[clanName]/layout.tsx index 579aa2b..7352880 100644 --- a/apps/frontend/app/clan/[clanName]/layout.tsx +++ b/apps/frontend/app/clan/[clanName]/layout.tsx @@ -6,7 +6,7 @@ import { z } from 'zod'; import { formatPlayTime } from '../../../utils/format'; import { encodeString } from '../../../utils/encoding'; import { ClanPlayerCount } from './ClanPlayerCount'; -import { ActivityCalendarSection } from '../../../components/ActivityCalendarSection'; +import { ActivityHeader } from '../../../components/ActivityHeader'; import { getClanActivity } from '../../../utils/activity'; export default async function Index({ @@ -58,26 +58,24 @@ export default async function Index({ return (
-
- -
-

{clan.name}

-
- - - - - Playtime: {formatPlayTime(clan.playTime)} - -
+ +

{clan.name}

+
+ + + + + Playtime: {formatPlayTime(clan.playTime)} +
-
+
-
- -
-

{gameTypeName}

-
-
+ +

{gameTypeName}

+
-
- -
-

{mapName}

- - - {gameTypeName} - - -
-
+ +

{mapName}

+ + + {gameTypeName} + + +
-
- -
- Player -
-

{player.name}

-
- {player.clanName !== null && ( - - - {player.clanName} - - - )} - - Playtime: {formatPlayTime(player.playTime)} + + Player +
+

{player.name}

+
+ {player.clanName !== null && ( + + + {player.clanName} + - - client.gameServerState.gameServer) - .filter((gameServer) => gameServer !== null)} - lastSeenAt={player.lastSeenAt} - /> - -
-
-
-
+ )} + + Playtime: {formatPlayTime(player.playTime)} + + + client.gameServerState.gameServer) + .filter((gameServer) => gameServer !== null)} + lastSeenAt={player.lastSeenAt} + /> + +
+ +
-
- -
-

- {gameServer.gameServerState.name} -

-
- - - {gameServer.gameServerState.map.gameTypeName} - - - - - {gameServer.gameServerState.map.name} - - - {`${gameServer.gameServerState.numClients} / ${gameServer.gameServerState.maxClients} clients`} - - Playtime: {formatPlayTime(gameServer.playTime)} - -
+ +

+ {gameServer.gameServerState.name} +

+
+ + + {gameServer.gameServerState.map.gameTypeName} + + + + + {gameServer.gameServerState.map.name} + + + {`${gameServer.gameServerState.numClients} / ${gameServer.gameServerState.maxClients} clients`} + + Playtime: {formatPlayTime(gameServer.playTime)} +
-
+
+
+ +
+ +
+
+ {children} +
+
+
+
+ ); +}