Skip to content

PickerDialog

Generic search-and-select dialog combining ModalDialog + text input + scrolling result list. Handles keyboard routing: arrows for selection, Enter to confirm, Esc to cancel, printable chars for filtering.

Import

tsx
import { PickerDialog } from "silvery"

Props

PropTypeDefaultDescription
titlestringrequiredDialog title
itemsT[]requiredItems to display in the result list
renderItem(item: T, selected: boolean) => ReactNoderequiredRender function for each item
keyExtractor(item: T) => stringrequiredUnique key for each item
onSelect(item: T) => voidrequiredCalled when an item is confirmed (Enter)
onCancel() => voidrequiredCalled when the dialog is cancelled (Esc)
onChange(query: string) => void--Called when input text changes (for filtering)
placeholderstring--Placeholder text when input is empty
initialValuestring""Initial input value
emptyMessagestring"No items"Message when items list is empty
maxVisiblenumber10Maximum visible items before scrolling
widthnumber--Dialog width
heightnumber--Dialog height (auto-sized if omitted)
footerReactNode--Footer content
promptstring--Input prompt prefix (e.g., "/ ")
promptColorstring--Prompt color
isActivebooleantrueWhether the input is active

Keyboard Routing

KeyAction
Printable charsFilter input (readline editing)
Ctrl+A/E/K/U/W/YReadline shortcuts
Up/DownNavigate result list
PgUp/PgDnScroll by page
EnterConfirm selected item
EscCancel dialog

Usage

tsx
<PickerDialog
  title="Search"
  items={filteredResults}
  renderItem={(item, selected) => <Text inverse={selected}>{item.name}</Text>}
  keyExtractor={(item) => item.id}
  onSelect={(item) => navigateTo(item)}
  onCancel={() => closeDialog()}
  onChange={(query) => setFilter(query)}
  placeholder="Type to search..."
/>

See Also

Released under the MIT License.