import type { HTMLAttributes, InputHTMLAttributes, ChangeEvent, ReactNode } from 'react'; import type PopperJs from 'popper.js'; import type { BaseProps, SizeType } from '@toptal/picasso-shared'; import type { OutlinedInputProps, Status } from '@toptal/picasso-outlined-input'; /** * Select props are generalized over possible values in the component and whether * Select should be a multiselect. If you want `onChange` to take a handler that * can take array (for multiselect) you should set `M` to `true`. By default it's * single select. * * @param T The type of the value in the `Select`, can be either `number` or `string` * @param M The `boolean` type of the `multiple` property to indicate whether `onChange` will expect handler to accept plain `T` or array of `T` * @param V Technical type, don't pass type argument to it directly */ export interface SelectProps extends BaseProps, Omit, 'onChange' | 'size' | 'color' | 'value'> { /** If true, the 'Select' will be disabled */ disabled?: boolean; /** Whether to render select options in portal. Should be disabled in Modals */ disablePortal?: boolean; /** Indicate whether `Select` is in `error`, `warning` or `default` state */ status?: Extract; /** Component ID */ id?: string; /** Width of the component */ width?: 'full' | 'shrink' | 'auto'; /** Width of the menu */ menuWidth?: string; /** Shows the loading icon when options are loading */ loading?: boolean; /** Placeholder option which is selected by default */ placeholder?: string; /** Placeholder for search input */ searchPlaceholder?: string; /** Whether icon should be placed at the beginning or end of the `Input` */ iconPosition?: 'start' | 'end'; /** Specify icon which should be rendered inside Input */ icon?: ReactNode; /** Callback invoked when `Select` changes its state. */ onChange?: (event: ChangeEvent<{ name?: string | undefined; value: V; }>) => void; /** Label to show when no options were found */ noOptionsText?: string; /** List of options or option groups to be rendered as `Select` */ options: Option[] | OptionGroups; /** Callback responsible for rendering the option given the option and its index in the list of options */ renderOption?: (option: Option, index?: number) => ReactNode; /** A function that takes a display value from the option item */ getDisplayValue?: (option: Option | null) => string; /** Selected value */ value?: V; /** Allow selecting multiple values */ multiple?: M; /** Whether to render native browser select or not */ native?: boolean; /** * Component size * @default medium */ size?: SizeType<'small' | 'medium' | 'large'>; /** Whether to render reset icon which clears selected value */ enableReset?: boolean; /** Whether to render reset icon which clears search input value */ enableResetSearch?: boolean; popperContainer?: HTMLElement; /** Defines the minimum options number to show the search * @default 10 */ searchThreshold?: number; /** Limits number of options to display on the list * @default 200 */ limit?: number; /** Specifies whether the autofill enabled or not, disabled by default */ enableAutofill?: boolean; /** A function that is invoked during search. It takes an array of options and a search value and returns filtered options */ filterOptions?: (options: Option[], searchValue: string, getDisplayValue?: (option: Option | null) => string) => Option[]; ref?: React.Ref; testIds?: OutlinedInputProps['testIds'] & { noOptions?: string; loader?: string; limitFooter?: string; searchInput?: string; }; highlight?: 'autofill'; } export declare type ValueType = string | number; export declare type Option = { key?: number; text: string; description?: string; value: T; disabled?: boolean; [prop: string]: string | number | undefined | boolean; }; export declare type OptionGroups = { [group: string]: Option[]; }; export declare type ItemProps = { onMouseEnter: () => void; onMouseDown: (event: React.MouseEvent) => void; onClick: (event: React.MouseEvent) => void; }; export declare type FocusEventType = (event: React.FocusEvent) => void; export declare type Selection = { isSelected: () => boolean; isOptionSelected: (option: Option) => boolean; display: (getDisplayValue: (option: Option | null) => string) => string; }; export interface UseSelectStateProps { getDisplayValue: (option: Option | null) => string; options: Option[]; disabled?: boolean; multiple?: boolean; value?: ValueType | ValueType[]; searchThreshold?: number; limit?: number; } export declare type UseSelectStateOutput = { isOpen: boolean; canOpen: boolean; open: () => void; close: () => void; highlightedIndex: number; closeOnEnter: boolean; setHighlightedIndex: (index: number) => void; setFilterOptionsValue: (value: string) => void; showSearch: boolean; filterOptionsValue: string; displayValue: string; selection: Selection; filteredOptions: Option[] | OptionGroups; emptySelectValue: string | string[]; selectedOptions: Option[]; }; export interface UseSelectProps { searchInputRef?: React.Ref; selectRef: React.Ref; popperRef?: React.Ref; selectProps: SelectProps; selectState: UseSelectStateOutput; } declare type GetRootProps = () => { onFocus: FocusEventType; onClick: (event: React.MouseEvent) => void; onBlur: FocusEventType; }; declare type GetInputProps = () => Partial>; declare type GetSearchInputProps = () => Partial>; export interface UseSelectOutput { getItemProps: (item: Option, index: number) => ItemProps; getRootProps: GetRootProps; getInputProps: GetInputProps; getSearchInputProps: GetSearchInputProps; } export {}; //# sourceMappingURL=types.d.ts.map