import '../../chipper/js/initialize-globals.js';
import '../../assert/js/assert.js';
import '../../tandem/js/PhetioIDUtils.js';
import '../../globals.js';
import PhetioProperty from '../../axon/js/PhetioProperty.js';
import TReadOnlyProperty from '../../axon/js/TReadOnlyProperty.js';
import StrictOmit from '../../phet-core/js/types/StrictOmit.js';
import { Node, NodeOptions, PDOMValueType, TColor, TPaint, TrimParallelDOMOptions, WidthSizableOptions } from '../../scenery/js/imports.js';
import TSoundPlayer from '../../tambo/js/TSoundPlayer.js';
import IOType from '../../tandem/js/types/IOType.js';
import { SpeakableResolvedResponse } from '../../utterance-queue/js/ResponsePacket.js';
import ComboBoxButton from './ComboBoxButton.js';
import { ComboBoxListItemNodeOptions } from './ComboBoxListItemNode.js';
import GroupItemOptions from './GroupItemOptions.js';
declare const LIST_POSITION_VALUES: readonly ["above", "below"];
declare const ALIGN_VALUES: readonly ["left", "right", "center"];
export type ComboBoxItem<T> = {
    value: T;
    soundPlayer?: TSoundPlayer | null;
    accessibleName?: PDOMValueType | null;
    comboBoxListItemNodeOptions?: ComboBoxListItemNodeOptions;
} & GroupItemOptions;
export type ComboBoxItemNoNode<T> = StrictOmit<ComboBoxItem<T>, 'createNode'>;
export type ComboBoxListPosition = typeof LIST_POSITION_VALUES[number];
export type ComboBoxAlign = typeof ALIGN_VALUES[number];
export type ComboBoxAccessibleNamePropertyMap<T> = Map<T, TReadOnlyProperty<string | null>>;
type SelfOptions = {
    align?: ComboBoxAlign;
    listPosition?: ComboBoxListPosition;
    labelXSpacing?: number;
    disabledOpacity?: number;
    cornerRadius?: number;
    highlightFill?: TPaint;
    xMargin?: number;
    yMargin?: number;
    buttonFill?: TColor;
    buttonStroke?: TPaint;
    buttonLineWidth?: number;
    buttonTouchAreaXDilation?: number;
    buttonTouchAreaYDilation?: number;
    buttonMouseAreaXDilation?: number;
    buttonMouseAreaYDilation?: number;
    listFill?: TPaint;
    listStroke?: TPaint;
    listLineWidth?: number;
    openedSoundPlayer?: TSoundPlayer;
    closedNoChangeSoundPlayer?: TSoundPlayer;
    buttonLabelTagName?: string;
    comboBoxVoicingNameResponsePattern?: TReadOnlyProperty<string> | string;
    comboBoxVoicingContextResponse?: (() => string | null) | null;
    comboBoxVoicingHintResponse?: SpeakableResolvedResponse | null;
};
type ParentOptions = NodeOptions & WidthSizableOptions;
export type ComboBoxOptions = SelfOptions & TrimParallelDOMOptions<ParentOptions>;
declare const ComboBox_base: typeof Node & import("../../phet-core/js/types/Constructor.js").default<import("../../scenery/js/imports.js").TWidthSizable>;
export default class ComboBox<T> extends ComboBox_base {
    private readonly listPosition;
    readonly nodes: Node[];
    readonly accessibleNamePropertyMap: ComboBoxAccessibleNamePropertyMap<T>;
    button: ComboBoxButton<T>;
    private readonly listBox;
    private listParent;
    private display;
    private readonly clickToDismissListener;
    private readonly dismissWithFocusListener;
    private readonly displayOnlyProperty;
    private readonly disposeComboBox;
    /**
     * @param property - must be settable and linkable, but needs to support Property, DerivedProperty and DynamicProperty
     * @param items - items, in the order that they appear in the listbox
     * @param listParent node that will be used as the list's parent, use this to ensure that the list is in front of everything else
     * @param [providedOptions]
     */
    constructor(property: PhetioProperty<T>, items: ComboBoxItem<T>[], listParent: Node, providedOptions?: ComboBoxOptions);
    dispose(): void;
    /**
     * Shows the list box.
     */
    showListBox(): void;
    /**
     * Hides the list box.
     */
    hideListBox(): void;
    /**
     * Because the button and list box have different parents (and therefore different coordinate frames)
     * they may be scaled differently. This method scales the list box so that items on the button and in
     * the list appear to be the same size.
     */
    private scaleListBox;
    private scaleAndPositionListBox;
    /**
     * Sets the visibility of items that correspond to a value. If the selected item has this value, it's your
     * responsibility to change the Property value to something else. Otherwise, the combo box button will continue
     * to display this value.
     * @param value - the value associated with the ComboBoxItem
     * @param visible
     */
    setItemVisible(value: T, visible: boolean): void;
    /**
     * Is the item that corresponds to a value visible when the listbox is popped up?
     * @param value - the value associated with the ComboBoxItem
     */
    isItemVisible(value: T): boolean;
    static getMaxItemWidthProperty(nodes: Node[]): TReadOnlyProperty<number>;
    static getMaxItemHeightProperty(nodes: Node[]): TReadOnlyProperty<number>;
    static getAccessibleNamePropertyMap<T>(items: ComboBoxItem<T>[]): ComboBoxAccessibleNamePropertyMap<T>;
    static ComboBoxIO: IOType<any, any, any>;
}
export {};
//# sourceMappingURL=ComboBox.d.ts.map