| ... | ... | @@ -679,10 +679,12 @@ export const ThreadDetailScreen = memo(function ThreadDetailScreen(props: Thread |
| 679 | 679 | const isSplitLayout = layoutVariant === "split"; |
| 680 | 680 | const contentMaxWidth = isSplitLayout ? CHAT_CONTENT_MAX_WIDTH : undefined; |
| 681 | 681 | const workspaceContentWidth = useWorkspaceContentWidth(); |
| 682 | // Clearing animated width can retain the unfolded width after Android resumes folded. |
| 683 | // Assign both layouts explicitly so the dock always follows its current parent. |
| 682 | 684 | const composerWidthStyle = useAnimatedStyle(() => |
| 683 | 685 | isSplitLayout && workspaceContentWidth !== null |
| 684 | | ? { width: workspaceContentWidth.value, right: undefined } |
| 685 | | : { width: undefined, right: 0 }, |
| 686 | ? { width: workspaceContentWidth.value } |
| 687 | : { width: "100%" }, |
| 686 | 688 | ); |
| 687 | 689 | const selectedInstanceId = props.selectedThread.modelSelection.instanceId; |
| 688 | 690 | useStreamingHaptics(props.selectedThread.id, props.selectedThreadFeed); |
| ... | ... | @@ -964,7 +966,7 @@ export const ThreadDetailScreen = memo(function ThreadDetailScreen(props: Thread |
| 964 | 966 | <Animated.View |
| 965 | 967 | layout={COMPOSER_LAYOUT_TRANSITION} |
| 966 | 968 | pointerEvents="box-none" |
| 967 | | style={[{ position: "absolute", bottom: 0, left: 0, right: 0 }, composerWidthStyle]} |
| 969 | style={[{ position: "absolute", bottom: 0, left: 0 }, composerWidthStyle]} |
| 968 | 970 | > |
| 969 | 971 | {/* No paddingTop here: the overlay's measured height becomes the |
| 970 | 972 | list's bottom inset, so any padding above the pill/composer |