import '../../../../assert/js/assert.js';
import '../../../../globals.js';
/**
 * The model of the grab drag interaction. This has the current interaction state, and the cueing state.
 * Scenery-phet internal, GrabDragInteraction should be the only one to create this.
 *
 * @author Michael Kauzmann (PhET Interactive Simulations)
 * @author Jesse Greenberg (PhET Interactive Simulations)
 * @author Sam Reid (PhET Interactive Simulations)
 */
import Emitter from '../../../../axon/js/Emitter.js';
import EnabledComponent, { EnabledComponentOptions } from '../../../../axon/js/EnabledComponent.js';
import Property from '../../../../axon/js/Property.js';
import { TReadOnlyEmitter } from '../../../../axon/js/TEmitter.js';
import { EmptySelfOptions } from '../../../../phet-core/js/optionize.js';
import GrabDragUsageTracker from './GrabDragUsageTracker.js';
export type GrabDragInteractionState = 'idle' | 'grabbed';
type SelfOptions = EmptySelfOptions;
export type GrabDragModelOptions = SelfOptions & EnabledComponentOptions;
export default class GrabDragModel extends EnabledComponent {
    readonly grabDragUsageTracker: GrabDragUsageTracker;
    readonly interactionStateProperty: Property<GrabDragInteractionState>;
    readonly resetEmitter: Emitter<[]>;
    private readonly _releasedEmitter;
    private readonly _grabbedEmitter;
    constructor(grabDragUsageTracker?: GrabDragUsageTracker, providedOptions?: GrabDragModelOptions);
    get grabbedEmitter(): TReadOnlyEmitter;
    get releasedEmitter(): TReadOnlyEmitter;
    /**
     * Grab with keyboard usage tracking
     */
    keyboardGrab(onBeforeEmit?: VoidFunction): void;
    /**
     * Turn from idle into grabbed interaction state.
     * This updates accessibility representation in the PDOM and changes input listeners. This function can be called
     * while already grabbed, because of nuance in how we support multi-input and gestureDescription.
     */
    grab(onBeforeEmit?: VoidFunction): void;
    /**
     * Release from being grabbed. This function will set the interaction back to the "idle" state and should only be called
     * when in "grabbed" state. It also behaves as though it was released from user input, for example sound effect
     * and description will occur may occur.
     */
    release(): void;
    dispose(): void;
    reset(): void;
}
export {};
//# sourceMappingURL=GrabDragModel.d.ts.map