import type React from "react";
import type { ComboboxContent } from "src/primitives/Combobox";
import type { FieldLabel } from "src/primitives/Field";
export interface OptionBase {
    /** Display text for the option. */
    label: string;
    /** Unique value for the option. */
    value: string;
    /** Whether the option is disabled. */
    disabled?: boolean;
}
export interface OptionGroup {
    /** Group heading text. */
    label: string;
    /** Options within this group. */
    options: OptionBase[];
}
export type Option = OptionBase | OptionGroup;
export declare function isOptionGroup(opt: Option): opt is OptionGroup;
export type SelectOptionBase = OptionBase;
export type SelectOptionGroup = OptionGroup;
export type SelectOption = Option;
type SelectSize = "small" | "medium" | "large";
interface SelectSharedProps {
    /** Unique identifier for the select. Auto-generated if omitted. */
    id?: string;
    /** Name attribute forwarded to the underlying input. */
    name?: string;
    /** Size of the trigger. */
    size?: SelectSize;
    /** Label displayed above the select. */
    label?: string;
    /** Error message displayed below the select. */
    error?: string;
    /** Help text displayed below the select. */
    helpText?: React.ReactNode;
    /** Placeholder text when no value is selected. */
    placeholder?: string;
    /** Flat or grouped option list. */
    options?: SelectOption[];
    /** Disable the select. */
    isDisabled?: boolean;
    /** Mark as required. */
    required?: boolean;
    /**
     * Enable search/filtering of options by typing in the input.
     * When false, the input is hidden and the trigger shows the selected label.
     * @default true
     */
    isSearchable?: boolean;
    /** Whether the first matching item is highlighted automatically. @default true */
    autoHighlight?: boolean;
    /** Callback fired when the dropdown opens or closes. */
    onOpenChange?: (open: boolean) => void;
    /**
     * Positioning strategy for the dropdown content.
     * @deprecated The Combobox primitive always uses popper-style positioning.
     * Use `contentProps.side` and `contentProps.align` for positioning control.
     */
    position?: "item-aligned" | "popper";
    /** Show a clear/reset button when a value is selected. */
    isClearable?: boolean;
    /**
     * Allow creating new options by typing a value that doesn't exist.
     * Works in both single and multi mode.
     */
    isCreatable?: boolean;
    /**
     * Callback fired when a new option is created via the "Create X" item.
     * The parent should update the `options` list to include the new value.
     */
    onCreateOption?: (inputValue: string) => void;
    /**
     * Customize the label for the "Create" option in the dropdown.
     * @default (inputValue) => `Create "${inputValue}"`
     */
    formatCreateLabel?: (inputValue: string) => string;
    /**
     * Async function that fetches options based on the current input value.
     * Works in both single and multi mode.
     */
    loadOptions?: (inputValue: string) => Promise<SelectOptionBase[]>;
    /**
     * Options to show before the user types anything.
     * When `true`, `loadOptions("")` is called on mount.
     * @default false
     */
    defaultOptions?: boolean | SelectOptionBase[];
    /**
     * Cache results from `loadOptions` so repeated queries are instant.
     * @default false
     */
    cacheOptions?: boolean;
    /** Text shown while `loadOptions` is fetching. @default "Loading…" */
    loadingMessage?: string;
    /** Text displayed when no options match. @default "No results found." */
    emptyMessage?: string;
    /**
     * Enable lazy loading of options as the user scrolls.
     * @default false
     */
    isAsyncLoadOptionEnabled?: boolean;
    /** Callback to load the next batch of options (lazy loading). */
    fetchMore?: () => void;
    /** Total number of options on the server (lazy loading). */
    totalOptionsCount?: number;
    /** Custom data-testid prefix for the component tree. */
    dataTestId?: string;
    /** Props forwarded to the FieldLabel. */
    labelProps?: Omit<React.ComponentProps<typeof FieldLabel>, "htmlFor" | "children">;
    /** Props forwarded to the ComboboxContent. */
    contentProps?: Omit<React.ComponentProps<typeof ComboboxContent>, "anchor" | "children">;
    /** Additional CSS class names for the outermost wrapper. */
    className?: string;
    /** Additional CSS class names for the input/trigger element. */
    inputClassName?: string;
    /** Children rendered inside the dropdown (overrides `options`). */
    children?: React.ReactNode;
}
interface SingleSelectProps extends SelectSharedProps {
    /** When true, multiple values can be selected and the trigger shows chips. @default false */
    isMulti?: false;
    /** Controlled selected value. */
    value?: string;
    /** Default selected value (uncontrolled). */
    defaultValue?: string;
    /** Callback fired when value changes. */
    onChange?: (value: string) => void;
}
interface MultiSelectVariantProps extends SelectSharedProps {
    /** When true, multiple values can be selected and the trigger shows chips. */
    isMulti: true;
    /** Controlled selected values. */
    value?: string[];
    /** Default selected values (uncontrolled). */
    defaultValue?: string[];
    /** Callback fired when selected values change. */
    onChange?: (values: string[]) => void;
    /** Additional CSS class names for the chips container. */
    chipsClassName?: string;
    /** Hide the remove button on individual chips. */
    hideChipRemove?: boolean;
}
export type SelectProps = SingleSelectProps | MultiSelectVariantProps;
export type MultiSelectProps = Extract<SelectProps, {
    isMulti: true;
}>;
export {};
