import EventEmitter from './EventEmitter.js';
import { Clock } from 'three';
import { Assets } from './Assets.js';
import { type Optional } from '../helpers/typeHelper.js';
import { type IViewer, type SpeckleView, type SunLightConfiguration, UpdateFlags, ViewerEvent, type ViewerParams, type ViewerEventPayload } from '../IViewer.js';
import { World } from './World.js';
import { WorldTree } from './tree/WorldTree.js';
import SpeckleRenderer from './SpeckleRenderer.js';
import { type PropertyInfo, PropertyManager } from './filtering/PropertyManager.js';
import type { Query, QueryArgsResultMap } from './queries/Query.js';
import { type Utils } from './Utils.js';
import { Extension } from './extensions/Extension.js';
import Input from './input/Input.js';
import { Loader } from './loaders/Loader.js';
import { type Constructor } from 'type-fest';
import Stats from './three/stats.js';
export declare class Viewer extends EventEmitter implements IViewer {
    /** Container and optional stats element */
    protected container: HTMLElement;
    protected stats: Optional<ReturnType<typeof Stats>>;
    /** Viewer params used at init time */
    protected startupParams: ViewerParams;
    /** Viewer components */
    protected tree: WorldTree;
    protected world: World;
    static readonly theAssets: Assets;
    speckleRenderer: SpeckleRenderer;
    protected propertyManager: PropertyManager;
    /** Misc members */
    protected clock: Clock;
    protected loaders: {
        [id: string]: Loader;
    };
    protected extensions: {
        [id: string]: Extension;
    };
    /** various utils/helpers */
    protected utils: Utils | undefined;
    /** Gets the World object. Currently it's used for info mostly */
    get World(): World;
    get Utils(): Utils;
    get input(): Input;
    get params(): ViewerParams;
    private getConstructorChain;
    createExtension<T extends Extension>(type: Constructor<T>): T;
    getExtension<T extends Extension>(type: Constructor<T>): T;
    hasExtension<T extends Extension>(type: Constructor<T>): boolean;
    private getExtensionInternal;
    constructor(container: HTMLElement, params?: ViewerParams);
    getContainer(): HTMLElement;
    getCanvas(): HTMLCanvasElement;
    getRenderer(): SpeckleRenderer;
    resize(): void;
    requestRender(flags?: UpdateFlags): void;
    protected frame(): void;
    protected update(): void;
    protected render(): void;
    init(): Promise<void>;
    on<T extends ViewerEvent>(eventType: T, listener: (arg: ViewerEventPayload[T]) => void): void;
    getObjectProperties(resourceURL?: string | null, bypassCache?: boolean): Promise<PropertyInfo[]>;
    getDataTree(): void;
    getWorldTree(): WorldTree;
    query<T extends Query>(query: T): QueryArgsResultMap[T['operation']] | null;
    setLightConfiguration(config: SunLightConfiguration): void;
    getViews(): SpeckleView[];
    screenshot(): Promise<string>;
    /**
     * OBJECT LOADING/UNLOADING
     */
    loadObject(loader: Loader, zoomToObject?: boolean): Promise<void>;
    cancelLoad(resource: string, unload?: boolean): Promise<void>;
    unloadObject(resource: string): Promise<void>;
    unloadAll(): Promise<void>;
    dispose(): void;
}
