import '../../chipper/js/browser/initialize-globals.js';
import '../../assert/js/assert.js';
import '../../globals.js';
import PhetioProperty from '../../axon/js/PhetioProperty.js';
import Property from '../../axon/js/Property.js';
import TReadOnlyProperty from '../../axon/js/TReadOnlyProperty.js';
import Range from '../../dot/js/Range.js';
import StrictOmit from '../../phet-core/js/types/StrictOmit.js';
import { Font, HBox, Node, NodeOptions, RemoveParallelDOMOptions, TextOptions, TrimParallelDOMOptions } from '../../scenery/js/imports.js';
import ArrowButton, { ArrowButtonOptions } from '../../sun/js/buttons/ArrowButton.js';
import HSlider from '../../sun/js/HSlider.js';
import Slider, { SliderOptions } from '../../sun/js/Slider.js';
import ValueChangeSoundPlayer, { ValueChangeSoundPlayerOptions } from '../../tambo/js/sound-generators/ValueChangeSoundPlayer.js';
import IOType from '../../tandem/js/types/IOType.js';
import NumberDisplay, { NumberDisplayOptions } from './NumberDisplay.js';
export type LayoutFunction = (titleNode: Node, numberDisplay: NumberDisplay, slider: Slider, decrementButton: ArrowButton | null, incrementButton: ArrowButton | null) => Node;
type NumberControlMajorTick = {
    value: number;
    label?: Node;
};
export type NumberControlSliderOptions = StrictOmit<RemoveParallelDOMOptions<SliderOptions>, 'enabledRangeProperty'> & {
    majorTicks?: NumberControlMajorTick[];
    minorTickSpacing?: number;
};
type WithMinMaxSelfOptions = {
    tickLabelFont?: Font;
};
export type WithMinMaxOptions = NumberControlOptions & WithMinMaxSelfOptions;
export type NumberControlLayoutFunction1Options = {
    align?: 'center' | 'left' | 'right';
    titleXSpacing?: number;
    arrowButtonsXSpacing?: number;
    ySpacing?: number;
};
export type NumberControlLayoutFunction2Options = {
    align?: 'center' | 'left' | 'right';
    xSpacing?: number;
    ySpacing?: number;
};
export type NumberControlLayoutFunction3Options = {
    alignTitle?: 'center' | 'left' | 'right';
    alignNumber?: 'center' | 'left' | 'right';
    titleLeftIndent?: number;
    xSpacing?: number;
    ySpacing?: number;
};
export type NumberControlLayoutFunction4Options = {
    sliderPadding?: number;
    verticalSpacing?: number;
    arrowButtonSpacing?: number;
    numberDisplayParentNodeOptions?: StrictOmit<NodeOptions, 'children'>;
    createBottomContent?: ((box: HBox) => Node) | null;
    layoutInvisibleButtons?: boolean;
};
type SelfOptions = {
    startCallback?: () => void;
    endCallback?: () => void;
    delta?: number;
    disabledOpacity?: number;
    includeArrowButtons?: boolean;
    numberDisplayOptions?: NumberDisplayOptions;
    sliderOptions?: NumberControlSliderOptions;
    arrowButtonOptions?: StrictOmit<ArrowButtonOptions, 'fireOnDown'> & {
        enabledEpsilon?: number;
        leftStart?: () => void;
        leftEnd?: (over: boolean) => void;
        rightStart?: () => void;
        rightEnd?: (over: boolean) => void;
    };
    titleNodeOptions?: TextOptions;
    enabledRangeProperty?: SliderOptions['enabledRangeProperty'];
    soundGenerator?: ValueChangeSoundPlayer | null;
    valueChangeSoundGeneratorOptions?: ValueChangeSoundPlayerOptions;
    layoutFunction?: LayoutFunction;
};
export type NumberControlOptions = SelfOptions & StrictOmit<TrimParallelDOMOptions<NodeOptions>, 'children'>;
declare const NumberControl_base: typeof Node & import("../../phet-core/js/types/Constructor.js").default<import("../../scenery/js/imports.js").TWidthSizable>;
export default class NumberControl extends NumberControl_base {
    readonly slider: HSlider;
    private readonly thumbFillProperty?;
    private readonly numberDisplay;
    private readonly disposeNumberControl;
    constructor(title: string | TReadOnlyProperty<string>, numberProperty: PhetioProperty<number>, numberRange: Range, providedOptions?: NumberControlOptions);
    dispose(): void;
    /**
     * Creates a NumberControl with default tick marks for min and max values.
     */
    static withMinMaxTicks(label: string, property: Property<number>, range: Range, providedOptions?: WithMinMaxOptions): NumberControl;
    /**
     * Creates one of the pre-defined layout functions that can be used for options.layoutFunction.
     * Arranges subcomponents like this:
     *
     *  title number
     *  < ------|------ >
     *
     */
    static createLayoutFunction1(providedOptions?: NumberControlLayoutFunction1Options): LayoutFunction;
    /**
     * Creates one of the pre-defined layout functions that can be used for options.layoutFunction.
     * Arranges subcomponents like this:
     *
     *  title < number >
     *  ------|------
     */
    static createLayoutFunction2(providedOptions?: NumberControlLayoutFunction2Options): LayoutFunction;
    /**
     * Creates one of the pre-defined layout functions that can be used for options.layoutFunction.
     * Arranges subcomponents like this:
     *
     *  title
     *  < number >
     *  -------|-------
     */
    static createLayoutFunction3(providedOptions?: NumberControlLayoutFunction3Options): LayoutFunction;
    /**
     * Creates one of the pre-defined layout functions that can be used for options.layoutFunction.
     * Like createLayoutFunction1, but the title and value go all the way to the edges.
     */
    static createLayoutFunction4(providedOptions?: NumberControlLayoutFunction4Options): LayoutFunction;
    static readonly NumberControlIO: IOType<any, any, any>;
    static readonly SLIDER_TANDEM_NAME: "slider";
}
export {};
//# sourceMappingURL=NumberControl.d.ts.map