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[`