From 197343f0a9a870ffb6d52f9196ddb21707eb099f Mon Sep 17 00:00:00 2001 From: Pixel Perfect Date: Mon, 26 Oct 2026 15:23:41 -0700 Subject: [PATCH 1/2] fix(mobile): keep thread title rows evenly sized and aligned --- .../features/threads/thread-list-v2-items.tsx | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/apps/mobile/src/features/threads/thread-list-v2-items.tsx b/apps/mobile/src/features/threads/thread-list-v2-items.tsx index 6c270a0144ccf..af88e97b06601 100644 --- a/apps/mobile/src/features/threads/thread-list-v2-items.tsx +++ b/apps/mobile/src/features/threads/thread-list-v2-items.tsx @@ -69,8 +69,6 @@ import { PullRequestGlyph } from "../pull-requests/pullRequestGlyphs"; import { pullRequestStatus } from "../pull-requests/pullRequestStatus"; const TITLE_FAVICON_SIZE = 15; -// Centers the favicon on the first line of the text-base title. -const TITLE_FAVICON_OFFSET = 4; // Lines below the title start where the title text does. const TITLE_TEXT_INSET = TITLE_FAVICON_SIZE + 8; @@ -1004,18 +1002,16 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { const titleTextInset = props.project ? TITLE_TEXT_INSET : 0; const cardContent = ( <> - + {props.project ? ( - - - + ) : null} {thread.title} - + {props.hasQueuedMessages ? : null} {pinnedRow ? ( ) : ( - + + {" "} + )} {pr ? ( Date: Mon, 26 Oct 2026 17:58:35 -0700 Subject: [PATCH 2/2] fix(mobile): scale leading icons with app and system text --- .../features/threads/thread-list-v2-items.tsx | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/apps/mobile/src/features/threads/thread-list-v2-items.tsx b/apps/mobile/src/features/threads/thread-list-v2-items.tsx index af88e97b06601..8d3fee6ce0a06 100644 --- a/apps/mobile/src/features/threads/thread-list-v2-items.tsx +++ b/apps/mobile/src/features/threads/thread-list-v2-items.tsx @@ -65,13 +65,10 @@ import { import { QueuedMessageIcon } from "./queued-message-icon"; import { shouldRecedeThreadRow } from "./thread-row-emphasis"; import { ThreadSearchMatchExcerpt } from "./thread-search-match"; +import { useScaledTextRole } from "../settings/appearance/useScaledTextRole"; import { PullRequestGlyph } from "../pull-requests/pullRequestGlyphs"; import { pullRequestStatus } from "../pull-requests/pullRequestStatus"; -const TITLE_FAVICON_SIZE = 15; -// Lines below the title start where the title text does. -const TITLE_TEXT_INSET = TITLE_FAVICON_SIZE + 8; - interface StatusLabel { readonly label: string; readonly icon: AppSymbolName; @@ -600,7 +597,12 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { readonly searchQuery?: string; readonly simultaneousSwipeGesture?: ComponentProps["simultaneousWith"]; }) { - const { width: windowWidth } = useWindowDimensions(); + const { width: windowWidth, fontScale } = useWindowDimensions(); + const titleTypography = useScaledTextRole("body"); + const metadataTypography = useScaledTextRole("label"); + const projectIconSize = titleTypography.fontSize * 1.25 * fontScale; + const machineIconSize = metadataTypography.fontSize * fontScale; + const titleLineHeight = titleTypography.lineHeight * fontScale; const { thread, variant, @@ -999,19 +1001,21 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { ? `Opens the thread. Swipe left to ${primaryAction.label.toLowerCase()}.` : `Opens the thread. Swipe left for ${primaryAction.label.toLowerCase()} and snooze actions.`; - const titleTextInset = props.project ? TITLE_TEXT_INSET : 0; + const titleTextInset = props.project ? projectIconSize + 8 : 0; const cardContent = ( <> - + {props.project ? ( - + + + ) : null} {thread.title} - + {props.hasQueuedMessages ? : null} {pinnedRow ? ( ) : ( - - {" "} - + )} {pr ? (