diff --git a/packages/cli/src/ui/components/Footer.tsx b/packages/cli/src/ui/components/Footer.tsx
index 61f8eda4f..75824a8f7 100644
--- a/packages/cli/src/ui/components/Footer.tsx
+++ b/packages/cli/src/ui/components/Footer.tsx
@@ -52,13 +52,9 @@ export const Footer: React.FC = () => {
const contextWindowSize =
config.getContentGeneratorConfig()?.contextWindowSize;
- // Left section priority: high-priority messages > status line > hint.
- // Approval mode indicator is rendered as a separate row below when non-default.
- const isNonDefaultMode =
- showAutoAcceptIndicator !== undefined &&
- showAutoAcceptIndicator !== ApprovalMode.DEFAULT;
-
- const leftContent = uiState.ctrlCPressedOnce ? (
+ // Left bottom row: high-priority messages > approval mode > hint.
+ // Matches upstream layout where status line and hints coexist vertically.
+ const leftBottomContent = uiState.ctrlCPressedOnce ? (
{t('Press Ctrl+C again to exit.')}
) : uiState.ctrlDPressedOnce ? (
{t('Press Ctrl+D again to exit.')}
@@ -68,10 +64,9 @@ export const Footer: React.FC = () => {
-- INSERT --
) : uiState.shellModeActive ? (
- ) : statusLineText ? (
-
- {statusLineText}
-
+ ) : showAutoAcceptIndicator !== undefined &&
+ showAutoAcceptIndicator !== ApprovalMode.DEFAULT ? (
+
) : (
{t('? for shortcuts')}
);
@@ -110,51 +105,35 @@ export const Footer: React.FC = () => {
});
}
- // Status line is inlined in the footer's left section.
- // Approval mode indicator renders as a separate row below when non-default.
+ // Layout matches upstream: left column has status line (top) + hints/mode
+ // (bottom), right section has indicators. Status line and hints coexist.
return (
-
-
- {/* Left Section — shrinks to accommodate right items */}
-
- {leftContent}
-
-
- {/* Right Section — never compressed */}
-
- {rightItems.map(({ key, node }, index) => (
-
- {index > 0 && | }
- {node}
-
- ))}
-
+
+ {/* Left column — status line on top, hints/mode on bottom */}
+
+ {statusLineText && (
+
+ {statusLineText}
+
+ )}
+ {leftBottomContent}
- {/* Approval mode indicator — shown as separate row when non-default */}
- {isNonDefaultMode && (
-
-
-
- )}
+ {/* Right Section — never compressed */}
+
+ {rightItems.map(({ key, node }, index) => (
+
+ {index > 0 && | }
+ {node}
+
+ ))}
+
);
};
diff --git a/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap b/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap
index 13017da60..633f0bba7 100644
--- a/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap
+++ b/packages/cli/src/ui/components/__snapshots__/Footer.test.tsx.snap
@@ -1,5 +1,8 @@
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-exports[` > footer rendering (golden snapshots) > renders complete footer on narrow terminal > complete-footer-narrow 1`] = `" ? for shortcuts 0.1% used | verbose"`;
+exports[` > footer rendering (golden snapshots) > renders complete footer on narrow terminal > complete-footer-narrow 1`] = `
+" ? for shortcuts
+ 0.1% used | verbose"
+`;
-exports[` > footer rendering (golden snapshots) > renders complete footer on wide terminal > complete-footer-wide 1`] = `" ? for shortcuts 0.1% context used | verbose"`;
+exports[` > footer rendering (golden snapshots) > renders complete footer on wide terminal > complete-footer-wide 1`] = `" ? for shortcuts 0.1% context used | verbose"`;