import type { Ray } from "@aura3d/math";
import type { SceneNode } from "@aura3d/scene";
import type { InputSnapshot } from "./InputSnapshot";
type Tuple3 = readonly [number, number, number];
export interface InteractionBounds {
    readonly min: Tuple3;
    readonly max: Tuple3;
}
export interface InteractionTarget {
    readonly id: string;
    readonly node?: SceneNode;
    readonly bounds: InteractionBounds;
}
export interface InteractionHit {
    readonly target: InteractionTarget;
    readonly distance: number;
}
export type InteractionEventType = "hover-enter" | "hover-exit" | "pointer-down" | "drag-start" | "drag" | "drag-end" | "click";
export interface InteractionEvent {
    readonly type: InteractionEventType;
    readonly hit?: InteractionHit;
    readonly target?: InteractionTarget;
    readonly snapshot: InputSnapshot;
}
export type InteractionListener = (event: InteractionEvent) => void;
export type InteractionRayProvider = (snapshot: InputSnapshot) => Ray;
export type InteractionTargetProvider = () => readonly InteractionTarget[];
export declare class InteractionSystem {
    private readonly rayProvider;
    private readonly targetProvider;
    private readonly listeners;
    private hovered?;
    private pressed?;
    private dragging;
    constructor(rayProvider: InteractionRayProvider, targetProvider: InteractionTargetProvider);
    subscribe(listener: InteractionListener): () => void;
    update(snapshot: InputSnapshot): InteractionHit | undefined;
    pick(ray: Ray): InteractionHit | undefined;
    private emit;
}
export {};
//# sourceMappingURL=InteractionSystem.d.ts.map