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