SearchPalette and SearchList

The same accessible search/listbox interaction, embedded or in a modal. No fuzzy-search or command-runtime dependency.

Nothing selected
New documentCreate an empty document
⌘N
Unavailable command
SettingsPreferences and appearance
HistoryRecent documents
<SearchPalette
  label="Commands"
  open={open}
  onClose={() => setOpen(false)}
  options={[
    { value: "new", label: "New document", icon: "file-plus" },
    { value: "settings", label: "Settings", keywords: "theme preferences" },
  ]}
  onSelect={runCommand}
/>
PropPurpose
optionsStable string values, labels, optional description/icon/trailing content/keywords/disabled state
onSelectSelected value; palette callbacks run after closing and restoring focus
query, onQueryChangeOptional controlled query
filterDefaults to case-insensitive text matching; set false for already-filtered server results
loadingAnnounces loading state
footerOptional explanatory or shortcut content
open, onClose, onAfterCloseModal lifecycle (SearchPalette only)

Focus stays in the input using aria-activedescendant. Arrow keys or Ctrl+J/K navigate; Ctrl+Home/End jump; Enter selects. IME composition never selects. Disabled options remain reachable and announced, but cannot be selected. The application owns ranking, fetching, and executing commands.