import * as React from "react";
export interface SearchResult {
    id: string;
    title: string;
    description?: string;
    path?: string;
    type?: string;
    icon?: React.ReactNode;
    metadata?: Record<string, unknown>;
}
export interface FilterChipData {
    id: string;
    label: string;
    variant?: "selected" | "category" | "subcategory" | "tag";
}
export interface SearchInputProps {
    /** Placeholder text shown in the input */
    placeholder?: string;
    /** Controlled value */
    value?: string;
    /** Default value for uncontrolled mode */
    defaultValue?: string;
    /** Called when input value changes (raw, not debounced) */
    onChange?: (value: string) => void;
    /** Called when user presses Enter */
    onSubmit?: (value: string) => void;
    /** Search results to display in the dropdown */
    results?: SearchResult[];
    /** Whether results are loading */
    isLoading?: boolean;
    /** Called when a result row is selected.
     *
     *  `modifiers` carries the click event's modifier-key state when the
     *  user picked the row via mouse — pass through so the consumer can
     *  honor cmd/ctrl/shift/middle-click for background-tab navigation
     *  (the row is a `<div role="option">` rather than an `<a>`, so the
     *  browser doesn't background-tab natively even with `target="_blank"`).
     *  Empty `{}` when the row was selected via keyboard Enter. */
    onResultSelect?: (result: SearchResult, modifiers?: {
        metaKey?: boolean;
        ctrlKey?: boolean;
        shiftKey?: boolean;
        altKey?: boolean;
        button?: number;
    }) => void;
    /** Debounce delay in ms. 0 disables debounce. Default 300 */
    debounceMs?: number;
    /** Custom renderer for a single result row */
    renderResult?: (result: SearchResult, isHighlighted: boolean) => React.ReactNode;
    /** Group results by a key derived from each result */
    groupBy?: (result: SearchResult) => string;
    /** Text shown when query meets minQueryLength but no results */
    emptyResultsText?: string;
    /** Force-control dropdown visibility. Default: auto */
    showDropdown?: boolean;
    /** Filter chips rendered inline before the input */
    filterChips?: FilterChipData[];
    /** Called when a filter chip is removed */
    onFilterRemove?: (id: string) => void;
    /** Element rendered before the input. Default: SearchIcon */
    startAdornment?: React.ReactNode;
    /** Element rendered after the input */
    endAdornment?: React.ReactNode;
    /** Extra class names for the outer container */
    className?: string;
    /** Extra class names for the dropdown */
    dropdownClassName?: string;
    /** Minimum characters before showing results. Default 2 */
    minQueryLength?: number;
    /** Maximum visible filter chips. "auto" measures available width. Default "auto" */
    limitTags?: number | "auto";
    /** Custom render for the "+N" overflow text */
    getLimitTagsText?: (more: number) => React.ReactNode;
}
export declare function SearchInput({ placeholder, value, defaultValue, onChange, onSubmit, results, isLoading, onResultSelect, debounceMs, renderResult, groupBy, emptyResultsText, showDropdown: showDropdownProp, filterChips, onFilterRemove, startAdornment, endAdornment, className, dropdownClassName, minQueryLength, limitTags, getLimitTagsText, }: SearchInputProps): React.JSX.Element;
export default SearchInput;
//# sourceMappingURL=search-input.d.ts.map