import React from 'react'; import { UseButtonRootSlotProps } from '../ButtonUnstyled'; import { OptionState, UseListboxOptionSlotProps, UseListboxRootSlotProps } from '../ListboxUnstyled'; import { EventHandlers } from '../utils/types'; export interface SelectOption { value: TValue; label: React.ReactNode; disabled?: boolean; } export interface SelectOptionGroup { options: SelectChild[]; label: React.ReactNode; disabled?: boolean; } export declare type SelectChild = SelectOption | SelectOptionGroup; export declare function isOptionGroup(child: SelectChild): child is SelectOptionGroup; interface UseSelectCommonProps { buttonRef?: React.Ref; disabled?: boolean; listboxId?: string; listboxRef?: React.Ref; onOpenChange?: (open: boolean) => void; open?: boolean; options: SelectOption[]; optionStringifier?: (option: SelectOption) => string; } export interface UseSelectSingleParameters extends UseSelectCommonProps { defaultValue?: TValue | null; multiple?: false; onChange?: (e: React.MouseEvent | React.KeyboardEvent | React.FocusEvent | null, value: TValue | null) => void; value?: TValue | null; } export interface UseSelectMultiParameters extends UseSelectCommonProps { defaultValue?: TValue[]; multiple: true; onChange?: (e: React.MouseEvent | React.KeyboardEvent | React.FocusEvent | null, value: TValue[]) => void; value?: TValue[]; } export declare type UseSelectParameters = UseSelectSingleParameters | UseSelectMultiParameters; interface UseSelectButtonSlotEventHandlers { onClick: React.MouseEventHandler; onKeyDown: React.KeyboardEventHandler; onMouseDown: React.MouseEventHandler; } export declare type UseSelectButtonSlotProps = UseButtonRootSlotProps & UseSelectButtonSlotEventHandlers> & { 'aria-expanded': React.AriaAttributes['aria-expanded']; 'aria-haspopup': React.AriaAttributes['aria-haspopup']; }; interface UseSelectListboxSlotEventHandlers { onBlur: React.FocusEventHandler; onKeyUp: React.KeyboardEventHandler; } export declare type UseSelectListboxSlotProps = UseListboxRootSlotProps & UseSelectListboxSlotEventHandlers>; interface UseSelectOptionSlotEventHandlers { onClick: React.MouseEventHandler; } export declare type UseSelectOptionSlotProps = UseListboxOptionSlotProps & UseSelectOptionSlotEventHandlers>; interface UseSelectCommonResult { buttonActive: boolean; buttonFocusVisible: boolean; disabled: boolean; getButtonProps: (otherHandlers?: TOther) => UseSelectButtonSlotProps; getListboxProps: (otherHandlers?: TOther) => UseSelectListboxSlotProps; getOptionProps: (option: SelectOption, otherHandlers?: TOther) => UseSelectOptionSlotProps; getOptionState: (option: SelectOption) => OptionState; open: boolean; } export interface UseSelectSingleResult extends UseSelectCommonResult { value: TValue | null; } export interface UseSelectMultiResult extends UseSelectCommonResult { value: TValue[]; } export {};