From 65e942fc9093826870ea879156c78a237c099e0f Mon Sep 17 00:00:00 2001 From: klopez4212 Date: Wed, 1 Jul 2026 12:10:47 +0100 Subject: [PATCH] Align thread summary rows --- .../features/messages/lib/threadTreeLayout.ts | 2 +- .../features/messages/ui/MessageHeader.tsx | 1 + .../messages/ui/MessageThreadPanel.tsx | 2 +- .../messages/ui/MessageThreadSummaryRow.tsx | 37 +++++-- .../messages/ui/TimelineMessageList.tsx | 4 +- desktop/tests/e2e/messaging.spec.ts | 99 +++++++++++++++++++ 6 files changed, 136 insertions(+), 9 deletions(-) diff --git a/desktop/src/features/messages/lib/threadTreeLayout.ts b/desktop/src/features/messages/lib/threadTreeLayout.ts index 4b968ecec..5c802ad84 100644 --- a/desktop/src/features/messages/lib/threadTreeLayout.ts +++ b/desktop/src/features/messages/lib/threadTreeLayout.ts @@ -1,7 +1,7 @@ const THREAD_REPLY_MAX_VISIBLE_DEPTH = 6; const THREAD_REPLY_AVATAR_SIZE_REM = 2.25; // Tailwind size-9 -const THREAD_REPLY_ROW_MARGIN_INLINE_REM = 0.25; // Tailwind mx-1 +export const THREAD_REPLY_ROW_MARGIN_INLINE_REM = 0.25; // Tailwind mx-1 const THREAD_REPLY_ROW_CONTENT_INSET_REM = 0.5; // Tailwind px-2 const THREAD_REPLY_ROW_CONTENT_GAP_REM = 0.625; // Tailwind gap-2.5 const THREAD_REPLY_ROW_PADDING_TOP_REM = 0.375; // Tailwind py-1.5 diff --git a/desktop/src/features/messages/ui/MessageHeader.tsx b/desktop/src/features/messages/ui/MessageHeader.tsx index c9a5f219b..7e54c1ce0 100644 --- a/desktop/src/features/messages/ui/MessageHeader.tsx +++ b/desktop/src/features/messages/ui/MessageHeader.tsx @@ -43,6 +43,7 @@ export function MessageAuthorText({ hoverUnderline && "hover:underline", className, )} + data-testid="message-author" > {children} diff --git a/desktop/src/features/messages/ui/MessageThreadPanel.tsx b/desktop/src/features/messages/ui/MessageThreadPanel.tsx index a146c76ce..2f9e62813 100644 --- a/desktop/src/features/messages/ui/MessageThreadPanel.tsx +++ b/desktop/src/features/messages/ui/MessageThreadPanel.tsx @@ -95,7 +95,7 @@ type MessageThreadPanelProps = { const EMPTY_THREAD_REPLIES: MainTimelineEntry[] = []; const THREAD_PANEL_MESSAGE_GUTTER_CLASS = "px-2"; const THREAD_PANEL_COMPOSER_GUTTER_CLASS = "px-5"; -const THREAD_PANEL_SUMMARY_INDENT_OFFSET_REM = -0.125; +const THREAD_PANEL_SUMMARY_INDENT_OFFSET_REM = 0; type MessageThreadPanelSkeletonProps = { isSinglePanelView?: boolean; layout?: "standalone" | "split"; diff --git a/desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx b/desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx index 63fa07061..4940f8a93 100644 --- a/desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx +++ b/desktop/src/features/messages/ui/MessageThreadSummaryRow.tsx @@ -13,10 +13,15 @@ import { threadReplyLength, THREAD_REPLY_BODY_OFFSET_REM, THREAD_REPLY_LINE_WIDTH_REM, + THREAD_REPLY_ROW_MARGIN_INLINE_REM, } from "@/features/messages/lib/threadTreeLayout"; import { cn } from "@/shared/lib/cn"; import { UserAvatar } from "@/shared/ui/UserAvatar"; +const THREAD_SUMMARY_CONTENT_OFFSET_REM = + THREAD_REPLY_BODY_OFFSET_REM - THREAD_REPLY_ROW_MARGIN_INLINE_REM; +const THREAD_SUMMARY_SURFACE_AVATAR_INSET_REM = 0.25; + function ParticipantAvatar({ participant, index, @@ -80,8 +85,15 @@ export function MessageThreadSummaryRow({ unreadCount?: number; }) { const indentRem = getThreadReplyIndentRem(depth); - const marginLeftRem = - indentRem + THREAD_REPLY_BODY_OFFSET_REM + summaryIndentOffsetRem; + const hoverLeftRem = + indentRem + THREAD_REPLY_ROW_MARGIN_INLINE_REM + summaryIndentOffsetRem; + const hoverLeft = threadReplyLength(hoverLeftRem); + const contentPaddingStart = threadReplyLength( + THREAD_SUMMARY_CONTENT_OFFSET_REM, + ); + const surfaceInsetStart = `calc(${contentPaddingStart} - ${threadReplyLength( + THREAD_SUMMARY_SURFACE_AVATAR_INSET_REM, + )})`; const replyLabel = summary.replyCount === 1 ? "reply" : "replies"; const summaryAriaLabel = summary.lastReplyAt ? `View thread with ${summary.replyCount} ${replyLabel}, last reply ${formatThreadSummaryLastReplyTime(summary.lastReplyAt)}` @@ -198,14 +210,27 @@ export function MessageThreadSummaryRow({