export type BaseOption = { readonly id: string; readonly selectable?: boolean; }; export type BasicSelect = { readonly kind: "basic"; readonly value: T | null; readonly onOptionChange: (change: T | null) => void; readonly options: T[]; }; export type MultiSelect = { readonly kind: "multi"; readonly value: T[]; readonly onOptionChange: (change: T[]) => void; readonly options: T[]; }; export type ComboSelect = { readonly kind: "combo"; readonly value: T | null; readonly onOptionChange: (change: T | null) => void; readonly query?: string; readonly onQueryChange?: (change: string) => void; readonly searchDebounceMs?: number; readonly clearOnSelect?: boolean; readonly clearOnQuery?: boolean; readonly options: (query: string | null) => Promise | T[]; }; export type MultiComboSelect = { readonly kind: "multi-combo"; readonly value: T[]; readonly onOptionChange: (change: T[]) => void; readonly query?: string; readonly onQueryChange?: (change: string) => void; readonly searchDebounceMs?: number; readonly clearOnSelect?: boolean; readonly clearOnQuery?: boolean; readonly options: (query: string | null) => Promise | T[]; }; export type SmartSelectKinds = BasicSelect | MultiSelect | ComboSelect | MultiComboSelect; export type OptionRenderProps = { readonly option: T; readonly active: boolean; readonly selected: boolean; };