diff --git a/src/interactive-ui.ts b/src/interactive-ui.ts index e1653a6..c942ddc 100644 --- a/src/interactive-ui.ts +++ b/src/interactive-ui.ts @@ -253,7 +253,7 @@ export class InteractiveUI { case 'resize': const heightChanged = stateManager.updateTerminalHeight(action.height) if (heightChanged) { - stateManager.resetForResize() + stateManager.resetForResize(filteredStates.length) } else { // Even if height didn't change, width might have changed // Force a full re-render to clear any wrapping issues @@ -451,7 +451,8 @@ export class InteractiveUI { // This handles cases where process.stdout.rows might not be accurate at startup const currentHeight = this.getTerminalHeight() if (stateManager.updateTerminalHeight(currentHeight)) { - stateManager.resetForResize() + const initialFiltered = stateManager.getFilteredStates(states) + stateManager.resetForResize(initialFiltered.length) } // Initial render diff --git a/src/ui/state/navigation-manager.ts b/src/ui/state/navigation-manager.ts index fe55373..7b202f5 100644 --- a/src/ui/state/navigation-manager.ts +++ b/src/ui/state/navigation-manager.ts @@ -156,9 +156,9 @@ export class NavigationManager { if (targetVisualIndex < this.state.scrollOffset) { this.state.scrollOffset = targetVisualIndex } - // Scrolling down: scroll down by 1 item (smooth scrolling) + // Scrolling down: adjust scroll to keep item visible else if (visualIndex >= this.state.scrollOffset + this.maxVisibleItems) { - this.state.scrollOffset += 1 + this.state.scrollOffset = visualIndex - this.maxVisibleItems + 1 } // Ensure scrollOffset doesn't go negative or beyond bounds diff --git a/src/ui/state/state-manager.ts b/src/ui/state/state-manager.ts index 1f32000..635b6f9 100644 --- a/src/ui/state/state-manager.ts +++ b/src/ui/state/state-manager.ts @@ -208,8 +208,10 @@ export class StateManager { exitFilterMode(clearQuery: boolean = false): void { this.filterManager.exitFilterMode(clearQuery) - this.navigationManager.setCurrentRow(0) - this.navigationManager.setScrollOffset(0) + if (clearQuery) { + this.navigationManager.setCurrentRow(0) + this.navigationManager.setScrollOffset(0) + } // Use incremental render for search mode toggle (no blink) } @@ -272,8 +274,8 @@ export class StateManager { this.renderState.forceFullRender = isInitial } - resetForResize(): void { - const totalItems = this.renderState.renderableItems.length || this.displayState.maxVisibleItems + resetForResize(totalFilteredItems?: number): void { + const totalItems = totalFilteredItems || this.renderState.renderableItems.length || this.displayState.maxVisibleItems this.navigationManager.resetForResize(totalItems) this.renderState.forceFullRender = true }