fix(list): cap rendered filterable list while keeping full search set (#1492)

James Trew created

Change summary

internal/tui/exp/list/filterable.go | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

Detailed changes

internal/tui/exp/list/filterable.go 🔗

@@ -245,7 +245,7 @@ func (f *filterableList[T]) Filter(query string) tea.Cmd {
 
 	f.selectedItemIdx = -1
 	if query == "" || len(f.items) == 0 {
-		return f.list.SetItems(f.items)
+		return f.list.SetItems(f.visibleItems(f.items))
 	}
 
 	matches := fuzzy.FindFrom(query, f)
@@ -274,7 +274,7 @@ func (f *filterableList[T]) Filter(query string) tea.Cmd {
 
 func (f *filterableList[T]) SetItems(items []T) tea.Cmd {
 	f.items = items
-	return f.list.SetItems(items)
+	return f.list.SetItems(f.visibleItems(items))
 }
 
 func (f *filterableList[T]) Cursor() *tea.Cursor {
@@ -317,3 +317,13 @@ func (f *filterableList[T]) String(i int) string {
 func (f *filterableList[T]) Len() int {
 	return len(f.items)
 }
+
+// visibleItems returns the subset of items that should be rendered based on
+// the configured resultsSize limit. The underlying source (f.items) remains
+// intact so filtering still searches the full set.
+func (f *filterableList[T]) visibleItems(items []T) []T {
+	if f.resultsSize > 0 && len(items) > f.resultsSize {
+		return items[:f.resultsSize]
+	}
+	return items
+}