/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import { Box, Text } from 'ink'; import { Colors } from '../colors.js'; export interface Suggestion { label: string; value: string; description?: string; } interface SuggestionsDisplayProps { suggestions: Suggestion[]; activeIndex: number; isLoading: boolean; width: number; scrollOffset: number; userInput: string; } export const MAX_SUGGESTIONS_TO_SHOW = 8; export function SuggestionsDisplay({ suggestions, activeIndex, isLoading, width, scrollOffset, userInput, }: SuggestionsDisplayProps) { if (isLoading) { return ( Loading suggestions... ); } if (suggestions.length === 0) { return null; // Don't render anything if there are no suggestions } // Calculate the visible slice based on scrollOffset const startIndex = scrollOffset; const endIndex = Math.min( scrollOffset + MAX_SUGGESTIONS_TO_SHOW, suggestions.length, ); const visibleSuggestions = suggestions.slice(startIndex, endIndex); return ( {scrollOffset > 0 && } {visibleSuggestions.map((suggestion, index) => { const originalIndex = startIndex + index; const isActive = originalIndex === activeIndex; const textColor = isActive ? Colors.AccentPurple : Colors.Gray; return ( {userInput.startsWith('/') ? ( // only use box model for (/) command mode {suggestion.label} ) : ( // use regular text for other modes (@ context) {suggestion.label} )} {suggestion.description ? ( {suggestion.description} ) : null} ); })} {endIndex < suggestions.length && } {suggestions.length > MAX_SUGGESTIONS_TO_SHOW && ( ({activeIndex + 1}/{suggestions.length}) )} ); }