import React from "react" import { Box, Text } from "ink" import type { PickerOverlayState } from "../hooks/use-picker-overlay.js" export interface PickerOverlayProps { /** Title displayed in the header */ title: string /** Overlay state from usePickerOverlay */ state: PickerOverlayState /** Max visible items */ maxVisible: number /** Width of the overlay box */ width: number /** Render function for a single item */ renderItem: (item: T, index: number, isCursor: boolean) => React.ReactNode /** Hint text at the bottom. Defaults to "↑↓: nav Enter: select Esc: clear/close type to filter" */ hint?: string /** Optional label appended to the item count (e.g., "modified") */ countLabel?: string /** Border color (default: "cyan") */ borderColor?: string } export function PickerOverlay({ title, state, maxVisible, width, renderItem, hint, countLabel, borderColor = "cyan", }: PickerOverlayProps) { const { cursor, scroll, filter, filteredItems } = state const visibleItems = filteredItems.slice(scroll, scroll + maxVisible) const showScrollUp = scroll > 0 const showScrollDown = scroll + maxVisible < filteredItems.length return ( {title} {filteredItems.length}{countLabel ? ` ${countLabel}` : ""} {/* Filter input line */} {filter} {showScrollUp && ( ↑ {scroll} more )} {visibleItems.map((item, vi) => { const i = vi + scroll const isCursor = i === cursor return ( {renderItem(item, i, isCursor)} ) })} {showScrollDown && ( ↓ {filteredItems.length - scroll - maxVisible} more )} {hint ?? `↑↓: nav Enter: select Esc: ${filter ? "clear" : "close"} type to filter`} ) }