From c8c124506b9457e4907f6fc005d5390cd4aea84e Mon Sep 17 00:00:00 2001 From: Thomas Petersen Date: Tue, 7 Apr 2026 10:05:44 +0200 Subject: [PATCH] desktop: polish chat timeline, header, and channel layout - Subtler day dividers and compact date headings; remove chat header border - Reposition scroll-to-latest above composer with muted outline style - Channel pane/screen layout and related sheet/sidebar tweaks Made-with: Cursor --- .../channels/ui/ChannelManagementSheet.tsx | 2 +- .../src/features/channels/ui/ChannelPane.tsx | 92 +++++----- .../features/channels/ui/ChannelScreen.tsx | 167 +++++++++--------- .../features/channels/ui/MembersSidebar.tsx | 2 +- desktop/src/features/chat/ui/ChatHeader.tsx | 2 +- .../features/messages/lib/dateFormatters.ts | 15 +- .../src/features/messages/ui/DayDivider.tsx | 8 +- .../features/messages/ui/MessageComposer.tsx | 4 +- .../features/messages/ui/MessageTimeline.tsx | 17 +- .../messages/ui/TypingIndicatorRow.tsx | 2 +- .../src/features/settings/ui/SettingsView.tsx | 2 +- .../workflows/ui/WorkflowDetailPanel.tsx | 2 +- desktop/src/shared/ui/sheet.tsx | 4 +- desktop/src/shared/ui/sidebar.tsx | 2 +- 14 files changed, 164 insertions(+), 157 deletions(-) diff --git a/desktop/src/features/channels/ui/ChannelManagementSheet.tsx b/desktop/src/features/channels/ui/ChannelManagementSheet.tsx index 8ec47403f..4f47b94e3 100644 --- a/desktop/src/features/channels/ui/ChannelManagementSheet.tsx +++ b/desktop/src/features/channels/ui/ChannelManagementSheet.tsx @@ -210,7 +210,7 @@ export function ChannelManagementSheet({ return ( diff --git a/desktop/src/features/channels/ui/ChannelPane.tsx b/desktop/src/features/channels/ui/ChannelPane.tsx index 62550c90a..f66df98f7 100644 --- a/desktop/src/features/channels/ui/ChannelPane.tsx +++ b/desktop/src/features/channels/ui/ChannelPane.tsx @@ -71,7 +71,7 @@ export const ChannelPane = React.memo(function ChannelPane({ typingPubkeys, }: ChannelPaneProps) { return ( - <> +
- - - +
+ + +
+
); }); diff --git a/desktop/src/features/channels/ui/ChannelScreen.tsx b/desktop/src/features/channels/ui/ChannelScreen.tsx index 678822c6d..59257e568 100644 --- a/desktop/src/features/channels/ui/ChannelScreen.tsx +++ b/desktop/src/features/channels/ui/ChannelScreen.tsx @@ -343,92 +343,95 @@ export function ChannelScreen({ return ( <> - setIsMembersSidebarOpen((prev) => !prev)} - /> - ) : null - } - channelType={activeChannel?.channelType} - visibility={activeChannel?.visibility} - description={channelDescription} - statusBadge={ - activeChannel?.channelType === "dm" && activeDmPresenceStatus ? ( - - ) : null - } - title={activeChannelTitle} - /> - -
- {activeChannel ? ( - activeChannel.channelType === "forum" ? ( - } - > - + setIsMembersSidebarOpen((prev) => !prev)} /> - + ) : null + } + channelType={activeChannel?.channelType} + visibility={activeChannel?.visibility} + description={channelDescription} + statusBadge={ + activeChannel?.channelType === "dm" && activeDmPresenceStatus ? ( + + ) : null + } + title={activeChannelTitle} + /> + +
+ {activeChannel ? ( + activeChannel.channelType === "forum" ? ( + } + > + + + ) : ( + } + > + + + ) ) : ( - } - > - - - ) - ) : ( -
-

- Select a channel to view messages. -

-
- )} +
+

+ Select a channel to view messages. +

+
+ )} +
diff --git a/desktop/src/features/chat/ui/ChatHeader.tsx b/desktop/src/features/chat/ui/ChatHeader.tsx index affdeca2c..ef17c0143 100644 --- a/desktop/src/features/chat/ui/ChatHeader.tsx +++ b/desktop/src/features/chat/ui/ChatHeader.tsx @@ -60,7 +60,7 @@ export function ChatHeader({ }: ChatHeaderProps) { return (
diff --git a/desktop/src/features/messages/lib/dateFormatters.ts b/desktop/src/features/messages/lib/dateFormatters.ts index ee14df78d..5064f9dfd 100644 --- a/desktop/src/features/messages/lib/dateFormatters.ts +++ b/desktop/src/features/messages/lib/dateFormatters.ts @@ -5,7 +5,7 @@ * - `formatFullDateTime` — verbose string for tooltips * ("Wednesday, April 2, 2026 at 2:34 PM"). * - `formatDayHeading` — label for day dividers / sticky headers. - * Returns "Today", "Yesterday", or a date like "Monday, March 31, 2026". + * Returns "Today", "Yesterday", or a compact date like "Sat, Mar 21, 2026". * - `isSameDay` — compare two unix-second timestamps. */ @@ -23,11 +23,12 @@ const FULL_DATE_TIME_FORMATTER = new Intl.DateTimeFormat("en-US", { minute: "2-digit", }); -const DAY_HEADING_FORMATTER = new Intl.DateTimeFormat("en-US", { - weekday: "long", - year: "numeric", - month: "long", +/** Compact calendar line for dividers (not Today/Yesterday). */ +const DAY_HEADING_COMPACT = new Intl.DateTimeFormat("en-US", { + weekday: "short", + month: "short", day: "numeric", + year: "numeric", }); /** Short clock time, e.g. "2:34 PM". */ @@ -42,7 +43,7 @@ export function formatFullDateTime(unixSeconds: number): string { /** * Human-friendly day label for dividers and sticky headers. - * Returns "Today", "Yesterday", or a full date like "Monday, March 31, 2026". + * Returns "Today", "Yesterday", or a short date like "Sat, Mar 21, 2026". */ export function formatDayHeading(unixSeconds: number): string { const date = new Date(unixSeconds * 1_000); @@ -58,7 +59,7 @@ export function formatDayHeading(unixSeconds: number): string { return "Yesterday"; } - return DAY_HEADING_FORMATTER.format(date); + return DAY_HEADING_COMPACT.format(date); } /** True when two unix-second timestamps fall on the same calendar day (local time). */ diff --git a/desktop/src/features/messages/ui/DayDivider.tsx b/desktop/src/features/messages/ui/DayDivider.tsx index 93a03cf21..8ab994eb7 100644 --- a/desktop/src/features/messages/ui/DayDivider.tsx +++ b/desktop/src/features/messages/ui/DayDivider.tsx @@ -4,15 +4,15 @@ export function DayDivider({ label }: { label: string }) { return (
- -

+ +

{label}

- +
); } diff --git a/desktop/src/features/messages/ui/MessageComposer.tsx b/desktop/src/features/messages/ui/MessageComposer.tsx index 6aff994a4..9fda205b1 100644 --- a/desktop/src/features/messages/ui/MessageComposer.tsx +++ b/desktop/src/features/messages/ui/MessageComposer.tsx @@ -493,10 +493,10 @@ export function MessageComposer({ }, [media.handlePaperclip]); return ( -