import * as react_jsx_runtime from 'react/jsx-runtime';
import { ReactElement, Dispatch, SetStateAction, PropsWithChildren, ReactNode, Ref, ComponentPropsWithRef } from 'react';

interface SelectItem {
    disabled: boolean;
    value: string;
    text: string;
}
type ItemsMap = Map<string, SelectItem>;

interface SelectContextState {
    itemsMap: ItemsMap;
    disabled: boolean;
    readOnly: boolean;
    state?: 'error' | 'alert' | 'success';
    itemsComponent: ReactElement | undefined;
    selectedItem: SelectItem | undefined;
    setValue: (value: string) => void;
    isControlled: boolean;
    onValueChange?: (value: string) => void;
    ariaLabel: string | undefined;
    setAriaLabel: Dispatch<SetStateAction<string | undefined>>;
    fieldId: string;
    fieldLabelId: string | undefined;
    name: string | undefined;
    required: boolean;
    placeholder: string | undefined;
    setPlaceholder: Dispatch<SetStateAction<string | undefined>>;
}
type SelectContextProps = PropsWithChildren<{
    /**
     * Use `state` prop to assign a specific state to the select, choosing from: `error`, `alert` and `success`. By doing so, the outline styles will be updated.
     */
    state?: 'error' | 'alert' | 'success';
    /**
     * When true, prevents the user from interacting with the select.
     */
    disabled?: boolean;
    /**
     * Sets the select as interactive or not.
     */
    readOnly?: boolean;
    /**
     * The value of the select when initially rendered. Use when you do not need to control the state of the select.
     */
    defaultValue?: string;
    /**
     * The controlled value of the select. Should be used in conjunction with `onValueChange`.
     */
    value?: string;
    /**
     * Event handler called when the value changes.
     */
    onValueChange?: (value: string) => void;
    itemsComponent: ReactElement | undefined;
    /**
     * This attribute is used to specify the name of the control.
     * If wrapped with a FormField with a name, will be inherited from it.
     */
    name?: string;
    /**
     * A Boolean attribute indicating that an option with a non-empty string value must be selected.
     */
    required?: boolean;
}>;
declare const SelectProvider: ({ children, defaultValue, value: valueProp, onValueChange, disabled: disabledProp, readOnly: readOnlyProp, state: stateProp, itemsComponent, name: nameProp, required: requiredProp, }: SelectContextProps) => react_jsx_runtime.JSX.Element;
declare const useSelectContext: () => SelectContextState;

type SelectProps = Omit<SelectContextProps, 'itemsComponent'>;
declare const Select$1: {
    ({ children, ...props }: SelectProps): react_jsx_runtime.JSX.Element;
    displayName: string;
};

interface GroupProps {
    children: ReactNode;
    className?: string;
    ref?: Ref<HTMLOptGroupElement>;
}
declare const Group: {
    ({ children, ref: forwardedRef, ...props }: GroupProps): react_jsx_runtime.JSX.Element;
    displayName: string;
};

interface ItemProps {
    disabled?: boolean;
    value: string;
    children: string;
    ref?: Ref<HTMLOptionElement>;
}
declare const Item: {
    ({ disabled, value, children, ref: forwardedRef }: ItemProps): react_jsx_runtime.JSX.Element;
    displayName: string;
};

declare const Items: {
    ({ children, className, ref, ...rest }: PropsWithChildren<ComponentPropsWithRef<"select">>): react_jsx_runtime.JSX.Element;
    displayName: string;
};

interface LabelProps {
    children: string;
}
declare const Label: {
    ({ children }: LabelProps): null;
    displayName: string;
};

declare const LeadingIcon: {
    ({ children }: {
        children: ReactElement;
    }): react_jsx_runtime.JSX.Element;
    displayName: string;
};

interface PlaceholderProps {
    disabled?: boolean;
    children: string;
    ref?: Ref<HTMLOptionElement>;
}
declare const Placeholder: {
    ({ disabled, children, ref: forwardedRef, }: PlaceholderProps): react_jsx_runtime.JSX.Element;
    displayName: string;
};

interface TriggerProps {
    'aria-label'?: string;
    children: ReactNode;
    className?: string;
    ref?: Ref<HTMLDivElement>;
}
/**
 * This trigger acts as a fake button for the `select` tag.
 * It is not interactive.
 */
declare const Trigger: {
    ({ "aria-label": ariaLabel, children, className, ref: forwardedRef, }: TriggerProps): react_jsx_runtime.JSX.Element;
    displayName: string;
};

interface ValueProps {
    children?: ReactNode;
    className?: string;
    /**
     * Optional placeholder value for the trigger.
     * If not specified, the value inside `Select.Placeholder` item will be used.
     */
    placeholder?: string;
    ref?: Ref<HTMLSpanElement>;
}
declare const Value: {
    ({ children, className, placeholder: customPlaceholder, ref: forwardedRef, }: ValueProps): react_jsx_runtime.JSX.Element;
    displayName: string;
};

declare const Select: typeof Select$1 & {
    Group: typeof Group;
    Item: typeof Item;
    Items: typeof Items;
    Placeholder: typeof Placeholder;
    Label: typeof Label;
    Trigger: typeof Trigger;
    Value: typeof Value;
    LeadingIcon: typeof LeadingIcon;
};

export { Select, SelectProvider, useSelectContext };
