fix(tui): reserve overlay panel footers

Let overlay grid panels define footer content outside the clipped body so hints and pager controls stay visible under height caps.
This commit is contained in:
Brooklyn Nicholson
2026-04-27 15:01:30 -05:00
parent 7439d676e0
commit f5f4c2cfb1
3 changed files with 15 additions and 9 deletions

View File

@@ -214,15 +214,15 @@ export function FloatingOverlays({
<Text key={i}>{line}</Text>
))}
<Box marginTop={1}>
<OverlayHint t={ui.theme}>
{overlay.pager.offset + pagerPageSize < overlay.pager.lines.length
? `↑↓/jk line · Enter/Space/PgDn page · b/PgUp back · g/G top/bottom · Esc/q close (${Math.min(overlay.pager.offset + pagerPageSize, overlay.pager.lines.length)}/${overlay.pager.lines.length})`
: `end · ↑↓/jk · b/PgUp back · g top · Esc/q close (${overlay.pager.lines.length} lines)`}
</OverlayHint>
</Box>
</Box>
),
footer: (
<OverlayHint t={ui.theme}>
{overlay.pager.offset + pagerPageSize < overlay.pager.lines.length
? `↑↓/jk line · Enter/Space/PgDn page · b/PgUp back · g/G top/bottom · Esc/q close (${Math.min(overlay.pager.offset + pagerPageSize, overlay.pager.lines.length)}/${overlay.pager.lines.length})`
: `end · ↑↓/jk · b/PgUp back · g top · Esc/q close (${overlay.pager.lines.length} lines)`}
</OverlayHint>
),
id: 'pager',
title: overlay.pager.title
}

View File

@@ -152,6 +152,7 @@ export function LearningLedger({ borderColor, gw, maxHeight, onClose, t, width:
panels={[
{
content: listPanel,
footer: <OverlayHint t={t}>/ select · Enter/Space details · 1-9,0 quick · Esc/q close</OverlayHint>,
grow: 7,
id: 'learning-list',
title: 'Recent Learning'
@@ -205,7 +206,6 @@ function LearningList({ counts, items, ledger, offset, selectedIndex, t }: Learn
<Text color={t.color.muted}> {(ledger?.items?.length ?? items.length) - offset - VISIBLE_ROWS} more</Text>
)}
<OverlayHint t={t}>/ select · Enter/Space details · 1-9,0 quick · Esc/q close</OverlayHint>
</Box>
)
}

View File

@@ -40,9 +40,14 @@ export function OverlayGrid({ borderColor, maxHeight, panels, t, width }: Overla
{panel.title}
</Text>
) : null}
<Box flexDirection="column" height={innerHeight ? Math.max(1, innerHeight - (panel.title ? 1 : 0)) : undefined} overflow="hidden">
<Box
flexDirection="column"
height={innerHeight ? Math.max(1, innerHeight - (panel.title ? 1 : 0) - (panel.footer ? 1 : 0)) : undefined}
overflow="hidden"
>
{panel.content}
</Box>
{panel.footer ? <Box flexDirection="column">{panel.footer}</Box> : null}
</Box>
{!last ? <Box flexShrink={0} width={GAP} /> : null}
</Box>
@@ -54,6 +59,7 @@ export function OverlayGrid({ borderColor, maxHeight, panels, t, width }: Overla
export interface OverlayGridPanel {
content: ReactNode
footer?: ReactNode
grow?: number
id: string
title?: string