From b68a22da97e53bb2a8e6e9cc5a7a44647ef7dd99 Mon Sep 17 00:00:00 2001 From: Pixel Perfect Date: Sun, 1 Nov 2026 08:40:58 -0800 Subject: [PATCH 1/2] fix(mobile): give drafts the current thread card layout --- .../features/threads/thread-list-v2-items.tsx | 137 +++++++++++------- 1 file changed, 85 insertions(+), 52 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 74704ef116354..90f0a786bc756 100644 --- a/apps/mobile/src/features/threads/thread-list-v2-items.tsx +++ b/apps/mobile/src/features/threads/thread-list-v2-items.tsx @@ -364,11 +364,22 @@ export const ThreadListV2PendingRow = memo(function ThreadListV2PendingRow(props readonly simultaneousSwipeGesture?: ComponentProps["simultaneousWith"]; }) { const { pendingTask, onSelectPendingTask, onDeletePendingTask } = props; - 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; + // Android's nonlinear system text scaling can differ from the fontScale estimate. + const [androidTitleLineHeight, setTitleLineHeight] = useState( + titleTypography.lineHeight * fontScale, + ); + const titleLineHeight = + Platform.OS === "android" ? androidTitleLineHeight : titleTypography.lineHeight * fontScale; const dormant = useSwipeRowDormant(props.activationKey); const theme = useUniwindTheme(); const sidebarPane = props.pane === "sidebar"; - const rowAppearance = getThreadListV2RowAppearance(theme, sidebarPane, props.selected ?? false); + const selected = props.selected ?? false; + const rowAppearance = getThreadListV2RowAppearance(theme, sidebarPane, selected); const isDraft = pendingTask.kind === "draft"; const deleteLabel = isDraft ? "Discard" : "Delete"; const handleDelete = useCallback( @@ -416,72 +427,101 @@ export const ThreadListV2PendingRow = memo(function ThreadListV2PendingRow(props [onDeletePendingTask, pendingTask], ); + const titleTextInset = props.project ? projectIconSize + 8 : 0; const rowContent = ( <> - + {props.project ? ( - + + + ) : null} { + const firstLine = nativeEvent.lines[0]; + if (firstLine && Math.abs(firstLine.height - titleLineHeight) > 0.5) { + setTitleLineHeight(firstLine.height); + } + } + : undefined + } > - {projectTitle} + {pendingTask.title} - {isDraft ? ( - + + {isDraft ? ( - Draft - - ) : ( + ) : null} - Sends on reconnect + {isDraft ? "Draft" : "Sends on reconnect"} - )} + - - {pendingTask.title} - {branch || props.environmentLabel ? ( - + + {props.environmentLabel && props.environmentMachine ? ( + + ) : null} {branch ? ( @@ -492,23 +532,16 @@ export const ThreadListV2PendingRow = memo(function ThreadListV2PendingRow(props {props.environmentLabel ? ( {props.environmentLabel} ) : null} - {props.environmentLabel && props.environmentMachine ? ( - - ) : null} ) : null} @@ -562,8 +595,8 @@ export const ThreadListV2PendingRow = memo(function ThreadListV2PendingRow(props rowContent ) : ( - {rowContent} - {props.showTrailingDivider !== false ? ( + {rowContent} + {THREAD_LIST_V2_ROW_DIVIDERS && props.showTrailingDivider !== false ? ( ) : null} From 2b6c9c2bf331d949860ebe41e0dd1c1d1dc2fdc8 Mon Sep 17 00:00:00 2001 From: Pixel Perfect Date: Sun, 1 Nov 2026 09:44:39 -0800 Subject: [PATCH 2/2] fix(mobile): keep queued task titles readable with large text --- .../features/threads/thread-list-v2-items.tsx | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 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 90f0a786bc756..84e9494759cad 100644 --- a/apps/mobile/src/features/threads/thread-list-v2-items.tsx +++ b/apps/mobile/src/features/threads/thread-list-v2-items.tsx @@ -464,8 +464,8 @@ export const ThreadListV2PendingRow = memo(function ThreadListV2PendingRow(props > {pendingTask.title} - - {isDraft ? ( + {isDraft ? ( + - ) : null} + + Draft + + + ) : null} + + {!isDraft ? ( + - {isDraft ? "Draft" : "Sends on reconnect"} + Sends on reconnect - + ) : null} {branch || props.environmentLabel ? ( {props.environmentLabel && props.environmentMachine ? (