diff --git a/packages/app/src/composer/draft/workspace-tab.tsx b/packages/app/src/composer/draft/workspace-tab.tsx
index f610249a1..3c4ab0b9d 100644
--- a/packages/app/src/composer/draft/workspace-tab.tsx
+++ b/packages/app/src/composer/draft/workspace-tab.tsx
@@ -1,7 +1,9 @@
import { useCallback, useEffect, useMemo, useRef } from "react";
import { Keyboard, ScrollView, Text, View } from "react-native";
+import ReanimatedAnimated from "react-native-reanimated";
import { StyleSheet } from "react-native-unistyles";
import { useSafeAreaInsets } from "react-native-safe-area-context";
+import { useKeyboardShiftStyle } from "@/hooks/use-keyboard-shift-style";
import invariant from "tiny-invariant";
import { Composer } from "@/composer";
import { DraftAgentModeControl } from "@/composer/agent-controls/mode-control";
@@ -584,9 +586,13 @@ export function WorkspaceDraftAgentTab({
[composerState],
);
+ const { style: composerKeyboardStyle } = useKeyboardShiftStyle({
+ mode: "translate",
+ });
+
const inputAreaWrapperStyle = useMemo(
- () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }],
- [insets.bottom],
+ () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }, composerKeyboardStyle],
+ [insets.bottom, composerKeyboardStyle],
);
const handleDropdownCloseFocus = useCallback(() => {
@@ -656,7 +662,7 @@ export function WorkspaceDraftAgentTab({
)}
-
+
{importPillPress ? (
@@ -667,6 +673,7 @@ export function WorkspaceDraftAgentTab({
-
+
);
diff --git a/packages/app/src/composer/index.tsx b/packages/app/src/composer/index.tsx
index c5c10921a..2d10d7f70 100644
--- a/packages/app/src/composer/index.tsx
+++ b/packages/app/src/composer/index.tsx
@@ -665,6 +665,8 @@ interface ComposerProps {
inputWrapperStyle?: import("react-native").ViewStyle;
/** Rendered below the input, inside the keyboard-shifted container. */
footer?: ReactNode;
+ /** When true, a parent wrapper owns the keyboard shift, so the composer skips its own. */
+ externalKeyboardShift?: boolean;
}
const EMPTY_ARRAY: readonly QueuedMessage[] = [];
@@ -859,6 +861,7 @@ export function Composer({
agentControls,
inputWrapperStyle,
footer,
+ externalKeyboardShift,
}: ComposerProps) {
const buttonIconSize = resolveComposerButtonIconSize();
const client = useHostRuntimeClient(serverId);
@@ -1307,6 +1310,7 @@ export function Composer({
const { style: keyboardAnimatedStyle } = useKeyboardShiftStyle({
mode: "translate",
+ enabled: !externalKeyboardShift,
});
const isVoiceModeForAgent = resolveIsVoiceModeForAgent(voice, serverId, agentId);
diff --git a/packages/app/src/panels/agent-panel.tsx b/packages/app/src/panels/agent-panel.tsx
index 9f4dd1b08..f308f5de5 100644
--- a/packages/app/src/panels/agent-panel.tsx
+++ b/packages/app/src/panels/agent-panel.tsx
@@ -1392,9 +1392,13 @@ function ActiveAgentComposer({
],
);
+ const { style: composerKeyboardStyle } = useKeyboardShiftStyle({
+ mode: "translate",
+ });
+
const inputAreaStyle = useMemo(
- () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }],
- [insets.bottom],
+ () => [styles.inputAreaWrapper, { paddingBottom: insets.bottom }, composerKeyboardStyle],
+ [insets.bottom, composerKeyboardStyle],
);
const composerFooter = useMemo(
@@ -1406,7 +1410,7 @@ function ActiveAgentComposer({
);
return (
-
+
-
+
);
}