mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-02 02:01:47 +00:00
Merge pull request #13591 from NousResearch/bb/tui-pager-scroll
fix(tui): pager supports scrolling (up/down/page/top/bottom)
This commit is contained in:
commit
e7f8a5fea3
2 changed files with 54 additions and 8 deletions
|
|
@ -173,14 +173,60 @@ export function useInputHandlers(ctx: InputHandlerContext): InputHandlerResult {
|
||||||
|
|
||||||
if (isBlocked) {
|
if (isBlocked) {
|
||||||
if (overlay.pager) {
|
if (overlay.pager) {
|
||||||
if (key.return || ch === ' ') {
|
if (key.escape || isCtrl(key, ch, 'c') || ch === 'q') {
|
||||||
const nextOffset = overlay.pager.offset + pagerPageSize
|
return patchOverlayState({ pager: null })
|
||||||
|
}
|
||||||
|
|
||||||
patchOverlayState({
|
const move = (delta: number | 'top' | 'bottom') =>
|
||||||
pager: nextOffset >= overlay.pager.lines.length ? null : { ...overlay.pager, offset: nextOffset }
|
patchOverlayState(prev => {
|
||||||
|
if (!prev.pager) {
|
||||||
|
return prev
|
||||||
|
}
|
||||||
|
|
||||||
|
const { lines, offset } = prev.pager
|
||||||
|
const max = Math.max(0, lines.length - pagerPageSize)
|
||||||
|
const step = delta === 'top' ? -lines.length : delta === 'bottom' ? lines.length : delta
|
||||||
|
const next = Math.max(0, Math.min(offset + step, max))
|
||||||
|
|
||||||
|
return next === offset ? prev : { ...prev, pager: { ...prev.pager, offset: next } }
|
||||||
|
})
|
||||||
|
|
||||||
|
if (key.upArrow || ch === 'k') {
|
||||||
|
return move(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.downArrow || ch === 'j') {
|
||||||
|
return move(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.pageUp || ch === 'b') {
|
||||||
|
return move(-pagerPageSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch === 'g') {
|
||||||
|
return move('top')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch === 'G') {
|
||||||
|
return move('bottom')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.return || ch === ' ' || key.pageDown) {
|
||||||
|
patchOverlayState(prev => {
|
||||||
|
if (!prev.pager) {
|
||||||
|
return prev
|
||||||
|
}
|
||||||
|
|
||||||
|
const { lines, offset } = prev.pager
|
||||||
|
const max = Math.max(0, lines.length - pagerPageSize)
|
||||||
|
|
||||||
|
// Auto-close only when already at the last page — otherwise clamp
|
||||||
|
// to `max` so the offset matches what the line/page-back handlers
|
||||||
|
// can reach (prevents a snap-back jump on the next ↑/↓/PgUp).
|
||||||
|
return offset >= max
|
||||||
|
? { ...prev, pager: null }
|
||||||
|
: { ...prev, pager: { ...prev.pager, offset: Math.min(offset + pagerPageSize, max) } }
|
||||||
})
|
})
|
||||||
} else if (key.escape || isCtrl(key, ch, 'c') || ch === 'q') {
|
|
||||||
patchOverlayState({ pager: null })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -164,8 +164,8 @@ export function FloatingOverlays({
|
||||||
<Box marginTop={1}>
|
<Box marginTop={1}>
|
||||||
<Text color={ui.theme.color.dim}>
|
<Text color={ui.theme.color.dim}>
|
||||||
{overlay.pager.offset + pagerPageSize < overlay.pager.lines.length
|
{overlay.pager.offset + pagerPageSize < overlay.pager.lines.length
|
||||||
? `Enter/Space for more · q to close (${Math.min(overlay.pager.offset + pagerPageSize, overlay.pager.lines.length)}/${overlay.pager.lines.length})`
|
? `↑↓/jk line · Enter/Space/PgDn page · b/PgUp back · g/G top/bottom · q close (${Math.min(overlay.pager.offset + pagerPageSize, overlay.pager.lines.length)}/${overlay.pager.lines.length})`
|
||||||
: `end · q to close (${overlay.pager.lines.length} lines)`}
|
: `end · ↑↓/jk · b/PgUp back · g top · q close (${overlay.pager.lines.length} lines)`}
|
||||||
</Text>
|
</Text>
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue