/**
 * The structural slice of a canvas the renderer actually depends on. A real
 * HTMLCanvasElement satisfies it; tests can pass a lightweight fake without casts.
 *
 * @typedef {Object} AvatarCanvas
 * @property {number} width
 * @property {number} height
 * @property {(contextId: '2d') => CanvasRenderingContext2D | null} getContext
 */
/**
 * Mounts the animated wireframe avatar on a 2D canvas and returns its controls.
 * The page calls setState() on each stream event and destroy() before any
 * redirect or fallback switch so the rAF loop never leaks.
 *
 * @param {Object} options
 * @param {AvatarCanvas} options.canvas
 * @param {import('./setupWizardAvatar.js').AvatarState} [options.initialState]
 * @param {(callback: FrameRequestCallback) => number} [options.requestFrame]
 * @param {(handle: number) => void} [options.cancelFrame]
 * @param {() => number} [options.now]
 * @returns {{ setState: (state: import('./setupWizardAvatar.js').AvatarState) => void; destroy: () => void }}
 */
export function mountSetupWizardAvatar(options: {
    canvas: AvatarCanvas;
    initialState?: import("./setupWizardAvatar.js").AvatarState | undefined;
    requestFrame?: ((callback: FrameRequestCallback) => number) | undefined;
    cancelFrame?: ((handle: number) => void) | undefined;
    now?: (() => number) | undefined;
}): {
    setState: (state: import("./setupWizardAvatar.js").AvatarState) => void;
    destroy: () => void;
};
/**
 * The structural slice of a canvas the renderer actually depends on. A real
 * HTMLCanvasElement satisfies it; tests can pass a lightweight fake without casts.
 */
export type AvatarCanvas = {
    width: number;
    height: number;
    getContext: (contextId: "2d") => CanvasRenderingContext2D | null;
};
//# sourceMappingURL=setupWizardAvatarRenderer.d.ts.map