export declare class KeyState {
    /** Whether the key is currently held down */
    pressed: boolean;
    /** Whether the key was first pressed this frame */
    justPressed: boolean;
    /** Whether the key was released this frame */
    justReleased: boolean;
}
export interface UseKeyboardOptions {
    /**
     * The target element to listen for keyboard events on.
     * @default window
     */
    target?: EventTarget;
    /**
     * Listen during the capture phase instead of the bubble phase. Use this
     * when keyboard input must run before descendants can stop propagation.
     * @default false
     */
    capture?: boolean;
}
type KeyboardEventType = 'keydown' | 'keyup';
type KeyboardEventHandler = (event: KeyboardEvent) => void;
export declare const useKeyboard: (optionsFn?: () => UseKeyboardOptions) => {
    /**
     * The internal task, exposed for ordering other tasks relative to
     * keyboard processing via `useTask('myTask', fn, { after: keyboard.task })`.
     */
    task: import("@threlte/core").Task;
    /**
     * Get the state of a key by its `KeyboardEvent.key` value
     * (e.g. `'w'`, `'Space'`, `'ArrowUp'`, `'Shift'`).
     * Matching is case-insensitive.
     */
    key: (key: string) => KeyState;
    /**
     * Register an event listener. Returns a cleanup function.
     *
     * ```ts
     * const off = keyboard.on('keydown', (e) => console.log(e.key))
     * // later: off()
     * ```
     */
    on: (event: KeyboardEventType, fn: KeyboardEventHandler) => () => void;
};
export type UseKeyboardReturn = ReturnType<typeof useKeyboard>;
export {};
