From 408fc893e93c29e90069f5c455a6abd5c5c9594e Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Wed, 22 Apr 2026 14:19:01 -0500 Subject: [PATCH] =?UTF-8?q?fix(tui):=20tighten=20composer=20=E2=80=94=20st?= =?UTF-8?q?atus=20sits=20directly=20above=20input,=20overlays=20anchor=20t?= =?UTF-8?q?o=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three bugs rolled together, all in the composer area: - StatusRule was measuring as 2 rows in Yoga due to a quirk with the complex nested content. Lock the outer box to height={1} so 'top' mode actually abuts the input instead of leaving a phantom blank row between them - FloatingOverlays (slash completions, /model picker, /resume, /skills browser, pager) was anchored to the status box. In 'bottom' mode the status box moved away, so overlays vanished. Move the overlays into the input row (which is position:relative) so they always pop up above the input regardless of status position - Drop the fallback in the sticky-prompt slot (only render a row when there's an actual sticky prompt to show) and collapse the now-unused Box column wrapping the input. Saves two rows of dead vertical space in the default layout --- ui-tui/src/components/appChrome.tsx | 2 +- ui-tui/src/components/appLayout.tsx | 30 +++++++++++++---------------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/ui-tui/src/components/appChrome.tsx b/ui-tui/src/components/appChrome.tsx index 2fe2e6a5..3d14f500 100644 --- a/ui-tui/src/components/appChrome.tsx +++ b/ui-tui/src/components/appChrome.tsx @@ -187,7 +187,7 @@ export function StatusRule({ const leftWidth = Math.max(12, cols - cwdLabel.length - 3) return ( - + {'─ '} diff --git a/ui-tui/src/components/appLayout.tsx b/ui-tui/src/components/appLayout.tsx index d2607bad..6e4119cf 100644 --- a/ui-tui/src/components/appLayout.tsx +++ b/ui-tui/src/components/appLayout.tsx @@ -173,31 +173,18 @@ const ComposerPane = memo(function ComposerPane({ )} - {status.showStickyPrompt ? ( + {status.showStickyPrompt && ( {status.stickyPrompt} - ) : ( - )} - - - - - + {!isBlocked && ( - + <> {composer.inputBuf.map((line, i) => ( @@ -209,6 +196,15 @@ const ComposerPane = memo(function ComposerPane({ ))} + + {sh ? ( $ @@ -234,7 +230,7 @@ const ComposerPane = memo(function ComposerPane({ - + )} {!composer.empty && !ui.sid && ⚕ {ui.status}}