fix(tui): /statusbar top = inline above input, not row 0 of the screen

'top' and 'bottom' are positions relative to the input row, not the alt
screen viewport:

- top (default) → inline above the input, where the bar originally lived
  (what 'on' used to mean)
- bottom → below the input, pinned to the last row
- off → hidden

Drops the literal top-of-screen placement; 'on' is kept as a backward-
compat alias that resolves to 'top' at both the config layer
(normalizeStatusBar, _coerce_statusbar) and the slash command.
This commit is contained in:
Brooklyn Nicholson 2026-04-22 13:55:40 -05:00
parent d55a17bd82
commit ea32364c96
7 changed files with 60 additions and 41 deletions

View file

@ -184,7 +184,7 @@ const ComposerPane = memo(function ComposerPane({
)}
<Box flexDirection="column" position="relative">
<StatusRulePane at="on" composer={composer} status={status} />
<StatusRulePane at="top" composer={composer} status={status} />
<FloatingOverlays
cols={composer.cols}
@ -261,7 +261,7 @@ const StatusRulePane = memo(function StatusRulePane({
at,
composer,
status
}: Pick<AppLayoutProps, 'composer' | 'status'> & { at: 'bottom' | 'on' | 'top' }) {
}: Pick<AppLayoutProps, 'composer' | 'status'> & { at: 'bottom' | 'top' }) {
const ui = useStore($uiState)
if (ui.statusBar !== at) {
@ -300,8 +300,6 @@ export const AppLayout = memo(function AppLayout({
return (
<AlternateScreen mouseTracking={mouseTracking}>
<Box flexDirection="column" flexGrow={1}>
{!overlay.agents && <StatusRulePane at="top" composer={composer} status={status} />}
<Box flexDirection="row" flexGrow={1}>
{overlay.agents ? (
<AgentsOverlayPane />