import { Point } from "../../utils/misc";
import type { EventReactions, State, BaseContext } from "../../being";
import { TemplateState, TemplateStateMachine } from "../../being";
import { BoardCamera } from "../../board-camera";
/**
 * @description The states of the pan control state machine.
 *
 * @category Input Flow Control
 */
export type PanControlStates = "ACCEPTING_USER_INPUT" | "TRANSITION" | "LOCKED_ON_OBJECT";
/**
 * @description The payload for the pan by input event.
 *
 * @category Input Flow Control
 */
export type PanByInputEventPayload = {
    diff: Point;
};
/**
 * @description The payload for the pan to input event.
 *
 * @category Input Flow Control
 */
export type PanToInputEventPayload = {
    target: Point;
};
type EmptyPayload = {};
/**
 * @description The payload mapping for the events of the pan control state machine.
 *
 * @category Input Flow Control
 */
export type PanEventPayloadMapping = {
    "userPanByInput": PanByInputEventPayload;
    "userPanToInput": PanToInputEventPayload;
    "transitionPanByInput": PanByInputEventPayload;
    "transitionPanToInput": PanToInputEventPayload;
    "lockedOnObjectPanByInput": PanByInputEventPayload;
    "lockedOnObjectPanToInput": PanToInputEventPayload;
    "unlock": EmptyPayload;
    "initateTransition": EmptyPayload;
};
/**
 * @description The context for the pan control state machine.
 *
 * @category Input Flow Control
 */
export interface PanContext extends BaseContext {
    camera: BoardCamera;
    limitEntireViewPort: boolean;
    panByViewPort: (delta: Point) => void;
    panToViewPort: (target: Point) => void;
    panByWorld: (delta: Point) => void;
    panToWorld: (target: Point) => void;
}
/**
 * @description The pan control state machine.
 * It's not created directly using the TemplateStateMachine class.
 * A few helper functions are in place to make it easier to use. (user don't have to memorize the event names)
 *
 * @category Input Flow Control
 */
export declare class PanControlStateMachine extends TemplateStateMachine<PanEventPayloadMapping, PanContext, PanControlStates> {
    constructor(states: Record<PanControlStates, State<PanEventPayloadMapping, PanContext, PanControlStates>>, initialState: PanControlStates, context: PanContext);
    /**
     * @description Notify the pan input event.
     *
     * @category Input Flow Control
     */
    notifyPanInput(diff: Point): void;
    /**
     * @description Notify the pan to animation input event.
     *
     * @category Input Flow Control
     */
    notifyPanToAnimationInput(target: Point): void;
    /**
     * @description Initate the transition.
     *
     * @category Input Flow Control
     */
    initateTransition(): void;
    set limitEntireViewPort(limit: boolean);
    get limitEntireViewPort(): boolean;
}
/**
 * @description The accepting user input state of the pan control state machine.
 *
 * @category Input Flow Control
 */
export declare class AcceptingUserInputState extends TemplateState<PanEventPayloadMapping, PanContext, PanControlStates> {
    constructor();
    eventReactions: EventReactions<PanEventPayloadMapping, PanContext, PanControlStates>;
    userPanByInputHandler(context: PanContext, payload: PanByInputEventPayload): void;
    userPanToInputHandler(context: PanContext, payload: PanToInputEventPayload): void;
    lockedOnObjectPanByInputHandler(context: PanContext, payload: PanByInputEventPayload): void;
    lockedOnObjectPanToInputHandler(context: PanContext, payload: PanToInputEventPayload): void;
}
/**
 * @description The transition state of the pan control state machine.
 *
 * @category Input Flow Control
 */
export declare class TransitionState extends TemplateState<PanEventPayloadMapping, PanContext, PanControlStates> {
    constructor();
    eventReactions: EventReactions<PanEventPayloadMapping, PanContext, PanControlStates>;
    userPanByInputHandler(context: PanContext, payload: PanByInputEventPayload): PanControlStates;
    userPanToInputHandler(context: PanContext, payload: PanToInputEventPayload): PanControlStates;
    transitionPanByInputHandler(context: PanContext, payload: PanByInputEventPayload): PanControlStates;
    transitionPanToInputHandler(context: PanContext, payload: PanToInputEventPayload): PanControlStates;
    lockedOnObjectPanByInputHandler(context: PanContext, payload: PanByInputEventPayload): PanControlStates;
    lockedOnObjectPanToInputHandler(context: PanContext, payload: PanToInputEventPayload): PanControlStates;
}
/**
 * @description The locked on object state of the pan control state machine.
 *
 * @category Input Flow Control
 */
export declare class LockedOnObjectState extends TemplateState<PanEventPayloadMapping, PanContext, PanControlStates> {
    constructor();
    eventReactions: EventReactions<PanEventPayloadMapping, PanContext, PanControlStates>;
    lockedOnObjectPanByInputHandler(context: PanContext, payload: PanByInputEventPayload): void;
    lockedOnObjectPanToInputHandler(context: PanContext, payload: PanToInputEventPayload): void;
}
/**
 * @description Create the object containing the default pan control states.
 *
 * @category Input Flow Control
 */
export declare function createDefaultPanControlStates(): Record<PanControlStates, State<PanEventPayloadMapping, PanContext, PanControlStates>>;
/**
 * @description Create the default pan control state machine.
 *
 * @category Input Flow Control
 */
export declare function createDefaultPanControlStateMachine(context: PanContext): PanControlStateMachine;
export {};
